准备:
实现扫雷的具体思考:
需要二维数组
打印这个二维数组
在这个二维数组里布置雷
然后排查雷
对于扫雷游戏我们选择一个地方之后会出现两种情况:一种是这个地方是雷被炸死了,另一种是这个地方不是雷,但是要在这个地方显示周边8个坐标雷的个数。所以说我们首先要在数组里布置10个雷 那么我们可以用'0'表示非雷 '1'表示是雷 如果这个地方不是雷,我们可以用字符数字来表示周边雷的个数,那么这就会有一个问题就是这里的字符数字有可能和雷的表示符号'1' 重复,所以在这里我们可以考虑创建两个相同类型的二维数组,一个存放布置雷的信息,一个存放排查雷的信息。
那么我们进入正式的内容:
![](https://i-blog.csdnimg.cn/blog_migrate/4d0e8b1b6e8a56dff65ab7efa17b3849.png)
我们可以创建两个二维数组 mine数组是存放布置雷的信息 show是存放排查雷的信息
然后我们可以对这两个数组进行初始化,我们可以这么想,对mine数组我们全部初始化成'0',然后在给里面放'1'当作雷,对show数组我们可以先初始化成'*',然后每排查一个雷我们把排查完雷的字符数字放到对应的位置去。
一.初始化二维数组
![](https://i-blog.csdnimg.cn/blog_migrate/680a80b9dd509707d746c0881747bdb4.png)
传参的时候我们将初始化的内容传过去
![](https://i-blog.csdnimg.cn/blog_migrate/2e35dd7ba80371ed5dd8e950066bfe47.png)
这样我们用遍历的方式,用一个函数就可以将两个数组进行初始化
在这里为了防止二维数组的越界访问,我们要将原本的二维数组在扩大一圈,这样就不会越界了,如下:
![](https://i-blog.csdnimg.cn/blog_migrate/bb4fc4eb9116cc19f726de575968e429.png)
这里我们可以这样定义,到时候根据具体情况使用
二.打印数组
我们要将这个数组打印出来 打印出一个9*9的二维数组
![](https://i-blog.csdnimg.cn/blog_migrate/31ba5b5be8512ce646ea0d58815a07df.png)
用遍历的方法打印,为了方便玩家一眼就能看清坐标,我们可以在二维数组的开头打印他们对应的行和列数
![](https://i-blog.csdnimg.cn/blog_migrate/dad318a931938cabf350e8aa6354bda4.png)
打印列数,然后换行。
![](https://i-blog.csdnimg.cn/blog_migrate/7f2f1d716bd05b737491b04e8b52513b.png)
在打印每组数据的开始打印行号
整体效果如下:
![](https://i-blog.csdnimg.cn/blog_migrate/737498ee3d43491ba6d5c8059b987c81.png)
三.布置雷
布置雷,我们是在9*9的二维数组里面随机布置10个雷,这里要产生随机数,所以我们要用rand
![](https://i-blog.csdnimg.cn/blog_migrate/5516df4d38352e150b61d1d873cde33c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0b29e08e47086455edee7731d7108d56.png)
在这里我们需要考虑的是随机数的生成时有范围的,时1~9,所以我们要产生1~9的数字
![](https://i-blog.csdnimg.cn/blog_migrate/8b9cc1d61767982a3481107f23bd0b54.png)
rand()%row产生的就是0~row-1的数字 row==9 +1就是产生的1~9的数字
rand()%col+1也是一样的道理
其次布置雷时循环的一个事情,我们布置10个雷就循环10次,如果该位置没有布置雷也就是'0'就给它布置雷变成'1'。
然后count-- , EASY_COUNT==10,用count控制循环正好可以布置10个雷。
四.排查雷
对于我们简易的实现扫雷功能,首先排查雷的时候,玩家要输入排查的坐标
然后在这里,我们要判断坐标的合法性
![](https://i-blog.csdnimg.cn/blog_migrate/7fc76c95dee43ef1b35b7b1921a9a60b.png)
这是合理坐标的范围
而后我们还要判断该坐标是否被之前排查过了
![](https://i-blog.csdnimg.cn/blog_migrate/3329c22c554cf3650e6859ab1fe7446f.png)
对于这个数组我们刚开始初始化成'*',如果被排查过了就会变成数字字符,如果没被排查过就显示'*'
这里说明没有被排查过,然后在这种情况下我们在判断该坐标是不是雷
![](https://i-blog.csdnimg.cn/blog_migrate/17e41028dc75df53caa424bece7eabac.png)
判断该坐标是不是雷 如果是雷,就被炸死,然后打印一下布置雷的信息,让玩家清楚炸弹在哪
如果不是雷,那我们就要显示该坐标周围坐标有雷的个数
![](https://i-blog.csdnimg.cn/blog_migrate/81b91f101752603d294fbb804e9c1bf1.png)
用这个函数来计算我们的个数
![](https://i-blog.csdnimg.cn/blog_migrate/d204ad2cfae8362460c5c47f871921a0.png)
这个函数的具体实现
我们都知道0+'0'='0'(非雷) 1+'0'='1'(雷) 2+'0'='2' 我们之前把雷用'1'来表示 非雷用'0'来表示
我们可以用周围坐标的值减去'0'然后就是周围坐标是雷的个数 所以我们把周围8个坐标的值加起来减去8*'0'就是我们周围8个坐标有几个雷的个数 存放到count中去
然后把雷的个数赋值给我们的show数组(显示排查雷信息的个数)
![](https://i-blog.csdnimg.cn/blog_migrate/97de8cb04bf65555063afcf05108c45a.png)
count是该坐标周围雷的个数 +'0'就变成了字符数字 用字符数字表示雷的个数,这里正好就与我们上面创建的字符数组相契合,而且这里也告诉我们为什么用'0'表示非雷 '1'表示雷 可以很方便的计算我们周边雷的个数,当然这里也可以用if语句进行判断周边坐标是否为雷,但是这样就显得更加麻烦
然后我们将这个show数组打印一下显示我们排查雷的信息情况
![](https://i-blog.csdnimg.cn/blog_migrate/dcf6eb1c9e34930a1cc1c37a51ae2267.png)
最后我们还要判断一下怎样扫雷成功,如果有10个雷,9*9=81的格子里面我们排查出其他的71个位置我们就是扫雷成功,所以我们可以创建一个变量win,每次排查没被炸死win++一次,当win到达71次的时候就扫雷成功。
上面这些排查雷的过程是一个循环的过程我们要用到循环所以我们可以用win来控制循环
![](https://i-blog.csdnimg.cn/blog_migrate/8f418618a7fe963ac72e00064941b000.png)
当win的值小于整个二维数组的个数(row*col)-雷的个数(EASY_COUNT)我们进入循环
![](https://i-blog.csdnimg.cn/blog_migrate/44481833c49b9d91cf60d408917854f5.png)
然后在排查的过程中没有被炸死我们就win++当我们的win==(row*col)-EASY_COUNT的时候就是排雷成功 打印布置雷的情况,让玩家直观的感受布置雷的信息
![](https://i-blog.csdnimg.cn/blog_migrate/aa7591dde669fb14816a270cdcc4a877.png)
最后我们可以验证一下,我们可以通过自己控制雷的个数,提前打印布置雷的信息进行验证
1.当我们输入雷的坐标,我们就被炸死
![](https://i-blog.csdnimg.cn/blog_migrate/b76dfac7b4cd3319daa758faea0943f4.png)
我们可以看出1,6的位置是布置的雷,所以会被炸死。
2.当我们输入的不是布置雷的坐标,就显示周边雷的个数
![](https://i-blog.csdnimg.cn/blog_migrate/2da510fbde7c8777d1ff7a8c28d54dc6.png)
我们可以看清5,1的周边有一个雷,在show数组里就显示了一个雷。
3.当全部排查完,就扫雷成功,我们可以调整炸弹的个数,将炸弹的个数改成80个,那么就有1个坐标不是雷,我们提前显示布置好雷的棋盘,然后输入不是雷的坐标就会扫雷成功。
![](https://i-blog.csdnimg.cn/blog_migrate/bee632df8703ed999195330d928743b6.png)
我们可以看出4,1这个坐标不是雷,其他的全部是雷,当我们把这个坐标排查后就扫雷成功。
到此扫雷游戏就完成了