概要
简易的扫雷流程。
整体架构流程
我们已创作游戏的思路打开扫雷,从游戏的主要结构入手,首先编译一个游戏目录,随后构建游戏主体,随后针对扫雷所需要的不同功能设计对应的函数,从而实现扫雷的简单编译。
流程解释
在编译的过程中我们需要按照扫雷的功能步步编译,而非一布到底,所以作者尽可能还原编译过程,以便读者理解。
技术细节
我么们首先对扫雷进行分析,我们需要我们编写的程序有什么样的功能: 1.从表面看扫雷的游戏本体仅仅是未知内容的方格,但其内部存在着众多反应周围雷数目的数字和雷。 2.在点击未知内容的方格后,方格会显现出我们需要的信息,并展开周围没有雷的方格。
分析过后,我们开始建立程序:
首先我么们先建立一个主函数作为我们整个程序的整体,如图。在这里,我们创立了两个源文件与一个头文件,并将所有的库函数放入头文件,使两个源文件只需要引用头文件即可,由此简化过程。
为了让文件的可玩性更高,我们为游戏设计一个目录,并使游戏在非玩家强制退出时循环进行,所以我们使用了do while 循环,并创建了一个函数menu()来表示我们的目录,然后使用switch分支语句来帮助玩家选择游玩或退出游
戏,此时我们游戏的主体main函数就搭建完了。 然后我们就可以开始搭建我们的游戏的内容了,由此我们创建了game()函数。根据游戏所需要的结构,我们能很自然的想到利用数组来达到棋盘状的游戏结构,由此我们先来创建棋盘。
我们将表面的棋盘表示为show,将棋盘的真实内容表示为mine,为了实现我们对棋盘的行与列的方便控制,我们定义了ROW、COL、ROWS、COLS分别用来表示行与列,此时ROWS与COLS的作用还不是很明显,我们随后分析。设计好棋盘后我们便需要对数组进行填充,以达到我们需要的效果,所以我们将’*‘赋值给show,将’0‘赋值给mine。为了实现上述效果,我们建立了函数InteBoard(char board[ROWS][COLS], int row, int col, char set),使数组board中的每一个字符都与set相同,如图:
随后我们开始对数组的打印,由此我们建立函数
void DisplayBoard(char board[ROWS][COLS], int row, int col),其主要内容为:
这样就完成了对数组的打印。
完成对数组的打印后,我们可以开始在数组mine中填充雷,由于雷是随机出现,我们需要达到随机的效果,这时我们需要引用rand函数和srand函数,所以就在头文件中加入了#include<stdlib.h>
与#include<time.h>,同时定义EASY_COUNT为雷的个数,主要内容如图:
随后我们创建函数SetBoard(char board[ROWS][COLS], int row, int col)来布置雷,如图:
由此,我们布置好了十颗雷,这时我们已经可以初步体验扫雷的乐趣了,但此时扫雷还缺少两个重要的作用,一是在mine中不为雷的棋格显示周围雷的个数,二是揭开一格时周围无雷的方格自动揭开接下来我们便实现这个过程。
我们首先来实现显示周围棋格的雷的数量,我们设立函数
int FindAround(char mine[ROWS][COLS], int x, int y),如图:
部分人可能认为这个过程有点冗杂,我们确实还有其他的办法,如图:
由此,我们完成了显示周围雷的数量,也可以发现,第一个求雷数量的方法相较于第二种其实并没有多么的麻烦,且思路较为简单。
接下来我们要完成下一个任务了,显示周围没有雷的格子,这需要我们利用递归来完成,如图:
随后再做个总结:
小结
在这套程序里我们利用了许多编程技巧,还用了一些小聪明,像利用ROWS与COLS来使原来9*9的棋盘变为11*11,防止在寻找周围雷时因为无数组报错。而编程实际上就是一个发现问题、分析问题、解决问题的过程,需要我们勤思善用,多加练习。