前言
扫雷游戏规则:
1、点击方格,如果出现数字,数字表示这个格子周围八个格子的雷的总数。
2、如果点击的方格里有雷,那么游戏结束,如果没有雷,则显示旁边一圈(8个)格子的总雷数。
为了更加清楚地实现效果,我们将设置两个字符型数组,一个放置雷,一个放置排查出来雷的个数,便于我们实现扫雷。同时,我们创建两个源文件以及一个头文件,便于修改,提高代码可读性:
- 首先是自己最先创建,包含主函数的.c文件,例如在此游戏中是test.c,用来测试。
- 我们通常会新建一个头文件,例如此游戏新建game.h,此头文件通常用来完成函数声明、头文件的引用、宏定义变量。
- 新建一个.c文件,例如在此游戏新建game.c,编写涉及到的功能函数实现。
一、需要思考的问题
1、如果只有一个棋盘,如何明白当我们点击格子时显示的数字是雷的个数还是表示这个位置有雷?
这里我们设定两个字符型的数组,数组mine来存储雷(用1表示雷,0表示非雷),数组show用来存放排查出来的雷的个数(即在数组mine中点击格子,那么对应的数组show中对应的位置会显示雷的个数)
其中:刚开始我们可以设置数组mine里面的元素全部为字符0,之后再随机生成雷;设置数组show里面的元素全部为字符*,计算出数组mine在数组show对应位置旁边雷的个数之后放置字符。
2、如何避免使用数组时越界?
我们知道扫雷点击方格之后出现的数字是旁边一圈(8个)格子里面雷的总数,如果设置格子的大小为9×9,在查找边界格子周围的雷的个数时会越界,为避免越界,我们将格子扩大一圈,变成11×11的格子大小,但是只使用中间9×9部分的格子。
二、具体代码及实现步骤
1、main()函数实现让用户决定是否开始游戏。
int main()
{
int a;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请输入:\n");
scanf("%d", &a);
switch (a)
{
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("选择错误\n");
break;
}
} while (a);
return 0;
}
2、棋盘初始化。
这里为了不在排查雷的时候越界,我们设置11×11的格子大小:在放置雷的mine数组中,我们首先是将元素都设置为字符0(方便后面随机雷的分布);在排查雷的show数组中,我们将所以元素设置为字符*(后面计算出一个格子一圈(8个)旁边雷的个数之后好改变)。