3.玩家下棋
三点基本要求
- 接收玩家所输入的地址位置(我们所判断的数组元素应该是玩家输入值-1)
- 判断玩家所输入的地址所在是否已有落子
- 将玩家的棋子落入对应位置
printf(" %c | %c | %c \n", board[i][0], board[i][1], board[i][2]);
这样写会把棋盘写死
还有就是不方便扩展棋盘,假设变成5x5的棋盘修改量巨大
测试和头文件部分:
player_move(board, ROW, COL); void player_move(char board[ROW][COL], int row,int col);
代码实现:
void player_move(char board[ROW][COL], int row, int col) { printf("玩家下棋\n"); while (1) { printf("请输入要下棋的坐标:>"); int x = 0, y = 0; 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"); } } }
运行结果:
4.电脑下棋
随机生存坐标,只要坐标没被占用,就下棋
srand()函数只用调用一次即可
int x = rand() % row;
int y = rand() % col;
rand()函数生成的自然数是0-32767之间的数,若rand()%10那么就是0-9之间的数
也需要判断电脑所下的地址是否被占用,以及将棋子落下,这点和玩家所需的要求一致。
测试和头文件部分:
computer_move(board,ROW,COL); void computer_move(char board[ROW][COL], int row, int col);
代码实现:
void computer_move(char board[ROW][COL], int row, int col) { printf("电脑下棋:\n"); while (1)//反复下 { int x = rand() % row;//0-2范围 int y = rand() % col; if (board[x][y] == ' ') { board[x][y] = '#'; break; } } }
运行结果:
5.判断棋盘满的条件
使用is_full()函数来实现这一功能。
在这一函数中,需要实现以下几个逻辑:
判断游戏结束的四种状态:
玩家赢 -- 返回'*'
电脑赢 -- 返回'#'
平局 -- 返回'Q'
游戏继续 -- 返回'C'
前面的ret是用于返回的一个值,若ret != 'C' ,则游戏继续 ,用char ret = 0定义,
static int is_full(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] == ' ') return 0; } } return 1; }
判断平局条件
is_full这个函数只是为了支持is_win函数的,只是在is_win函数内部使用,没必要在头文件中声明
运行结果:
游戏继续
6.判断胜利条件
实现判断胜利的函数是is_win(), 前面玩家和电脑赢的为啥会返回一个'*'和'#', 以下举例解释:
其实就是3种情况,就是判断行、列和对角线
测试和头文件部分:
char board[ROW][COL]; char ret = 0; ret = is_win(board, ROW, COL);
代码实现:
char is_win(char board[ROW][COL], int row, int col) { int i = 0; //判断三行 for (i = 0; i < row; i++) { if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][0]!=' ') { return board[i][0]; } } //判断三列 for (i = 0; i < col; i++) { if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[0][i] != ' ') return board[0][i]; } //对角线 if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[0][0] != ' ') { return board[0][0]; } if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[0][2] != ' ') { return board[2][0]; } //平局 if (is_full(board, row, col) == 1) { return 'Q'; } //继续 //没有玩家或者电脑赢,也没有平局,游戏继续 return 'C'; }
玩家胜利条件: