大家好,本期我将带大家做一个三子棋的小游戏。
我们先来看一下扫雷的游戏规则
这是一个基础的游戏模式,可以看见是一个9*9的方阵。
上面有显示数字,就表明在他周围的八个格子里面有着两个雷
当你开始的时候是什么都没有的
当你点击第一个之后他就会显示数字或者延伸
文章目录
- 前言
- 一、主体设计
- 二、开始构建游戏
- 1.初始化并打印棋盘
- 2.雷的生成与排查
- 总结
前言
我们已经明白了游戏的运行方式,那么接下来写代码的时间了
( •̀ ω •́ )y
本次与上期大同小异许多地方将不做过多陈述
若有所不了解请移步三子棋小游戏
一、主体设计
void menu()
{
printf("*************************\n");
printf("****** 1.play ******\n");
printf("****** 0.exit ******\n");
printf("*************************\n");
}
int main()
{
int i = 0;
do
{
menu();
printf("请选择:>");
scanf("%d", &i);
switch (i)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误,请重新选择!\n");
}
}
while(i);
}
首先我们构建一个开始的可视化窗口,与接收程序
接下来的部分就只需要在函数game中完成就行了
二、开始构建游戏
1.初始化并打印棋盘
我们首先创建一个二维数组用来存放棋盘然后初始化并将他打印出来
void init_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++)
{
board[i][j] = '0';
}
}
}
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]);
}
printf("\n");
}
}
可以看到确实和想象中一样但是如果我们选择一个点的时候书要去数比较麻烦,所以我们给他加一点点
void display_board(char board[ROW][COL], int row, int col)
{
int i = 0;
int j = 0;
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 0; i < row; i++)
{
printf("%d ", i+1);
for (j = 0; j < col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
这样看起来是不是就好多了
那么在下一步之前我们再来看一下
如果按照我们上面写的来打印这个棋盘,那么在照这个边上的点的时候是不是会出一点问题呢
他会夸出数组检索,势必会对最后的结果产生影响
那么在扩大一下想法,我们后面必然会随机产生雷,那么优先这个数组,雷不就是出来了吗
那么我们是不是可以再创建一个数组来用来显示数字(及检索结果)并且让所以的区域都一样呢
然后我们加一点小改动让初始化更加灵活
代码走起
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
void init_board(char board[ROWS][COLS], int row, int col,char ret)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
board[i][j] = ret;
}
}
}
void display_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (j = 0; j <= col; j++)
{
printf("%d ", j);//输出数字行
}
printf("\n");
for (i = 1; i <= row; i++)//因为大小更改到了11,从一开始方便数字列打印
{
printf("%d ", i);//打印数字列
for (j = 1; j <= col; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
void game()
{
char mine[ROWS][COLS];
char show[ROWS][COLS];
init_board(mine, ROWS, COLS,'0');//初始化数组mine全为字符0
init_board(show, ROWS, COLS,'*');//初始化数组mine全为字符*
//打印显示
display_board(mine, ROW, COL);
display_board(show, ROW, COL);
}
2.雷的生成与排查
有了棋盘,扫雷怎么能没有雷呢,接下来我们使用rand函数来生成雷
void set_mine(char mine[ROWS][COLS], int row, int col)
{
//生成10个雷
int count = lei;//可以采用宏定义,方便修改雷的数量
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (mine[x][y] == '0')//判断这个位置有没有雷
{
mine[x][y] = '1';
count--;
}
}
}
生成之后我们就只需要排雷了
//用来计算九宫格中雷的数量
int find(char mine[ROWS][COLS], int i, int j)
{
return (mine[i - 1][j] +
mine[i - 1][j - 1] +
mine[i][j - 1] +
mine[i + 1][j - 1] +
mine[i + 1][j] +
mine[i + 1][j + 1] +
mine[i][j + 1] +
mine[i - 1][j + 1] - 8 * '0');
}
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
int s = 0;
while (1)
{
printf("请输入要排查雷的坐标:>");
scanf("%d %d", &i, &j);
//首先判断坐标是否合法
if (i >= 1 && i <= row && j >= 1 && j <= col)
{
//判断这个坐标有没有被排除
if (show[i][j] == '*')
{
//判断是排的这个点是不是雷
if (mine[i][j] == '1')
{
printf("对不起你被炸死了!\n");
display_board(mine, ROW, COL);
break;
}
else
{
int count = find(mine, i, j);
show[i][j] = count+'0';//数组是字符型的用数字
//加上一个'0'变成对应的数字字符
display_board(show, ROW, COL);
s++;
}
}
else
{
printf("该坐标已被排查过!\n");
}
}
else
{
printf("对不起该坐标非法,请重新输入!\n");
}
}
if (s == row * col - lei)//若排除的坐标数量是总格数-雷的数量,那么雷就排完了
{
printf("恭喜你雷已排完!\n");
display_board(mine, ROW, COL);
}
}
下面让我们来检验一下,检验能不能胜利的时候,可以选择修改雷的数量并且打印mine数组来进行检查
到了这里,本次的讲解基本上就结束了。
总结
以上就是本次要讲的内容,简单的介绍了设计思路,其实在很多方面还有待改进,当然这个代码还有待改进的地方
可以看见点了一下就扩展了一大片
并且规则里面可以看见扫雷第一次点击的不会是雷
若有地方存在不对,欢迎批评指正,大家可以在下面多多尝试,欢迎大家提意见与想法。
感谢每一位观看本篇文章的朋友。
若文章内容存在侵权请联系修改删除。