按照自己的理解将扫雷这款游戏复刻了一遍,我会将整个我自己的思路分享给大家,同时也请大家看完我的代码给予一些优化的建议。(代码写的太烂,有绝对的优化空间)
思路如下
![](https://i-blog.csdnimg.cn/blog_migrate/2d99c3b72576097fcf8fb66b30c8eb2b.png)
这里跟大家讲一下为什么打印棋盘内容,要在放置地雷之前考虑,主要是因为新手在写代码的时候,总是代码从头写到尾,最后自信满满的按一下f5,程序崩溃了,然后就回去从头开始检查。所以,打印棋盘内容,一方面是为了完成某个功能,更重要的是方便调试!!!
首先对于游戏进入界面我们依旧采用do while()循环,以玩家输入的值作为循环的条件。(简单的代码就不给大家展示了,详情请看gitee链接)
棋盘的设计我们采用两个二维数组,一个用来存放地雷,另一个用来展示,定义两个宏,用来更改棋盘大小。(这种思路也是抄的,有其他的思路可以留言给我讲一讲)
至于初始化,以为我们采用的是二维的数组,所以嵌套循环,传参数时输入想初始化的内容即可,但是记住,如果使用char类型定义的数组,传参数也要是char类型的数据。
![](https://i-blog.csdnimg.cn/blog_migrate/777e4c5f915aa4e73b12ce9ee7508888.png)
上述在ASCII码值中每个字符都有一个对应的数据。
放置地雷,我们在实现功能时,还要考虑游戏难度,所以在这里我也定义一个宏,来控制地雷的数量。我的代码如下。
![](https://i-blog.csdnimg.cn/blog_migrate/b3a64ee98835feb8c4199b22f64c40eb.png)
到现在,打印棋盘没有问题,布置地雷也没有问题,是不是这就结束了,实际上这才是开始。让我们思考,当我们排查地雷的时候,如果玩家选中地雷,游戏就结束,如果没有选中就看看被选中坐标周围的八个坐标,是不是雷,这时候问题来了,如果玩家选中的正好是边界呢,那么这时候,总会有一部分空间不属于我们,该怎么判断呢。(请大家思考一下)
我才用的方法是把原本的数组扩大一圈,并且我们不论是布置雷还是排查雷,我们都只用中间的一圈。
继续往下,我们要判断一些条件,在什么时候输入的坐标能采用,不能采用。
![](https://i-blog.csdnimg.cn/blog_migrate/8d0c75fd718f6c7986ca84bfd28058b8.png)
这样基本的功能就剩下判断是不是胜利了,不过我在原本的判断条件基础上写的函数,如果当前选中的展示的数字是0,那么就向周围的八个格子扩散进行递归。
![](https://i-blog.csdnimg.cn/blog_migrate/957b5aba7d89025a4899bfa1ad78680a.png)
不足之处就是进行了多次重复的递归,导致代码的效率是不够高的,虽然自己知道问题,但是没有解决的思路,还希望留言讨论一下大家的想法。
最后判断输赢
![](https://i-blog.csdnimg.cn/blog_migrate/345fc7219ef601be284c1e05ff8c6949.png)
![](https://i-blog.csdnimg.cn/blog_migrate/1d1e853807e31a8a03fcab86be8bc6d9.png)
条件是每剩一个未打卡的格子,计数器加一个,如果未打卡格子的数量大于雷的数量就证明游戏还在继续。
好了,我的思路基本讲完了,欢迎各位大佬来对我的代码进行评价和指教,我会虚心学习的。