发布时间:2022-08-19 11:52
目录
1.文件的创建
2.用户选择界面的实现
1.菜单创建
2.用户输入选择
2.棋盘格的建立
3.打印棋盘格
4.开始下棋
4.1.玩家下棋
4.2电脑下棋
4.3输赢条件判断
4.4结果输出
创建俩个源文件,一个头文件
game.h存放游戏内容所引用到的自定义函数
game.c存放游戏部分内容
test.c 存放调试部分内容
#include
void menu()
{
printf("******************\n");
printf("*****1.play*******\n");
printf("*****0.exit*******\n");
printf("******************\n");
}
int main()
{
menu();
return 0;
}
int main()
{
menu();
printf("请用户进行选择:");
int x;
do {
scanf("%d", &x);
switch (x)
{
case 1:
printf("进入游戏");
game();
break;
case 0:
printf("退出游戏");
break;
default:
printf("请重新输入");
break;
}
} while (x);
return 0;
}
此处建立一个9宫格棋盘,所以要用到3x3的二维数组。
棋盘长这样
先在game.h头文件里面定义一下,棋盘的横行和纵列,声明创建棋盘格函数Itnboard
这里的ROW表示横行 ,COL表示纵列。
创建二维数组,并对二维数组传参,将棋盘格传入Itnboard函数,此函数为创建棋盘格
在test.c引用game.h的头文件
接下来便是编辑创建棋盘格的函数,这里我们在前面所创建的game.c文件编辑,test.c文件用于测试,分开写比较好,不然代码多而乱。
#include"game.h"
void Itnboard(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ' ';
}
}
}
现在game.c里面引用game.h的头文件,再把Itnboard函数进行传参,返回值为空。
这里先遍历二维数组,让每个值都为空格。
因为最先要创建一个空棋盘所以,这里得用空格,遍历完之后就是棋盘格的打印了即大家看到的这些条条框框,我们要打印出来
打印之前先说一下我们的思路
为了更清晰,我把空隙做大一些,下面这些——单独做一行,及所谓的分隔符
先定义一个打印棋盘的函数,名字随便取,自己能理解来就好我用的是Printboard,
在game.h定义此函数,返回值为空,再在test.c引用此函数,在game.c编辑此函数
接下来编辑打印棋盘的函数
如何编辑?先说想法
第一行打印为 空格board[i][j]空格|空格board[i][j]空格|空格board[i][j]空格|
即 board[i][j] | board[i][j] | board[i][j]
board[i][j]表示我们待会要下的棋子,我们之前把棋子赋值为了空格,可看上一步
void Printboard(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ",board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf("---|");
}
else
printf("---");
}
printf("\n");
}
}
代码讲解
空格用‘-’代替 board[i][j]用X代替
先打印
代码段
void Printboard(char board[ROW][COL], int row, int col)
{
int i, j;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
printf(" %c ",board[i][j]);
if (j < col - 1)
{
printf("|");
}
}
printf("\n");
第一行打印完之后换行
打印第二行
for (j = 0; j < col; j++)
{
if (j < col - 1)
{
printf("---|");
}
else
printf("---");
}
printf("\n");
打印完之后换行,注意:竖杠即|只在第一二列结尾出现
成果:
棋盘格打印完成,打印完之后就可以开始下棋咯!
玩家先走第一步
接下来我们编写玩家下棋代码
还是在game.h 声明,在game.c编写,在test.c引用
下棋范围为1-3,x-1表示若x等于1,则在函数中对应第二个位置,但玩家并不知道那是第二个位置,所以要减1,让玩家输入几 就在第几个位置出现
void PlayerMove(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家请下棋:");
while (1)
{
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");
}
}
玩家下完棋后打印一下棋盘,要打印棋盘,看效果
若输入棋盘外的数字,会一直进入循环直到输入正确的坐标。所以用while循环,找到正确坐标后用break语句跳出
人下完棋,接着该电脑走了
接下来我们编写电脑下棋代码
还是在game.h 声明,在game.c编写,在test.c引用
void ComputerMove(char board[ROW][COL], int row, int col)
{
int x;
int y;
x = rand() % 3;
y = rand() % 3;
printf("电脑下棋\n");
while (1)
{
if (board[x][y] == ' ')
{
board[x][y] = '#';
break;
}
}
}
电脑下棋为随机数生成,但是棋盘格子为1-3,为了确保电脑下的棋在1-3,我们对生成的随机数进行对3取余的操作,这杨电脑才能把棋下在棋盘里。
随机数以时间为标准应用time.h头文件
电脑下完棋后,我们对棋盘格进行打印,由于下棋可能只是下一颗棋子就结束了,所以用while循环,当不满足条件时退出
接下来就是满足什么条件是退出
还是在game.h 声明,在game.c编写,在test.c引用
函数名为Iswin,类型为char
输赢三种情况:某一行全为一种相同棋子,
某一列全为一种相同棋子,主对角线或次对角线全为一颗相同棋子,
但是也有可能平局,这里IsFull为判断是否平局
int IsFull(char board[ROW][COL], int row, int col)
{
int i; int j;
for (i = 0; i < row; i++)
{
for (j = 0; j < row; j++)
{
if (board[i][j] == ' ') //如果这个格子是空的,则返回1
return 1;
}
}
return 0;// 遍历完之后如果没有空格子,则返回0
IsFull函数为int类型 但是在Iswin函数里使用 Iswin又是char类型
所以我们要用一个变量来接收IsFull的返回值,并把它在Iswin函数里返回为char类型
这里用k来接收,返回值为char类型
若返回C则代表格子还没满,若返回Q,则代表格子满了
返回之后要去判断,如果返回的值不等于C,则代表格子满了,跳出while循环,否则,继续while循环
这里有三种情况跳出while循环
玩家赢 返回 * 电脑赢返回# 平局返回 Q
跳出while循环后我们应将游戏结果告诉玩家
所以接下来写结果输出
玩家赢
电脑赢
电脑太笨了,实在下不出一把平局,没办法验证结果了,试了好几把,把把玩家赢,上面这个电脑赢都是好不容易搞来的