棋盘如下:
代码思想:
井字棋的棋盘实则就是一个九宫格,我们可以用一个三行三列的二维数组来实现。玩家执 ” x “落子,电脑执 ” o “落子,玩家输入对应格的行列号来落子,电脑通过生成行列号的随机数来落子,每下一次,棋盘更新一次,率先到达三子连线方获胜,棋盘下满则为平局。
函数构建
把棋盘各格初始位置设置成 ’ ‘ (空格)
//给棋盘各个位置赋‘ ’ 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] = ' '; } } }
打印棋盘,用横线和竖线构建一个简易的棋盘,玩家和电脑每次落子之后,先清屏再打印落子后的棋盘
//打印棋盘 void printboard(char board[MAX_ROW][MAX_COL]) { system("cls");//每次打印之前先清屏,把上次的结果清除掉 for (int row = 0; row < MAX_ROW; row++) { printf("+---+---+---+\n"); for (int col = 0; col < MAX_COL; col++) { printf("| %c ", board[row][col]); } printf("|"); printf("\n"); } printf("+---+---+---+\n"); }
玩家落子,玩家输入对应格的行列号进行落子,并且判断玩家的输入是否合法,若不合法提醒玩家重新落子,玩家成功落子之后,对应格写入 ’ x ‘ 。
//玩家落子 void player(char board[MAX_ROW][MAX_COL]) { printf("玩家落子!!\n"); while (1) { printf("请输入落子位置的坐标(row col):"); int row = 0; int col = 0; scanf("%d %d", &row, &col); if (row < 0 || row >= MAX_ROW || col < 0 || col >= MAX_COL) { printf("您输入的坐标有误!!请重新输入\n"); continue;//输入有误,循环重新开始 } if (board[row][col] != ' ') { printf("此位置已经有子,不能落子!!\n"); continue;//此处有子,不能输入,循环重新开始 } board[row][col] = 'x'; break;//玩家落子,此处赋为‘x’,循环结束 } }
电脑落子,电脑落子通过随机数生成随机格的行列号进行落子,同样,电脑落子之前也要判断随机格的行列号是否合法,若不合法,重新生成随机数,电脑落子成功之后,对应格写入 ’ o ‘ 。
需要注意的是,随机数的生成需要在函数之前生成随机数种,我在后面主函数会写上
//电脑落子 void computer(char board[MAX_ROW][MAX_COL]) { while (1) { int row = rand() % MAX_ROW; int col = rand() % MAX_COL;//生成行和列的随机数 if (board[row][col] != ' ') { continue; } board[row][col] = 'o'; break; } }
检测棋盘是否满,循环访问二维数组的每个元素,二维数组中找不到空格了,说明棋盘已满
int Isfull(char board[MAX_ROW][MAX_COL]) { //找不到空格了,说明满了 //满了返回1,没满返回0 for (int row = 0; row < MAX_ROW; row++) { for (int col = 0; col < MAX_COL; col++) { if (board[row][col] == ' ') { //没满 return 0; } } } return 1; }
判断棋局是否结束,有任何一行或列或对角线上的元素相同或者棋盘已满,则棋局结束
//玩家获胜返回'x',电脑获胜返回'o',胜负未分返回‘ ’,棋盘满了返回q char cheak(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][2] == board[row][0]) { 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[2][2] == board[0][0]) { return board[0][0]; } if (board[0][2] != ' ' && board[0][2] == board[1][1] && board[2][0] == board[0][2]) { return board[0][2]; } //检测棋盘满没满 if (Isfull(board)) { return 'q'; } else { return ' '; } }
主函数将各个函数串联起来,最后再判断棋局结果
#include<stdio.h> #include<stdlib.h> #include<time.h> #define MAX_ROW 3 #define MAX_COL 3 int main() { //创建棋盘,初始化为全0 char board[MAX_ROW][MAX_COL] = { 0 }; //使用Init函数将棋盘初始位置改为' ' Init(board); //生成随机种子,程序开始前设置即可 srand((unsigned int)time(0)); char winner = ' '; while (1) { //打印棋盘 printboard(board); //玩家落子 player(board); //电脑落子 computer(board); //判断胜负 winner = cheak(board); if (winner != ' ') { //胜负已分,循环结束 break; } } if (winner == 'x') { printf("恭喜你赢了!!\n"); } else if(winner=='o') { printf("你真菜!!\n"); } else { printf("你和人工智障五五开\n"); } system("pause"); return 0; }
代码运行结果