// 初始化棋盘 voidInitBoard(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { board[i][j] = ' '; } } }
voidDisplayBoard(char board[ROW][COL], int row, int col) { int i = 0; for (i = 0; i < row; i++) { int j = 0; for (j = 0; j < col; j++) { printf(" %c ", board[i][j]); if (j < col - 1) printf("|"); } printf("\n"); if (i < row - 1) { int j = 0; for (j = 0; j < col; j++) { printf("---"); if (j < col - 1) printf("|"); } printf("\n"); } } }
函数通过两层嵌套的 for 循环遍历棋盘的每一个格子。外层循环遍历每一行,内层循环遍历每一行中的每一个格子。
// 玩家下棋 voidPlayerMove(char board[ROW][COL], int row, int col) { int x = 0; int y = 0; printf("玩家走:>\n"); while (1) { printf("请输入下棋的坐标:>"); scanf("%d %d", &x, &y); // 判断坐标合法性 if (x >= 1 && x <= row && y >= 1 && y <= col) { // 判断坐标是否被占用 if (board[x - 1][y - 1] == ' ') { board[x - 1][y - 1] = '*'; break; } else { printf("坐标被占用,请重新输入\n"); } } else { printf("坐标非法,请重新输入\n"); } } }
接下来写电脑走的逻辑,首先定义void ComputerMove(char board[ROW][COL], int row, int col); 函数,用于电脑走。我们让电脑随机走,所以定义两个变量xy
1 2 3 4 5 6 7 8 9
// main.c srand((unsignedint)time(NULL)); //game.h #include<stdlib.h> #include<time.h> // game.c printf("电脑走:>\n"); int x = rand() % row; int y = rand() % col;
让rand函数生成的随机数%模上row和col他的范围就是0~2,不需要再判断坐标的合法性。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
// 电脑下棋 voidComputerMove(char board[ROW][COL], int row, int col) { printf("电脑走:>\n"); while (1) { int x = rand() % row; int y = rand() % col; if (board[x][y] = ' ') { board[x][y] = '#'; break; } } }
// 判断棋盘是否填满 intIsFull(char board[ROW][COL], int row, int col) { int i = 0; int j = 0; for (i = 0; i < row; i++) { for (j = 0; j < col; j++) { if (board[i][j] == ' ') { return0; } } } return1; }