前言:在学习完数组和自定义函数的使用后,我们可以通过简单的知识交汇实现扫雷游戏的初阶形态
tip:在开始代码实现之前,我们要引入一个老朋友#,我们把#开头的叫做编译预处理指令。
#define用来定义一个宏——>#define 名字 值(中间用空格隔开)
在开始编译之前,编译预处理程序会把程序当中宏的名字全部替换成宏的值,这是一种完全的文本替换
#include<stdio.h>
#define max 10
int main()
{
printf("%d\n",max);
//在编译前宏的名字max会被替换成宏的值10
//就是说printf("%d\n",max);---->printf("%d\n",10);
return 0;
}
一、游戏框架的构建
为了实现代码高内聚的要求,我们将扫雷游戏拆分成两个主体来完成
1、游戏逻辑的构建
tunder.c
2、游戏主体的实现
game.h
game.c
二、游戏逻辑tunder.c的实现
1、游戏动向的决定
任何一个游戏的起始和结束都是交由玩家决定的,这往往意味着游戏逻辑的执行需要进行一个循环判断交由操控者进行判断。且这个判断至少需要进行一次,因此我们引入do.....while循环来进行游戏逻辑的判断。
在开始时我们需要调出一个菜单供玩家进行选择,这里按照函数高内聚低耦合的原则将菜单meun()细分出去完成;
接着按照玩家的输入input ,我们需要一个多重分支switch()判断游戏的动向
当调出菜单选择1、play game,根据switch()的走向1我们会进入游戏逻辑体的实现函数game
()内。
TIP:无论是对于菜单menu()函数还是游戏逻辑game()函数,我们都不需要给予我们任何返回值,相应的只要求部分拆分出去功能的实现,因此我们将其定义为void类型。
2、游戏逻辑的实现
(1)扫雷游戏数据结构的分析
扫雷游戏是基于雷的布置和雷的信息的一个棋盘实现的,我们可以用一个二维数组的形式来构建这个游戏棋盘(基于9*9展开的棋盘)
在扫雷游戏中,我们知道棋盘中有两个关键的要素
- 雷的布置(我们用0、1代表着雷的存在与否)
- 关于雷的有效信息显示
绿色方块为查询位置,黄色方块查询方块周围雷的布置信息,我们根据黄色方块所表示的雷信息决定查询方块周围安置地雷的情况;
基于9*9的棋盘,我们发现当查询某些位置安置地雷情况时存在数组越界行为,这种行为可能导致一些非法结果的出现,为了解决数组越界问题,在设计的时候可以将数组的扩大一圈,即将棋盘从9*9扩大为11*11:
在进行完上述简单的分析后,我们知道扫雷游戏的实现需要2个11*11的棋盘。一个用于地雷的布置,一个用于地雷信息的存放。
(2)mine棋盘和show棋盘的定义
char mine[Rows][Cols];——雷的布置
char show[Rows][Cols];——地雷信息的存放
三、游戏主体的实现
我们将函数声明、宏定义等放于game.h;
在game.c中放实现游戏功能的函数定义
1、棋盘的初始化
特别提醒:在tunder.c和game.c文件中别忘了引入头文件"game.h"——#include“game.h”
tunder.c中要使用在"game.h"中声明的函数
game.c中要使用“game.h”中声明函数来检查函数定义与函数声明是否符合
2、棋盘的打印
为了检查棋盘的打印是否正确,我们优先实现棋盘的打印
接着先进行编译调试看看初始化棋盘有没有出错:
我们发现棋盘正确打印,可能有细心的朋友发现在棋盘打印时,打印棋盘的函数中出现了另外一个函数Displaycol(col),这个函数是为了简化函数所分裂出去的一个快,这个快的作用也是为了“美化”棋盘。
3、随机雷的布置
需要注意的是随机雷的生成可能在同一个地方,但是一个地方只能放一个雷。这时候需要我们加入一个if语句如图来判断随机雷是否生成于不同的地方;
4、地雷的排查
在void Finemine(char mboard[][Cols],char sboard[][Cols], int row, int col);函数中我们有拆分出部分函数功能——查询地雷信息;
在函数前使用static打破这个函数的外部链接属性变为内部链接属性,使得该函数成为仅希望用于本文件的函数。
最后总结地雷排查的思路:
- 判断查询坐标是否合理
- 当坐标合法时,判断是否踩雷结束游戏
- 当查询坐标合法且不踩雷时判断坐标是否重复查询
- 当以上都合法时我们进行遍历探查周围地雷的信息
四、游戏代码的演示
1、tunder.c
2、game.h
3、game.c
五、小节
以上内容为扫雷游戏的初阶形态,我们希望扫雷游戏的功能更加齐全
- 游戏难度的选择
- 简单:9*9棋盘,10个雷
- 中等:16*16棋盘,40个雷
- 困难:30*16棋盘,99个雷
- 如果排查位置不是雷,周围也没有雷,能否展开一片
- 标记雷的旗帜
- 排雷所用的时间,及时间限制
当然这些是之后改良的要求,欢迎大家指出文章内容的不足和小鬼共同学习,咱们下节见