一.思维构建
需求:
扫雷游戏基本功能:
1.需要有显示棋盘打印;
2.需要棋盘内存有地雷;
3.当扫描地块时:是雷:显示雷棋盘;不是雷,显示周围8个地块的雷的个数;
思考:
1.若只有一个二维数组,那么<打印显示数组>和<在数组存放雷>将难以实现(打印时将遍历数组元素;由此那么可以分两个二维数组,分别实现<打印显示数组>和<在数组存放雷>
2.如果需要<显示数组>如上的显示效果,那么就要放弃使用int的类型,使用char类型;即显示数组元素为;<存雷数组>为了替换显示方便,建议也使用char类型
3.至于<存雷数组>的元素该怎么选?——要方便需求<计算周围雷的数目>;这样基于前文选char类型,怎么进行计算呢?——利用字符的ASCII编码进行计数,例:
利用<字符0>作为无雷地块,<字符1>作为有雷地块,因为两字符编码恰好相差1,则将进行排雷的周围的8个地块的ASCII编码统计,减去8个<字符0>的ASCII编码,就可以得知8个地块里有多少个<字符1>了(即雷的个数)
4.存放、打印的问题解决了,但是检索时该怎么办?数组是有边界的呀!
——如果进行检索前判断,那么将要分类讨论,计算机的计算效率将大大降低;那么可以考虑一下扩大数组边界,例:游戏10*10的地块,就创造12*12的地块,只打印游戏时的10*10的地块
不仅如此可以解决判断检索的复杂性,还能纠正行列号,为什么呢?
——因为数组检索需要用到下标,玩家输入时肯定是输入第1、2、3、4行或列,而没有听过有第0列的说法(而下标恰恰有0),可以有效且巧妙地纠正行列号
5.还有存放雷的问题,基于上面,利用rand,srand,time函数实现存放雷的坐标是随机的(注意要排除多次布雷至同一区域),实现的基本原理在:简易猜字游戏-优快云博客
6.基本难题都解决了,那么就是创建工程和文件了,建议是设1个头文件,2个源文件:头文件进行声明头文件,1个源文件进行游戏内容的实现,1个源文件是游戏整体流程的实现
二.代码实现
注:
有些注释表明了检验时出现的小错误的地点、解决方法和反思
Game.h:
1.第2行,为了防止scanf函数忽略返回值而报错;
2.第10~14行,为<思考4>的实现;
3.第16行,详见C语言-函数(笔记)-优快云博客第6大点的拓展;
test.c:
第27行,为观察布雷情况,便于调试;
Game.h:
第64,92行,line*row即为棋盘地块数量,easy为埋雷的数量,mine为掀开无雷地块的数目【!!!小失误!!!不应该使用mine命名(不嘻嘻。。。)】
三.拓展思考
1.是否可以选择游戏难度
简单 9*9 棋盘,10个雷
中等 16*16棋盘,40个雷
困难 30*16棋盘,99个雷
2.如果排查位置不是雷,周围也没有雷,可以展开周围的一片
3.是否可以标记雷
4.是否可以加上排雷的时间显示
精彩待续