游戏规则
在3x3的棋盘上,玩家与电脑进行下棋,当有任意一方,先实现某一行或列都是自己所落的棋子,或者说在对角线上出现都是自己所落的棋子时,则表示该方获胜。
基本流程
- 首先在菜单界面选择1 或 0,即,开始或退出游戏
- 若选择开始游戏,则创建棋盘并初始化
- 在人机交互下棋的过程中,玩家先落子(输入棋盘上的相应坐标,用 '* '表示)
- 判定输赢关系(有四种情况:玩家赢,电脑赢,平局,继续下棋)
- 电脑落子(采用随机位置落子的方式,用’#’ 表示)
- 判定输赢关系(有四种情况:玩家赢,电脑赢,平局,继续下棋)
代码实现
1)菜单显示
void menu(){
printf("#######三子棋游戏########\n");
printf("########1. play #######\n");
printf("########0. exit #######\n");
printf("#######################\n");
}
2)初始化棋盘
在3x3的棋盘上,把每一个坐标位置初始化为空
void InitBoard(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++){
board[i][j] = ' ';
}
}
}
3)显示棋盘
为了尽可能的是棋盘显示的美观,我们把棋盘设计成如下形式:

void DisplayBoard(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){
for (j = 0; j < col; j++){
printf("---");
if (j < col - 1)
printf("|");
}
printf("\n");
}
}
}
4)玩家下棋
玩家在棋盘上的空格处进行下棋,玩家根据输入的坐标来确定其落子处,首先要保证输入坐标的合法性,其次要保证落子处没有被其他棋子所占。
void PlayerMove(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<0 || x - 1 > 2 || y - 1<0 || y - 1 > 2){
printf("坐标输入不合法,请重新输入!\n");
}
else if (board[x - 1][y - 1] != ' '){
printf("坐标已被占用,请重新输入!\n");
}
else{
board[x - 1][y - 1] = '*';
break;
}
}
}
5)电脑下棋
电脑在棋盘上的空格处进行下棋,电脑随机生成坐标的位置来确定其落子处,要保证落子处没有被其他棋子所占。
void ComputerMove(char board[ROW][COL], int row, int col){
printf("电脑下棋->\n");
while (1){
int x = rand() % 3;
int y = rand() % 3; //保证坐标的合法性
if (board[x][y] == ' '){
board[x][y] = '#';
break;
}
}
}
6)判断输赢
当该函数返回‘*’号时,表示玩家赢;当该函数返回‘#’号时,表示电脑赢;当该函数返回‘Q’号时,表示平局;当该函数返回‘C’号时,表示继续下棋过程。
char is_win(char board[ROW][COL], int row, int col){
//赢的情况:1.某一行或一列相等(三个元素两两相等且不为空)
//2. 对角线元素相等,然后返回相等的元素
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];
else if (board[0][2] == board[1][1] && board[1][1] == board[2][0]
&& board[0][2] != ' ')
return board[0][2];
//否则,要么平局,要么继续下棋
else if (is_full(board, row, col))
return 'Q';
else
return 'C';
}
// 判断棋盘是否是满的
int is_full(char board[ROW][COL], int row, int col){
for (int i = 0; i < row; i++){
for (int j = 0; j < col; j++){
if (board[i][j] == ' ')
return 0;
}
}
return 1;
}
游戏效果显示
1)玩家赢

2)电脑赢

3)平局

本文介绍了一个3x3三子棋游戏的代码实现,包括游戏菜单显示、棋盘初始化、棋盘显示、玩家和电脑下棋、输赢判断等功能。玩家和电脑轮流落子,当某一方在行、列或对角线上形成连续三个棋子时获胜。此外,还提供了判断输赢的详细逻辑。
349

被折叠的 条评论
为什么被折叠?



