目录
一、前言
二、思维导图
三、思路分析
四、运行结果
五、算法细节
1.游戏相关的测试
2.游戏函数的声明
3.游戏函数的实现
(1)初始化棋盘的函数
(2)打印棋盘的函数
(3)玩家下棋的函数
(4)电脑下棋的函数
(5)判断输赢的函数
六、完整代码
1.text.c文件
2.game.h文件
3.game.c文件
七、结语
三子棋可以帮助我们巩固函数的知识,锻炼我们的编程思想,代码的实现要一个模块一个模块的实现,但是实现起来也没有特别的难,是一个比较适和刚学编程没多久的小伙伴拿来练手的。在写完之后,还可以与自己的朋友装装X。
还有一篇文章是关于扫雷 ,大家感兴趣的话可以看一看
如何用C语言来实现【扫雷游戏】_马桶上看算法的博客-CSDN博客C语言初阶、实战项目、扫雷、函数练习https://blog.csdn.net/m0_63033419/article/details/124144882?spm=1001.2014.3001.5501
1.打印选择菜单(是玩游戏还是退出游戏)
2.初始化并打印空棋盘
3.玩家下棋(判断坐标是否非法、判断坐标是否被占用)
4.打印棋盘
5.判断输赢(玩家赢?平局?未分出胜负)
6.电脑下棋(判断坐标是否非法、判断坐标是否被占用)
7.打印棋盘
8.判断输赢(玩家赢?平局?未分出胜负)
9.游戏结束(玩家赢/电脑赢/平局)
10.再来一局还是退出游戏(不过瘾,就再来一局)
情况一:玩家赢
情况二:电脑赢
情况三:平局
这样的一个三子棋游戏是不是既简单又好玩啊!
✌️✌️
使用text.c文件来执行相关游戏的测试
使用game.h文件来实现游戏函数的声明
棋盘分析:
了解rand()函数:
判断输赢的三种情况:
#include"game.h"
void menu()
{
printf("**********************************\n");
printf("************** 1.play ************\n");
printf("************** 0.exit ************\n");
printf("**********************************\n");
}
void game()
{
char board[HANG][LIE];
Initboard(board, HANG, LIE);//初始化棋盘
Displayboard(board, HANG, LIE);//打印棋盘
char ret = 0;//获取游戏状态
while (1)
{
//玩家下棋
Playermove(board, HANG, LIE);//玩家输入坐标
Displayboard(board, HANG, LIE);//连同输入的坐标和棋盘一同打印
//判断玩家是否赢得游戏
ret = Inwin(board, HANG, LIE);
if (ret != 'C')
{
break;
}
//电脑下棋
Computermove(board, HANG, LIE);//电脑输入坐标
Displayboard(board, HANG, LIE);//连同输入的坐标和棋盘一同打印
//判断玩家是否赢得游戏
ret = Inwin(board, HANG, LIE);
if (ret != 'C')
{
break;
}
}
if (ret == '*')
{
printf("玩家赢\n");
Displayboard(board, HANG, LIE);
}
else if (ret == '#')
{
printf("电脑赢\n");
Displayboard(board, HANG, LIE);
}
else
{
printf("平局\n");
Displayboard(board, HANG, LIE);
}
}
int main()
{
int input = 0;
srand( (unsigned int) time (NULL) );
do
{
menu();
printf("请选择:");
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("输入错误,重新输入\n");
break;
}
} while (input);
return 0;
}
#include
#include
#include
//符号的定义
#define HANG 3//行
#define LIE 3//列
//函数的声明
void Initboard(char board[HANG][LIE], int hang, int lie);//初始化棋盘
void Displayboard(char board[HANG][LIE], int hang, int lie);//打印棋盘
void Playermove(char board[HANG][LIE], int hang, int lie);//玩家1下棋
void Computermove(char board[HANG][LIE], int hang, int lie);//电脑下棋
int Inwin(char board[HANG][LIE], int hang, int lie);//判断输赢
#include"game.h"
void Initboard(char board[HANG][LIE], int hang, int lie)//实现棋盘的初始化
{
int i = 0;
int j = 0;
for (i = 0; i < hang; i++)//打印hang*lie的空格
{
for (j = 0; j < lie; j++)
{
board[i][j] = ' ';
}
}
}
void Displayboard(char board[HANG][LIE], int hang, int lie)//实现打印棋盘
{
int i = 0;
int j = 0;
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
printf(" %c ", board[i][j]);//打印i*j的|
if (j < lie - 1)//最后1列打印lie-1的|
{
printf("|");
}
}
printf("\n");
if (i < hang - 1)//最后1行打印hang - 1的 --- 和 |
{
int j = 0;
for (j = 0; j < lie; j++)//打印每一行的 --- 和 |
{
printf("---");
if (j < lie - 1)//最后1行打印lie - 1的 |
{
printf("|");
}
}
printf("\n");
}
}
}
void Playermove(char board[HANG][LIE], int hang, int lie)//玩家下棋
{
int x = 0;
int y = 0;
printf("玩家走>\n");
while (1)
{
printf("请输入坐标:");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= hang && y >= 1 && y <= lie)//判断坐标是否合法
{
//玩家输入的坐标 -1 表示的是数组的下标
if (board[x - 1][y - 1] == ' ')//判断坐标是否被占用
{
board[x - 1][y - 1] = '*';//将输入的坐标改为*
break;
}
else
{
printf("坐标被占用,重新输入!!!\n");
}
}
else
{
printf("坐标非法,重新输入!!!\n");
}
}
}
void Computermove(char board[HANG][LIE], int hang, int lie)//电脑下棋
{
printf("电脑走>\n");
while (1)
{
//电脑不用判断是否合法,因为 % hang和 % lie只能得到hang行和lie列,不会出现多于棋盘的坐标
int x = rand() % hang;// % hang 得到行,若hang为3.则 % 3的余数就是0到2
int y = rand() % lie;// % lie 得到列,若lie为3.则 % 3的余数就是0到2
if (board[x][y] == ' ')//只判断占用
{
board[x][y] = '#';
break;
}
}
}
int Ispull(char board[HANG][LIE], int hang, int lie)
{
int i = 0;
int j = 0;
//遍历数组访问3行3列的元素是否有空格
for (i = 0; i < hang; i++)
{
for (j = 0; j < lie; j++)
{
if (board[i][j] == ' ')
{
return 0;//棋盘没满
}
}
}
return 1;//棋盘满了
}
int Inwin(char board[HANG][LIE], int hang, int lie)//判断输赢
{
int i = 0;
for (i = 0; i < hang; i++)//判断3行
{
if (board[0][i] == board[1][i] && board[1][i] == board[2][i] && board[1][i] != ' ')//判断行相同
{
return board[1][i];
}
}
for (i = 0; i < lie; i++)//判断3列
{
if (board[i][0] == board[i][1] && board[i][1] == board[i][2] && board[i][1] != ' ')//判断列相同
{
return board[i][1];
}
}
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];
}
//如果棋盘满了返回1,不满返回0
int ret = Ispull(board, HANG, LIE);//判断平局
if (ret == 1)
{
return 'Q';//平局
}
else
{
return 'C';//继续游戏
}
}
这一次教大家学习了如何用C语言来写一个三子棋游戏,如果大家有什么不懂的问题或是有什么建议,可以在评论区留言,有问题的话,我会进自己的绵薄之力为大家一一解答;建议的话,我也会斟酌采纳,与大家一起慢慢的进步。原创不易,还请三连,你们的点赞、收藏和关注是对我最大的支持。