今天我们来写一个三子棋小游戏,类似于之前的扫雷游戏,都是对于二维数组学习印象的加深。先我们还是和之前一样,创建一个新的项目,在这个项目中,test.c是游戏的逻辑运算,game.c是游戏的底层逻辑,game.h是声明游戏的头文件以及函数。
首先我们创建test.c。在test中我们先要进入switch语句中进行我们游戏的选择,打印出菜单栏,供我们进行选择。
游戏开始
初始化
在三子棋游戏的时候,我么首先要创建一个二维数组,这个是用来寄存我们所下棋的位置,我们创建为Board,在创建数组之后,我们需要进行对数组进行初始化,将其里面所有的 元素全都初始化为‘ ’(空格),但是为了使我们能更好的看到我们数组的每个元素的位置,我们需要打印出来一个棋盘,在棋盘中的正确位置存放我们的二维数组,并对其进行初始化。 ?
void initBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
打印棋盘
在对其进行初始化之后,我们便需要对其进行打印棋盘
在打印棋盘的时候我们需要对棋盘进行打印的同时插入我们的二位数组,在其中我么使用 %c 的方式进行打印棋盘中一个格子中所给我们展示的东西,直径用 | 分割开来,并且每行格子之间用---|---|---来进行分割,使我们的棋盘看起来更加的完美。在这里需要注意,因为我们并不是在最后一行和最后一列要打印 | 和 --- 的,所以我们在进行循环的时候我们需要进行判断,因此 i , j ,要小于row-1 ,col-1。
void DidplayBoard(char board[ROW][COL], int row, int col)
{
for (int i = 0; i < row; i++)
{
for (int j = 0; j < col; j++)
{
printf(" %c ", board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
if (i < row - 1)
{
for (int j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
}
}
}
玩家下棋
在玩家下棋的时候比较简单,我们创建两个整型变量来接受我们二维数组的坐标,当我们输入坐标后,首先我们要判断坐标的合法性,因为二维数组的下标是由0开始的,因此我们所输入的坐标要进行-1才能到我们实际的board数组中的合适位置上,当我们在输入合法坐标时候,还要判断坐标是否被占用,当坐标被占用时候我们这个位置就不能下入棋子,因此我们玩家下棋的时候放入一个while循环,这个循环为一个死循环,当我们输入一个合法且不被占用的坐标时候,我们才会下入棋子break跳出循环。
void Player_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("玩家下棋:>\n");
printf("请输入坐标:>\n");
scanf_s("%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");
printf("请重新输入\n");
}
}
else
{
printf("非法坐标,请重新输入\n");
}
}
}
电脑下棋
在电脑下棋时候我们首先要创建随机数,我们对随机数进行取模3,所得的坐标一定是合法的,因此我们在这里并不需要判断坐标的合法性,只需要判断坐标是否被占用,如玩家下棋一样,也是一个死while循环,只有当在board数组中放入元素时候我们break跳出循环。
void computer_move(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("电脑下棋\n");
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
判断输赢
在判断输赢时候,只有三种情况
1、三行的元素都相同
2、三列的元素都相同
3、对角线的元素都相同
我们在判断游戏输赢的时候,
玩家赢 返回————'*' 电脑赢 返回————'#' 平局 返回—————'Q' 继续 返回—————'C'
static 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;//满了
}
//判断输赢
char Is_Win(char board[ROW][COL], int row, int col)
{
//判断行
for (int i = 0; i < row; i++)
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')
{
return board[i][1];
}
}
//判断列
for (int j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[2][j] != ' ')
{
return board[0][j];
}
}
//判断对角线
if (board[0][0] == board[1][1] && board[1][1] == board[2][2] && board[1][1] != ' ')
{
return board[1][1];
}
if (board[0][2] == board[1][1] && board[1][1] == board[2][0] && board[1][1] != ' ')
{
return board[1][1];
}
//判断平局
if (is_full(board, row, col) == 1)
{
return 'Q';
}
//继续
return 'C';
}
以上就是三子棋游戏的所有游戏逻辑,具体代码C++: C语言学习代码 - Gitee.com
|