序言:
想成为大师的康康最近想玩游戏,于是用c语言代码敲了个三子棋供自己娱乐消遣。虽在创作的过程中遇到了许多细节上的问题导致运行并没有那么成功,但康康意志坚定,鏖战了几小时终于创作成功!接下来是康康的心得体会,满满的干货喔~~~ 话不多说进入正题,教会大家如何用c语言代码实现三子棋游戏。
在实现目标之前,先思考我们写代码的目的是什么,再思考如何去实现它。我们需要实现的是一款游戏,所以菜单一定要有!!!让玩家选择是玩游戏还是退出游戏,整体构架先设计出来。
void menu()
{
printf("*********************\n");
printf("*******1.play********\n");
printf("*******0.exit********\n");
printf("*********************\n");
}
int main()
{
int input = 0;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请选择:\n");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误请重新选择\n");
}
} while (input);
return 0;
}
运用swtich语句为用户提供选择,如果用户这时输入1,这时自动会进入game(). 如果用户输入0,由于这是个do while 循环语句,这时会跳出循环语句。接下来我们就来实现game()函数。
创作三子棋的过程如下:.创作一个棋盘——> 初始化棋盘——> 打印棋盘 ——>人机交替下棋——>判断输赢。过程梳理好并清楚的知道实现的步骤就成功了一半!
整理好思路,我们就需要进行代码的实现,在实现的过程中需要用一定的逻辑思维判断处理三子棋中一些复杂的问题,不过不着急我为大家细分开来为大家娓娓道来。
我们需要的是一个3*3大小的棋盘,它其实就是一个二维数组加工得来,首先先确定行列的大小。
#define ROW 3
#define COL 3
char board[ROW][COL] = { 0 };
以上是我们棋盘的本质,接下来进行棋盘的初始化,需创建一个InitBoard函数来进行。
void InitBoard(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] = ' ';
}
}
}
将棋盘初始化成空格的目的是为了在接下来打印棋盘的时候能够很好的对齐,展现出一个方方正正的棋盘。接下来我们利用PrintBoard函数来进行棋盘的打印。
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");
}
}
}
一下是代码实现以后的效果图:
代码中row-1和col-1目的是去除棋盘中多余的竖线和分割线,由图可知最下面没有分割线,所以我们需要用row-1来限制行数的打印;在最右侧没有竖线,所以我们用col-1来限制列数的打印。
棋盘打印好了之后就需要人和机器交互下棋,所以先创建PlayerMove函数和ComputerMove函数分别表示玩家和机器,由于要不停的下,用while循环代码如下:
while (1)
{
PlayerMove(board,ROW,COL);
DisplayBoard(board, ROW, COL);
ComputerMove(board, ROW, COL);
DisplayBoard(board, ROW, COL);
}
函数创建好了之后我们进行函数的实现:
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
while (1)
{
printf("请玩家输入坐标\n");
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");
}
}
}
void ComputerMove(char board[ROW][COL], int row, int col)
{
printf("电脑下棋\n");
int x = 0;
int y = 0;
while (1)
{
x = rand() % row;
y = rand() % col;
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
电脑下棋的时候由于位置是随机的所以我们需要用rand函数来随机它下棋的坐标。康康在这个地方栽了个跟头,他在while循换外进行了rand函数的调用,导致代码运行过程中机器会在第三次下棋的时候停止下棋,所以一定要在while循环中使用rand函数!
下棋不是你输就是我赢,所以我们要在下棋的过程中需要判断输赢,使用CheckWin函数判断:
while (1)
{
//玩家赢 '*'
//电脑赢 '#'
//平局 'a'
//继续 'c'
PlayerMove(board,ROW,COL);
ret=CheckWin(board, ROW, COL);
if (ret != 'c')
{
break;
}
DisplayBoard(board, ROW, COL);
ComputerMove(board, ROW, COL);
ret=CheckWin(board, ROW, COL);
if (ret != 'c')
{
break;
}
DisplayBoard(board, ROW, COL);
}
if (ret == '*')
{
printf("玩家赢\n");
}
else if (ret =='#')
{
printf("电脑赢\n");
}
else if (ret == 'a')
{
printf("双方平局\n");
}
DisplayBoard(board, ROW, COL);
}
int IsFull(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;
}
char CheckWin(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];
}
}
//列相同
int j = 0;
for (j = 0; j < col; j++)
{
if (board[0][j] == board[1][j] && board[1][j] == board[2][j] && board[0][j] != ' ')
{
return board[0][j];
}
}
//对角线相同
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[2][0] != ' ')
{
return board[0][2];
}
if (IsFull == 1)
{
return 'a';
}
return 'c';
}
判断分为:玩家赢,电脑赢,平局和游戏继续。当判断要求不满足前面三个任何一个时,游戏继续while循环也不停下,知道出现前面三个情况的任何一种,游戏便结束。我们将CheckWin的返回值用char ret来存储。先预算好4个判断的结果用什么ret值来返回!!!玩家和电脑赢的情况都是行或列或对角线的元素一样。平局就是没有空余地方给我们下棋了,这时再用一个IsFull判断。
到目前为止代码就写完了,让我们运行起来看看成果吧!