工兵模拟器之扫雷

文章目录

  • 一,前言
  • 二,游戏介绍
  • 三,游戏功能逻辑
    • 1.test.c
    • 2.game.h
    • 3.game.c
  • 四,游戏代码实现
    • 1.定义雷盘
    • 2.初始化雷盘
    • 3.打印雷盘
    • 4.埋雷
    • 5.获取坐标周围雷的个数
    • 6.递归式展开一片
    • 7.标记或取消标记雷
    • 8.判断胜利
    • 9.排雷
  • 五,游戏效果展示
  • 六,结语

一,前言

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

二,游戏介绍

工兵模拟器之扫雷_第1张图片

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

三,游戏功能逻辑

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

1.test.c

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

2.game.h

库函数头文件的包含

行列的定义

函数的声明

3.game.c

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

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

1.定义雷盘

2.初始化雷盘

3.打印雷盘

4.埋雷

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

6.递归式展开一片

7.标记或取消标记雷

8.判断胜利

9.排雷

四,游戏代码实现

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

1.定义雷盘

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

工兵模拟器之扫雷_第2张图片

工兵模拟器之扫雷_第3张图片

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

工兵模拟器之扫雷_第4张图片

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

2.初始化雷盘

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

image-20220513122809768

工兵模拟器之扫雷_第5张图片

3.打印雷盘

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

工兵模拟器之扫雷_第6张图片

4.埋雷

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


工兵模拟器之扫雷_第7张图片

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

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

工兵模拟器之扫雷_第8张图片

工兵模拟器之扫雷_第9张图片

6.递归式展开一片

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

工兵模拟器之扫雷_第10张图片

7.标记或取消标记雷

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

工兵模拟器之扫雷_第11张图片

8.判断胜利

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

工兵模拟器之扫雷_第12张图片

9.排雷

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

工兵模拟器之扫雷_第13张图片

五,游戏效果展示

工兵模拟器之扫雷_第14张图片

六,结语

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

扫雷源码链接:扫雷

工兵模拟器之扫雷_第15张图片

你可能感兴趣的:(c语言)