c语言实战(扫雷游戏的实现)

1、如何定义初始化棋盘。

首先,我们先观察扫雷游戏,发现这就是一个n*n的棋盘,所以可以想到运用二维数组来表示一个初始化棋盘。

定义了两个棋盘,分别用来保存布置雷的信息和排查雷的信息(show叫棋盘用来展示排查雷的信息,mine叫雷盘用来保存布置雷的信息),这样就可以避免二者相互干扰或者相互覆盖;

同时,我们使用宏定义的标识符常量表示棋盘的大小以及设置的雷的个数,想增加扫雷的难度的时候,我们只需要改动这里一次即可,增加了代码的可维护性。

如图,当我们排查这些标记的雷的位置时,我们会发现当这个位置在棋盘内部区域时,我们需要排查它周围的8个坐标,然而当这个位置在棋盘边缘的时候我们就要排查它周围的5个或者3个坐标。而且如果我们把边缘区域和中心区域用一样的排查方式的话,就会出现数组的越界问题,编译器会报错,然而如果我们分多种情况讨论的话有会很麻烦。所以就有大佬想到了,在定义数组长度时我们直接在上下左右四个方向各多给一行的空间,并把这些空间中的数据初始化为非雷(比如我们想要9*9的棋盘那我们就定义11*11的二维数组)。这样就解决了越界问题,而且程序也不会太复杂。

解决了这些问题,我们就可以开始初始化棋盘了!

这个函数中传递的形参分别是这个二维数组,二维数组的行,列,以及用来初始化二维数组的字符。

对于展示棋盘,由图可看出,初始化为空格 ' ' 表示最为恰当,而对于雷盘,为方便初始化为字符 '0'(之后会讲到初始化为‘0’的好处)

2、打印数组

对于,棋盘初始化完成,为方便操作,为了人性化一点,在展示棋盘的同时,添加标识行列,便于玩家输入坐标。

关于打印棋盘,为了让玩家能看的更加清楚,所以我们会尽量用|和---来打印一个有方框的扫雷棋盘。(关于打印棋盘我就不多说了,以下代码仅供参考。本人自己修修补补改出来的不咋地)

棋盘打印的样子为下图,符合预期。

3、布置雷

为了便于修改游戏难度,设置雷数,因此我们使用#define定义全局标识符常量,用于初始化雷数。

布置雷首先需要生成随机的x ,y 两个坐标,而调用伪随机 rand 库函数需要配合 srand 根据 time 函数返回的时间戳生成,因此 srand 只需要调用一次即可。
注意控制随机数生成坐标的范围,同时判断此位置是否重复生成。其中我们用‘1’来表示雷。

4、排查雷,标记雷,以及判断输赢

首先我们要根据用户来选择,是排查雷还是标记雷。

排查雷,需要获取坐标,检查坐标合法性,同时判断此坐标是否已经被排查。

标记雷,需要获取坐标,检查坐标合法性。
给出输赢计数器flag,当标记的坐标为雷时,flag进行一个自加,当flag的个数为雷的个数时,游戏胜利。还有要注意的是标记次数最多等于雷的数目,如果大于雷的个数时,不予以标记。
如果排查到雷,便游戏结束,同时展示雷盘,得知为何输。
如果未排查到雷,会根据规则进行展开,同时给出每个位置周围雷的个数。(这个之后会有函数来完成这个作用)

还有就是当失败时我们应该将棋盘中雷的分布打印出来,便于玩家知道自己哪里错了,而且为了好看我们会将雷用*表示,非雷的区域则是用空格表示。当然我们胜利的时候也应该打印一边雷的分布。

5、按一定的规则展开

通过观察我们注意到,排查位置周围没有雷是,会展开它周围的位置的周围雷的个数。即根据输入位置判断周围雷的个数,个数为0,进行展开,再次判断周围雷的个数,个数为0,进行展开...可知通过周围八个位置坐标,在周围的8个方向上进行循环,控制循环条件,同时避免重复坐标判断,便可以按规则进行展开。

6、判断输入坐标周围雷的个数

首先我们要知道

字符‘0’对应的ASCII值为48,同时,对于数字来说,ASCII值是连贯的,也就是说‘1’,‘2’,‘3’数字字符对应的ASCII值依次为49 50 51,所以,可以得出一个结论,任何数字字符-‘0’=这个数字字符所对应的数字,任何数字+‘0’ = 这个数字所对应的数字字符(这就是我们为什么要去定义雷为‘1’非雷为‘0’)

借由上面的,我们可以把排查地址周围的八个字符中的数字字符加在一起,最后再减去8个‘0’,也就可以得出这八个区域的数字之和,因为我们设置的存在雷为1,所以,所得到的结果就是周围存在的雷的个数。

game.h头文件

game.c源文件

test.c源文件

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值