c语言实现扫雷游戏

c语言实现扫雷游戏


写在前面:
呃呃呃其实是代码写完了才写的这篇文章,所以中间的测试就看不到(害,


那么进入游戏首先应当是有一个菜单界面,供玩家选择开始游戏还是退出游戏,对吧

菜单界面实现

那么就写一个打印菜单的函数咯
请添加图片描述
然后主函数部分调用一下menu(),再根据玩家的选择来判断开始游戏还是退出游戏即可,emm也可以适当考虑一下输入错误的情况,,
请添加图片描述
虽然,只要玩家输入的不是数字,,就会造成不可描述的局面,,,

然后测试一下
请添加图片描述
挺可以的,那么菜单界面其实就实现的差不多了

接下来就是细化game!的内容,测试时输出的game!给他替换成game()

game()的实现

进入了game,那么就应该能看到一个游戏界面,而不是单单的菜单界面了吧,那游戏界面应该是什么样的呢,对于扫雷来说,就是m*n个格子吧,然后还得是(未打开)的状态

说到状态,我们得区分一个格子,都有哪几种状态,可以分为:未打开,打开后无雷,打开后有雷,当然还有个标记。

那么雷的分布应该是一盘游戏开始之前就设置好了,但是展示给玩家的呢又是一个未打开的棋盘,那么目标就挺明确的了

准备两张盘mine表示布雷盘,show表示展示给玩家的盘,定义两个全局变量ROW和COL表示行列(我设置的两个都是9,这是可以改变的),在布雷盘我们用0,1表示无雷和有雷,show盘则用*表示未打开,然后A表示标记,为此需要写一个初始化的函数,再写一个布雷的函数,标记的话到考虑到它不是特别复杂就不封装了
请添加图片描述

初始化布局

这里InitBoard函数表示对目标盘以’0’以及’*'进行初始化,这样mine的board

就是ROW*COL的0,show的board就是ROW*COL的*了

InitBoard函数实现如下👇

请添加图片描述

布置雷

然后再通过SetMine函数对mine布雷

每次的布雷应尽可能做到不一样,为此需要用到随机数的办法

rand()是个好办法,但是它是伪随机,我们需要通过srand()设置它的种子来尽量达到随机效果,而这需要种子一直在变,那么我们通常使用time()函数的返回值作为这个种子,初始化就放在main()函数的开头好了

请添加图片描述

当然这需要包含time.h和stdlib.h两个头文件

另外还需要确定好一盘游戏雷的个数,依据我的经验,雷的个数是可以单独设置的,那么就再加一个常量Count表示雷的个数,后续要修改的话,就跟ROW和COL一样了,这里我设置了10个

SetMine函数实现如下👇

请添加图片描述

正式开始找雷

初始化并设置好雷以后

就可以开始找雷了

每次排查一个格,我们都需要更新一下show盘的状态,并显示给玩家,emm显示,那么我们需要编写一个DisplayBoard函数在屏幕上打印我们的show盘给玩家

请添加图片描述

然后想想这个排查的逻辑,,就是读一下所选方格的周围八格,有雷的就计数,呃但是有个问题就是,选到边缘上的格时,好像就没办法都周围八格了,那怎么办呢

我打算为mine盘周围再扩一圈,并且都设置成0,但对于show盘则还是显示原来的大小,这样统计雷的时候,读到边缘就不会出问题,也能正常统计雷了。

那么另外设置两个常量ROWS和COLS分别等于ROW+2和COL+2即可,然后相应的一些函数也需要改一改。

接着就是需要和用户交互的一些操作呃呃

先展示一下初始化的show盘,然后告知用户有几个雷,,然后用户选择操作(排查,标记,以及撤销标记,,)然后根据操作来选择要操作的坐标,,,然后要区分操作成功和因为特殊情况不能操作的反馈,,,,如果踩雷了是不是需要展示一下mine盘告诉他为什么挂了,,,,,如果没踩雷然后再实现剩下的功能,,,,,每轮还需要判断一下是否达到了获胜条件,,,,,然后每次选择如果玩家不听话输入了别的选项怎么办呢?,,,,

嗯,,总之到最后这个FindMine就写成了这样

请添加图片描述

那么对于Doing函数👇

请添加图片描述

以及judge函数👇

请添加图片描述

就另外写了

排雷怎么做

如果玩家正常的进入了排雷,也就是Doing这个分支,那么我们首先就是要看看这个点的周围有没有雷对吧,为此要写个统计雷的函数👇
请添加图片描述

然后返回的值我们将其分为两类,零和非零,非零的情况比较简单,直接在屏幕上表示相应的数字即可,如果是零的情况呢,,呃就得做一个自动扩展的功能,也就是对周围的八个点位进行相同的上述操作,一直扩到什么时候呢,就是周围不是已经开过的就是非零的情况,这种情况下就得用一下递归了

Doing函数👇

请添加图片描述

判断是否胜利

这也就是我们的judge函数,那就先看场上还有没有*状态的,还有的话,就是胜负未定,如果没有*了,看看场上的标记,如果show上标记的确实都是mine的雷,那么才算成功,不然就还是未胜利

请添加图片描述

play一下

请添加图片描述

请添加图片描述

看起来还不错~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值