用C语言实现一个扫雷小游戏

目录

一.知识铺垫

1.1多文件函数的使用

1.2随机数的产生 

二.扫雷游戏分析和设计

2.1扫雷游戏的功能说明

2.2 游戏的分析和设计

1.2.1 数据结构的分析

三.扫雷游戏的代码实现

3.1游戏的主体逻辑 

3.2游戏函数的实现

 初始化棋盘

 打印棋盘

 布置雷

排查雷

3.3完整代码 

text.c

game.c 

game.h 


一.知识铺垫

1.1多文件函数的使用

在项目中,我们一般使用函数来进行规范的模块化设计,下面是简单的在多个文件中进行的函数模块化设计。

一般情况下,函数的声明,类型的声明放在头文件(.h)中,函数的实现是放在源文件(.c)中

下面用一个简单的加法运算函数来举例

text.c文件来实现函数的调用

add.c文件来实现函数的定义 

add.h文件来实现函数的声明 

1.2随机数的产生 

二.扫雷游戏分析和设计

2.1扫雷游戏的功能说明

• 使⽤控制台实现经典的扫雷游戏

• 游戏可以通过菜单实现继续玩或者退出游戏

• 扫雷的棋盘是9*9的格⼦ • 默认随机布置10个雷

• 可以排查雷

     ◦ 如果位置不是雷,就显⽰周围有⼏个雷

     ◦ 如果位置是雷,就炸死游戏结束

     ◦ 把除10个雷之外的所有⾮雷都找出来,排雷成功,游戏结束

游戏的界面:

           初始界面                                     游戏界面                                  游戏失败界面

2.2 游戏的分析和设计

1.2.1 数据结构的分析

扫雷的过程中,布置的雷和排查出的雷的信息都需要存储,所以我们需要⼀定的数据结构来存储这些信息。 因为我们需要在9*9的棋盘上布置雷的信息和排查雷,我们⾸先想到的就是创建⼀个9*9的数组来存放信息。

我们用1来代表雷,0来代表没有雷

但是,我们也会发现,当雷布置在棋盘的四条边上时,数组就会出现越界问题,那么如何来解决数组越界的问题呢?

假设我们排查(2,5)这个坐标时,我们访问周围的⼀圈8个黄色位置,统计周围雷的个数为1,假设我们排查(8,6)这个坐标时,我们访问周围的⼀圈8个黄色位置,统计周围雷的个数时,最下面的三 个坐标就会越界,为了防止越界,我们在设计的时候,给数组扩大一圈,雷还是布置在中间的9*9的坐 标上,周围⼀圈不去布置雷就行,这样就解决了越界的问题。所以我们将存放数据的数组创建成11*11 就可以解决数组越界的问题了

再继续分析,我们在棋盘上布置了雷,棋盘上雷的信息(1)和⾮雷的信息(0),假设我们排查了某 ⼀个位置后,这个坐标处不是雷,这个坐标的周围有1个雷,那我们需要将排查出的雷的数量信息记录 存储,并打印出来,作为排雷的重要参考信息的。那这个雷的个数信息存放在哪⾥呢?如果存放在布 置雷的数组中,这样雷的信息和雷的个数信息就可能或产生混淆和打印上的困难。 

那如何解决这个问题呢,我们可以专门给⼀个棋盘(对应⼀个数组mine)存放布置好的雷的信息,再给另外⼀个棋盘(对应另外⼀个数组show)存放排查出的雷的信息。这样就互不干扰了,把雷布置到 mine数组,在mine数组中排查雷,排查出的数据存放在show数组,并且打印show数组的信息给后期排查雷做参考。

同时为了保持神秘,show数组开始时初始化为字符 '*',为了保持两个数组的类型⼀致,可以使⽤同⼀ 套函数处理,mine数组最开始也初始化为字符'0',布置雷改成'1'。

 

三.扫雷游戏的代码实现

3.1游戏的主体逻辑 

我们使用do while语句和switch语句以及scanf函数来实现游戏的进入及退出。

其中do while语句保证游戏的选择界面至少会出现一次,是实现众多简单小游戏最常用的语句。

switch语句则提供了选择上的不同分支,确保玩家能够选择进入游戏或退出游戏。

3.2游戏函数的实现

 初始化棋盘

我们使用二维数组来储存数据,用两个for循环嵌套来将棋子存放在二维数组棋盘中 

下面把它放在text.c文件的game函数中

 

 打印棋盘

我们先在text.c的game函数中写好打印棋盘的操作,接下来在game.c中实现打印棋盘的函数

 

继续运用for循环实现棋盘横纵轴数字和棋盘的打印 

 布置雷

继续在text.c的game函数中完成下一步布置雷的操作,接着在game.c中实现布置雷的具体函数

运用知识预备中的生成随机数的知识生成10个雷并储存在存放雷的数组mine中 

排查雷

 

继续在text.c的game函数中完成最后一步排查雷的操作,接着在game.c中实现排查雷的具体函数 

其中,我们发现,还需要一个函数来统计一个位置周围的雷的数量,于是我们在game.c中完成这个函数 

由于我们将雷记为1,非雷记为0,且因为1和0的ASCII值相差1,则我们只需要用该位置周围的8个位置的ASCII值减去8个0的ASCII值,得到的就是周围雷的个数

最后,我们在头文件game.h中声明各个函数,并且定义宏(方便我们更改雷的个数,棋盘的大小等信息)

3.3完整代码 

text.c

game.c 

game.h 

好了,本次的扫雷小游戏就分享到这里啦,喜欢作者的小伙伴还请点点赞,点点关注啦,谢谢大家!

共勉! 

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值