C语言实现三子棋首先要创建一个3*3的二维数组.
其中有4个函数
首先是初始化函数,将数组里的每个元素都初始化为一个空格
其次是玩家输入函数,玩家先输入一个坐标,并判断此坐标是否为空格,如果是空格,则表示此坐标里没有棋子,则将这个元素落子为'x',如果此坐标不是空格,则有棋子,由玩家重新输入,直到输入的坐标没有棋子为止.
还有电脑输入函数,利用时间戳%2得到2个0-2之间的随机数,即为此次随机的坐标,在判断此坐标是否有棋子,没有的话落子为'o'.
还有判断是否游戏结束的函数,有4种判断方式,一种是一行里都是'x'或'o',或者一列里都是'x'或'o',或者一个对角线里都是'x'或'o',或者3*3的二维数组里没有空格了,即为游戏结束.前三种判断方式是有胜者的,返回这一行或这一列或这一个对角线的任意一个元素即可,如果是第四种判断方式,那么就返回's'.如果没有结束游戏,则返回空格.
在主函数里,先char 胜者为空格,再进行循环,循环体里写玩家输入和电脑输入,每次输入之后都要将游戏判断函数的返回值赋给胜者,再判断游戏是否结束.
如果结束了,在判断胜者是否为'x',是的话输出玩家胜利,在判断胜者是否为'o',是的话电脑胜利,否则就是和棋.
代码如下:
#include#include #include #include // 棋盘的长 #define max_row 3 // 棋盘的宽 #define max_col 3 // 初始化棋盘,棋盘里元素全部赋空格 void init(char board[max_row][max_col]) { for (int row = 0; row < max_row; row++) { for (int col = 0; col < max_col; col++) { board[row][col] = ' '; } } srand((unsigned int)time(0)); } // 打印棋盘 void printboard(char board[max_row][max_col]){ system("cls"); for (int row = 0; row < max_row; row++) { printf("+---+---+---+"); printf("n"); for (int col = 0; col < max_col; col++) { printf("| %c ", board[row][col]); } printf("|"); printf("n"); } printf("+---+---+---+"); printf("n"); } //判断棋盘是否已满 int full(char board[max_row][max_col]) { for (int row = 0; row < max_row; row++) { for (int col = 0; col < max_col; col++) { //判断棋盘里是否存在空格,若存在则返回0 if (board[row][col] == ' ') { return 0; } } } return 1; } //玩家落子 void player(char board[max_row][max_col]) { printf("请玩家落子:n"); while (1) { //玩家输入落子的坐标 int row, col = 0; scanf("%d %d", &row, &col); //判断坐标是否在3*3的方格中 if (row < 0 || col < 0 || row >= max_row || col >= max_col) { printf("输入错误,请重新落子!n"); continue; } //判断落子位置是否为' ',若是则结束本次循环,重新赋值 if (board[row][col] != ' ') { printf("你落得位置已经有子了,请重新落子!n"); continue; } //玩家落子,落子赋为x board[row][col] = 'x'; break; } } //电脑落子 void computer(char board[max_row][max_col]) { printf("请电脑落子:n"); while (1) { //电脑落子在0-2的随机数坐标中 int row = rand() % max_row; int col = rand() % max_col; //如果不为空,则有子,结束本次循环,再随机一次 if (board[row][col] != ' ') { continue; } //电脑落子,落子赋为o board[row][col] = 'o'; break; } } //判断是否已出现胜者 char checkwinner(char board[max_row][max_col]) { //判断所有的行 for (int row = 0; row < max_row; row++) { if (board[row][0] != ' ' && board[row][0] == board[row][1] && board[row][0] == board[row][2]) { return board[row][0]; } } //判断所有的列 for (int col = 0; col < max_col; col++) { if (board[0][col]!=' ' && board[0][col] == board[1][col] && board[0][col] == board[2][col]) { return board[0][col]; } } //判断对角线 if (board[0][0]!=' ' && board[0][0] == board[1][1] && board[0][0] == board[2][2]) { return board[0][0]; } if (board[0][2]!=' ' && board[0][2] == board[1][1] && board[0][2] == board[2][0]) { return board[0][2]; } //判断棋盘是否已满 if(full(board)){ return 's'; } return ' '; } int main(){ char board[max_row][max_col] = { 0 }; init(board); char winner=' '; while (1) { printboard(board); player(board); winner = checkwinner(board); printboard(board); if (winner != ' ') { break; } computer(board); printboard(board); winner = checkwinner(board); if (winner != ' ') { break; } } if (winner == 'x') { printf("恭喜你,你赢了!"); } else if (winner == 'o') { printf("你输了!"); } else{ printf("和棋了!"); } return 0; }



