发布时间:2024-08-26 14:01
前言:Hello!我是@每天都要敲代码,今天我们一起来学习一下,二维数组的应用===》扫雷游戏;这算是我们设计的第3个游戏了;它的大体框架和前两个游戏类似,还不太了解的小伙伴不妨去看一下:改版的猜数字游戏和三字棋游戏,下面让我们一起学习吧!
目录
1.大体框架
2.游戏具体功能设计环节
2.1 初始化:InitBoard
2.2 打印:PrintBoard
2.3 布置雷:SetBoard
2.4 排查雷:FindBoard
所有代码:
总结:
这里我们就不在多赘述,有了前面两个游戏的设计,相信我们已经熟练掌握了,下面直接上代码:
逻辑测试:
接下来就是最核心的扫雷游戏的实现环节;老样子我们先封装一函数game();用这个去代替case 1打印的内容,然后把所有的功能函数都写到game()函数里;让我们一起动手写一下把!
首先我们要思考我们要初始化什么?要创建几个数组?我们不妨去玩两把扫雷游戏去体验一下:扫雷游戏,这里我们就需要注意两点:
1. 我们需要两个字符数组,一个mine数组用来保存布置雷的信息,另一个show数组用来保存排查出雷的信息,并且我们才开始把mine数组初始化为字符0,随机布置雷的时候在改为字符1;show数组我们需要全部初始化为字符*,当这个位置不是雷的时候,我们在统计它周围有几个雷的信息存储起来。
2.对于数组的大小我们怎么设置呢?假如才开始是9*9的格子,如果数组的大小我们就定义为9*9就会出现问题;如果是边界的情况下,我们去统计它周围雷的信息个数,是不是就会造成越界;所以我们就不妨上下左右都多一行,就是11*11,为了使坐标能对应起来,我们把两个数都设置为相同的大小。例如:以下这种情况,我们设置大一点就不会造成越界!
接下来最关键的来了,我们要初始化两个数组,并且我们两个数组初始化的值还不一样:一个初始化为字符0,一个初始化为字符*;怎么办呢?写两个初始化的函数?所以我们不妨在传参的时候多传一个参数,最终共用一个初始化函数;你传过来什么,我就初始化为什么。
注意:初始化时我们把11*11的网格都要初始化,等我们真正使用打印的时候只用9*9就可以了。
具体代码实现:
对于打印很简单就不在说什么;值得注意的是,我们只打印出来中间9*9的格子就行;并且为了下面排雷输入坐标方便,我们不妨在打印时把序号也打印上。
具体代码实现:
逻辑测试:
接下里我们就需要在mine数组里布置雷了,利用产生随机数来布置雷;产生随即数前两个游戏也有很详细的解释了,就是利用rand和srand函数,这里就不在多说。随即数产生后我们想布置几个雷循环就写多少;需要注意的是:我们只有当前坐标位置是字符0时,我们把它改成字符1,才算设置雷成功,让循环次数减少一次;如果当前已经是字符1,就让它重新产生随即数。
具体代码实现:
逻辑测试:
当然我们在玩的时候,mine数组我们是不该打印的,到时候直接屏蔽掉就可以,这里只是为了更好的测试!
对于排查雷我觉得是整个扫雷游戏中少稍微麻烦难一点的,前面的设计都很简单,这里就需要我们花一点心思:
第一步:我们需要输入排查的的坐标,首先判断坐标的合法性;坐标合法了,再判断是不是雷,是雷就被炸死了,我们就需要打印一下mine数组,告诉玩家你为什么被炸死了;最后break跳出循环。
第二步:如果不是雷呢?我们就需要统计mine数组当前位置周围有几个雷,我们封装个get_mine_count函数,这个函数我目前知道两种实现方法,今天将都展示给大家。需要注意的是我们统计的个数count返回的是int,而我们需要的是字符,所以我们把count+\'0\'就可以了,并把这个值赋给show数组;接下里打印一下show数组,查看排查的状态,并让变量加1,这样循环次数减少1,直到我们把所有的不是雷的坐标都筛选出来,就跳出循环。
具体代码:
逻辑测试:
正常排雷:
排到雷炸死了:
通关:对于全部排出雷通关,我们不妨换个思路,多设置雷,比如设置80个雷,只有一个没有雷,如果我们把这个雷排查出来,显示我们通关了,说明逻辑就没问题:
对于扫雷游戏只要把逻辑理清楚了,其实比五子棋逻辑简单多了,除了我们排查雷麻烦一点;最主要的还是思路要清晰,理清我们的字符和数之间的转换。还是那句话,能一口气写出来的小伙伴,一定要尝试写成项目的格式!!!这里我是专门整合到一块的,方便理清楚思路和截图。
下面一起欣赏校园美景吧: