前言
扫雷可是家喻户晓的小游戏了,想不到我们已经有了编写它的能力吧!
一、扫雷游戏分析和设计
扫雷游戏的功能说明
1.使用控制台来实现
2.游戏可以通过菜单来实现继续玩还是退出游戏
3.扫雷的棋盘是9 * 9的格子
4.默认随机布置10个雷
5.可以排查雷
如果位置不是雷,就显示周围有几个雷,并显示
如果是雷,则游戏失败,结束
如果排查完10个雷,则游戏成功,结束
实现预计效果:
游戏的分析和设计
扫雷过程中,布置的雷和排查的雷都需要存储,所以我们需要一定的数据结构来存储这些信息
因为要在9 * 9的棋盘上布置雷的信息和排查雷,所以我们首先想到创建一个9 * 9的数组来存放信息
如果这个位置布置雷,我们存放1,否则存放0
可是,万一我们要排查(8,6)这个坐标的时候,我们访问周围的一圈8个黄色位置,统计周围雷的个数时,最下面三个坐标就会越界,为了防止越界,我们想到一个好方法:
在创建数组的时候,将数组扩大一圈!即创建一个11 * 11的数组,周围一圈不布置雷,即存0,这样就解决了越界的问题
继续分析,当我们排查出一个非零点,得到一个周围雷数量的数据,那么这个数据应该保存在哪里?
如果存放在布置雷的这个棋盘中,这样就会和原来雷的信息相混淆
正确的解决办法是,雷和非雷的信息都不使用数字,使用字符就行,我们在单独创建一个棋盘,一个棋盘mine用来放置雷,一个棋盘show用来存放排查出的雷的信息,这样就不会互相干扰了
二、扫雷游戏的代码实现
首先要明确,我们仍然分为三个文件,它们分别为:
game.h、game.c、test.c
对于主函数所在的test()函数,我们参考前面猜数字游戏
而对于game.h文件,我们需要思考游戏过程中要有几个函数
初始化棋盘,打印棋盘,布置雷,排查雷
对于game()函数,显然要先创建两个棋盘,再初始化它们,然后打印show棋盘,接着布置雷,最后就是排查雷了
初始化棋盘,本质上就是for循环二维数组,与下图类似,打印棋盘同理
至于布置雷,则需要注意x,y坐标的位置,且不与已有雷重复即可
怎么做到获取一个非雷坐标周围雷的数量呢?
事实上,你注意到’1’-'0’等于1,我如果将该点周围八个点加起来,减去八个’0’不就得到周围雷的数量了吗
排查雷,我们建立一个循环,等到成功排查非雷的数量等于row*col-雷的数量的时候,即被视为成功,我们输入一个正确的坐标后,若是雷,直接炸死,跳出循环;如果不是雷,修改show棋盘的相应坐标并打印,亦或者循环条件结束,我们成功找出了所有的雷
最后实际效果演示
总结
到目前为止,该扫雷的效果跟我们网页游玩的还是有差异,比如说时间限制、开局展成一篇、是否可以标记雷等,这些我们下次再讨论。