大家好,在这里我将手把手教大家写一个三子棋的小游戏,话不多说让我们走起来。
前言
首先,在开始写代码之前让我们简单了解一下三子棋的游戏规则
在一个九宫格中,横竖对角三子成线方为胜利。
然后让我们建立两个源文件和一个头文件
我这边用的是vs2019
test.c用于设计运行逻辑
game.c用于存放主要程序
game.h存放头文件与声明
提示:本文涉及rand函数的使用,若没有使用过请提前查阅资料!
一、主体设计
游戏那就应该有着开始与结束,首先写一个可视化选择窗口。
void menu()
{
printf("****************************\n");
printf("******* 1.play *******\n");
printf("******* 0.exit *******\n");
printf("****************************\n");
}
有了选择下面设计每个选择的对应响应
int mian()
{
int i;
do
{
menu();
printf("请选择:>");
scanf("%d", &i);
switch ()
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default :
printf("选择错误,请重新选择!\n");
break;
}
}
while(i)
}
好了前戏到这里就没了,下面上正菜( •̀ ω •́ )✧
二、主要程序
1.棋盘设计输出与初始化
下棋怎么能没有棋盘呢
可以看到棋盘整个有九个格子伤心左右都有线给隔开
下面让我们按照这个格式来简单写个代码
那么让我们来看一下效果
可以看见这不是我们想要的效果
那么我们只需要给数组的每一个元素都给空格是不是就行了呢
在这之前我们还可以想到 一个问题,这个是三行三列,要是多一行一列是不是需要该很多东西。
那么让我们小改一下再看一下程序结果
在这边我宏定义了一个COW和COL如果我们需要改动棋盘大小直接在这里修改就行
那么既然数据改了我们的棋盘打印也要做出相应改变
大家可以开动脑筋想想这该改,想好了可以看看我的代码,看看和你的有什么区别吧
void display_board(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++)
{
printf(" %c ", board[i][j]);
if (j < row - 1)
printf("|");
}
printf("\n");
//---|---|---
if (i < row - 1)
{
for (j = 0; j < col; j++)
{
printf("---");
if (j < col - 1)
printf("|");
}
}
printf("\n");
}
}
一个自定义函数完成了数组的赋值也可以说是初始化工作
2.落子与显示
前面棋盘已经完成了,那我们就要开始想我是怎么开始玩这个游戏了
怎么下?
我们用了二维数组,这个问题就很好解决了,代码走起
void play(char board[ROW][COL], int row, int col)
{
int x = 0;
int y = 0;
printf("玩家下棋:");
while(1)
{
printf("请选择要落子的坐标:>");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= 3 && y >= 1 && y <= 3)//非相关专业行列习惯1开始
{
if (board[x - 1][y - 1] = ' ')//考虑坐标上有没有子
{
board[x - 1][y - 1] = '*';
break;
}
else
{
printf("该坐标已被占用,请重新选择!");
}
}
else
{
printf("该坐标不合法,请重新选择!");
}
}
}
我们自己可以下棋了
下面就是给自己找个对手了,继续代码走起
void computer_play(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 - 1][y - 1] == ' ')
{
board[x - 1][y - 1] = '#';
break;
}
}
}
可以看见电脑已经可以随机落子了,但是我们成立一条线还是没有赢,所以我们还需要一个可以让判断输赢的程序段,让我们走起
//判断棋盘是否满了
int is_man(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 is_win(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];
}
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];
if (board[2][0] == board[1][1] && board[1][1] == board[0][2]&& board[2][0]!=' ')
return board[2][0];
if (is_man(board, row, col) == 1)//另外用一个函数来判断棋盘是否下满
{
return 'P';
}
else
return'K';
}
void game()
{
int a;
char board[ROW][COL] = {0};
init_board(board, ROW, COL);//初始化棋盘
display_board(board, ROW, COL);//答应棋盘
while (1)
{
play(board, ROW, COL);//玩家下棋
display_board(board, ROW, COL);
a = is_win(board, ROW, COL);//判断是否有人赢了
if (a != 'K')
break;
computer_play(board, ROW, COL);//电脑下棋
display_board(board, ROW, COL);
a = is_win(board, ROW, COL);
if (a != 'K')
break;
}
if (a == '*')
{
printf("玩家赢!\n");
}
if (a == '#')
{
printf("玩家赢!\n");
}
if (a == 'P')
{
printf("平局!\n");
}
}
可以看见已经可以判断输赢
如果你已经做到了这一步,那么你就掌握了三子棋
总结
以上就是本次要讲的内容,简单的介绍了设计思路,其实在很多方面还有待改进,如果是4*4的棋盘怎么判断输赢、怎么加强电脑的智能,这就需要大家在下面多多尝试。
感谢每一个观看本篇文章的朋友,欢迎大家提供思路和想法以供参考。
若文章内容存在侵权请联系修改删除