工兵模拟器之扫雷

本文详细介绍了扫雷游戏的实现过程,包括游戏逻辑、代码实现和功能模块。作者通过模块化设计,将游戏分为初始化雷盘、埋雷、获取雷数等功能,并提供了源码,帮助读者理解扫雷的编程思路。文章还分享了如何判断胜利和进行递归式展开的细节。
摘要由CSDN通过智能技术生成

🍔 一,前言

c-ssl.duitang

大家好,好久没见了呢!确实,最近太懒了,将近两个星期没更文了。主要是想集中精力去学习一些学校的课程,主要是我之前没有好好学习,发现学校这学期的课程很蓝的啦,不过更文是不能停的,毕竟有那么多小伙伴和我一起努力,这周末加更两篇,flag立这里了,要是没更,你们就……哈哈哈哈,你们又能拿我怎么样呢!开个玩笑,总之,周末一定腾出时间努力更文!!!废话咱也不多说了,今天,我们一起来探讨一下经典小游戏——扫雷

🍔二,游戏介绍

image-20220512224613644

扫雷相信大家都玩过吧,没玩过也没有关系上图就是一个扫雷。他的规则是游戏初始化会自动翻开一片区域,每个位置上的数字代表着周围一圈存在的雷的数目;玩家可以对自己认为是雷的地方进行标记,也可以对取消自己之前错误的标记;玩家可以翻开认为是雷的地方,但是如果踩中地雷则游戏结束;当玩家排除了所有的雷,则游戏胜利。

🍔三,游戏功能逻辑

在之前三子棋中我们就采用了模块化的设计来进行编程,今天我们仍然把扫雷分成三个文件来写,这样做的好处是有助于团队合作,而且条理清晰,有助于我们养成良好的编程习惯。

1.test.c

主函数部分,对游戏的逻辑进行测试运行

2.game.h

库函数头文件的包含

行列的定义

函数的声明

3.game.c

游戏逻辑的具体实现,是游戏的核心,一般不会展示出来

我们把游戏的逻辑分成以下几个部分:

1.定义雷盘

2.初始化雷盘

3.打印雷盘

4.埋雷

5.获取坐标周围雷的个数

6.递归式展开一片

7.标记或取消标记雷

8.判断胜利

9.排雷

🍔四,游戏代码实现

我们来具体实现上述游戏逻辑:

🍕1.定义雷盘

我们发现扫雷是一个矩形,我们在实现扫雷时,需要打印一个雷盘,并存放埋雷,排雷的数据。这个时候,我们就需要用到二维数组啦。

image-20220513001635386

image-20220513001856671

如上图,我们发现定义雷盘的时候,定义了两个雷盘。一个是用来存放布置好的雷的信息,一个用存放排查雷的信息,这两个雷盘分工明确。这样我们一个用来布置雷,一个用来展示雷。然后我们看宏定义行和列,宏定义的好处是如果以后要更改雷盘的大小,我们只需要把宏定义的行和列更改就行了,增加了代码的可读性,可维护性,可移植性……然后看我们定义了两个行和列,大家看图(画的太丑,以后练练)

image-20220513004821310

我们看2的数字周围8个格子,排雷中2会显示数字,这个数字就是他周围8个格子的雷数;我们再看1数字,他周围只有3个格子,我们在遍历他周围的8个坐标时,会发生数组访问越界,但是如果我们在雷盘的外围再加上一圈,就能完美地避免这个问题。是不是非常的巧妙呢! 所以,9 * 9雷盘我们用于埋雷,11 * 11雷盘我们用于排雷。

🍕2.初始化雷盘

在使用雷盘时,我们要先对他进行初始化,但是我们有两个雷盘,一个一个初始化太麻烦了。我们发现这两个雷盘只有初始化的参数不同,一个全部初始化为0,表示还没有雷,一个全部初始化为#(让玩家不知道雷在哪),那我们就多加一个参数set,看图下:

image-20220513122809768

image-20220513122955777

🍕3.打印雷盘

在给雷盘初始化完之后,我们需要打印雷盘,为了让大家更方便的看坐标进行排雷,标记雷等,我们给雷盘的行和列用数字标识出来。

image-20220513144915484

🍞4.埋雷

埋雷的时候,我们是不能知道雷的坐标的,所以需要系统随机埋雷。这里我们会用到随机数,我们在test.c的main函数里面放上随机数种子,并限制埋雷的坐标,我们宏定义EASY_COUNT为雷的个数,方便以后修改。我们把雷用数字1来代替。


image-20220513145812523

🍞5.获取坐标周围雷的个数

但我们排雷时,如果他不是雷,那他会显示他周围八个坐标雷的个数,我们可以遍历周围8个坐标,看他们是否有雷,如果有雷,它的数据应该是1,没雷就是0,我们用八个坐标的数据减去八个字符0,得到字符1的个数,就是雷的个数。注:字符0不代表数字0,字符1不代表数字1,字符0的ascll码值是48,字符1的ascll码值是49.

image-20220513151342841

image-20220513151501339

🍞6.递归式展开一片

我们的扫雷的规则是如果这个坐标没有雷,且他周围的坐标也没有雷,那他就会继续往外展开,直至遇到有雷的坐标,并显示出来。

image-20220513152613826

🧀7.标记或取消标记雷

在网页版扫雷中我们可以标记或取消标记你觉得可能是雷的坐标,我们用x标记雷的坐标。

image-20220513153248825

🧀8.判断胜利

我们同时需要考虑判断胜利的条件,我们计算出现在还没有排完的雷的个数,如果未排雷的个数等于埋雷的个数,语句为真
说明排雷成功,否则,语句为假,没有排雷成功。

image-20220513154026518

🧀9.排雷

重点来了,排雷是我们扫雷的重点,这里面夹杂了许多函数,不过我们已经在上面一一分析过了,那我们就开始吧!!!首先一个while循环判断是否排完雷,排完就不进去了。继续,如果你排雷的坐标正好是雷,那你就炸死了,嘿嘿,然后为了让你死得明明白白,打印雷的布置。如果你很牛逼,你拍雷的坐标周围一圈都没有雷,那就直接递归式散开一片,直至遇到雷,然后打印出来,我们可以确定是否要标记雷,之后就是循环排雷,直到结束,isWin函数如果排雷成功,返回1,我们进入判断胜利,然后打印埋雷的坐标。

🍔五,游戏效果展示

image-20220513160513955

🍔六,结语

因为我本身实力有限,学的东西也很少,暂时做不出来网页版扫雷,他可能需要一些前端的知识和图形库的知识。不过对于扫雷的大致逻辑我们是写出来了,为了方便大家,我把扫雷的源码放到下面,应该是有一些bug的,如果有,可以提出来,帮助我这个菜鸟进步。不知道说什么了,其实我只想求个一键三连,给我高高地飞起来啊!!!

扫雷源码链接:扫雷

1652430800251

  • 28
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 29
    评论
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值