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一下
看起来还不错~