哈喽,大家好!今天小编给大家讲解一下扫雷游戏的基本实现。打开vs首先创建三个文件
test.c :用于测试
game.c 实现游戏的内容
game.h 声明函数,定义宏
扫雷
一.菜单的实现
首先我们需要一个菜单来和玩家做一个交互->玩游戏还是退出?
从main()进去之后先打印菜单也就是执行menu(),之后我们建立一个变量input用来执行用户的选择
,接着用printf("请选择:->");提醒一下,接着我们输入,利用switch语句我们可以基本实现:
1.玩游戏 0.退出游戏 非0非1.重新选择
这里考虑到玩家玩完一把之后还想玩,所以使用do...while()循环,先把菜单打印
当玩家选0时,input也为0,就会退出
二.游戏内部的实现
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
1 | ||||||||
2 | ||||||||
3 | ||||||||
4 | ||||||||
5 | ||||||||
6 | ||||||||
7 | ||||||||
8 |
我们要实现一个9*9大小的扫雷,那么我们就需要创建一个二维数组去实现这个9*9的数据,
那么我们怎样去判断某个地方是不是雷呢? 我们这里的话用0表示不是雷,1表示雷
假设(3,4)这个位置是这样的
最中间的点为(3,4)点
我们可以看到,围绕(3,4)的八个元素只有一个1,也就是只有一个雷,那么我们在输入3,4之后,那么该点应该从0变成1(周围有一个雷),那么这里我们就有了歧义,说这个到底是雷呢还是用于计算雷的个数的呢?
那么我们为了避免这种情况,我们再创建一个二维数组,第一个数组用于布置雷,第二个数组用于给玩
家看的
紧接着我们开始初始化数组
在这里我们分别创建了mine,show数组.这里可能有朋友要问了,第一个数组放的不是0和1吗?为啥要用char类型呢?
那么这里我们说,因为show数组的元素是char类型,我们为了方便管理所以mine数组也使用了char类型
这里的Rows和Cols分别表示行和列,因为我们要频繁的使用,再一个方便以后修改,所以用宏定义
这里说一下为什么要定义Rows 为 Row+2
因为数组在调用时,它是从0开始的。数组下标是0-8,而玩家在输入的时候不可能按着下标去输
所以我们需要这样整:
直接创建一个11*11的数组。
现在我们开始一步步实现初始化数组 打印数组 放雷 排查
1.初始化数组
我们写一个initboard函数用来初始化数组,它的参数为数组,行和列,还有要初始化的元素
通过两层for循环我们就可以把数组中的每个元素初始化为我们想要的元素
2.打印数组
print函数参数是数组,我们要打印的行,列
因为我们其实只需要操作9*9的元素
所以在打印的时候就不要Rows,Cols了,可以直接从1开始到row或col进行打印
3.布置雷
set_mine函数用于布置雷,而我们的雷是在数组中布置的,所以参数方面需要数组元素和你要布置雷的个数
这里的话就是利用rand函数的随机返回值,去随意设置雷的位置,每次坐标上的字符如果是'0',则会被替换为'1',每布置一次,thunder减减一下
4.排查雷
设置变量win 将所有雷排查完
因为troubleshooting函数需要根据mine数组来输出show数组,所以这里需要传两个数组
首先进去之后先用printf函数提示用户输入,紧接着创建变量x,y 根据输入的x,y值去判断有没有越界,如果越界就提示“输的位置越界了,请重新输入”,如果没有越界,就进去判断你输入的点是不是'1',
如果是就提示"你被炸死了",反之则用GetMineCount()函数(计算输入坐标周围八个位置有几个雷)的返回值替换自己输入坐标的值,并将win自减一下,当win为0时游戏胜利
troubleshooting函数
计算周围八个位置字符的大小再减去8个'0'