前言
先解释下扫雷的玩法,随机点一个方块(这个是有运气成分在的),显示以这个方块为中心,3x3的格子里雷的总个数,玩家通过这个个数判断雷的位置,继续点击下一个方块,直到找到所有雷的位置,才算成功,中途碰到雷游戏结束。
本教程是基础款,也就是说不会出现点一下翻出一大片(这个需要程序连续测试相邻的格子有没有雷,直到有雷了才会停止展开),也不能标记。
我这里简单一点,设置了80个雷,而且展示了真实棋盘,这时候,输入唯一不是雷的坐标6,1,游戏就结束了。
*文章风格与上一篇三子棋类似,但不会那么详细(比如为什么要头文件参与声明,为什么要宏定义变量等等),有兴趣的朋友先去看看这篇 手把手教你写三子棋
一、设计思路
三、具体步骤
1、模块化编程
2、游戏开始的逻辑
展示菜单–>玩家选择–>进入相应模式
所以main函数如下,很简单的一个do while里面加个switch,不多赘述,别忘了是main()放在最下面。
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;
}
菜单也很简单,如下:
void menu()
{
printf("***********************\n");
printf("******* 1.play ********\n");
printf("******* 0.exit ********\n");
printf("***********************\n");
}
3、游戏的实现
那么game()里包含什么呢?提醒下,game()在test.c里
1)棋盘的创建以及初始化 Init_board()
正如一开始所说,首先要定义两个数组(棋盘),一个给电脑用来埋雷,一个给玩家进行不断选择排查,这里延用上次三子棋宏定义变量的创建风格,方便进行棋盘大小的修改。
其次,判断的是以你选择的方块为中心,3x3的格子内雷的个数,这里要考虑,那些边上的格子怎么办,对于数组来说,你去排查边缘外边的格子,可是会发生越界访问的,那么我们为什么不一开始的就建个大一点的数组呢,可以供边缘的格子进行3x3的排查。
在game.h中
#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
game()里
char mine[ROWS][COLS] = {
0 };//mine有布置雷的意思
char show[ROWS][COLS] = {
0 };
初始化就很简单了,布雷棋盘与玩家看到的棋盘要填充不同的字符,一个要清清楚楚雷在哪,一个像是被盖住了
(1)首先确定你要确定传的参数,在game()里
Init_board(mine, ROWS, COLS, '0');//这个是实际埋雷的棋盘
Init_board(show, ROWS, COLS, '*');//这个是展示给玩家的棋盘
// (棋盘,行,列,字符)
(2)再在game.h里声明
void Init_board(char arr[ROWS][COLS], int rows, int cols, char set);
(3)再转到game.c里定义
void Init_board(char arr[ROWS][COLS], int rows, int cols, char set)
{
int i, j = 0;
for (i = 0; i < rows; i++)
{
for (j = 0; j < cols; j++)
{
arr[i][j] = set;
}
}
}
2)打印棋盘 show_board()
这里注意,上面之所以要建立11x11的棋盘,是为了 排查雷这个操作不发生越界访问,但是实际打印给我们看的的时候只需要中心的9x9的棋盘,多出来的第0行和第0列可以利用下标注下几行几列,第10行和第10列,存在,而且也被填充了字符,但没有打印出来。
*如下图,黑色的是实际棋盘,绿色的方框和数字是打印出来的(注意数字是打印出来,不是填充,实际上对应格子里还是‘0’和‘*’),右下角黄色框边缘方格排查雷的方式*
1)test.c中,game()
//打印棋盘
show_board(mine, ROW, COL);
show_board(show, ROW, COL