基于VC的扫雷游戏开发
1. 引言:
1.1 背景:
“扫雷”是Windows操作系统自带的一款小游戏,以其简约的界面而不失逻辑推理的玩法深得广大玩家的喜爱。该游戏通过左键打开安全的格子,格子上的数字表明了在此格周围的八个格子中地雷的总数;用右键标记地雷、待定地雷;双击已开的格子自动开出周围八个未开格子。将所有非雷格子全部打开则游戏成功,开到有雷格子则游戏失败。
1.2 开发环境与工具:
在VisualC++6.0开发环境下,用C语言以及从easyX图形库下载的扩充库<graphics.h>、标准输入输出库<stdio.h>、屏幕处理库<conio.h>、日期和时间头文件<time.h>、多媒体相关应用程序接口"winmm.lib"、Windows7扫雷音效文件等完成此次开发。
1.3 意义:
虽然并没有涉及到优秀的游戏编程语言C++或JAVA,也没有利用可观的界面框架MFC,没有载入任何漂亮的图片。用的只是最基础的C语言,去操控着整个游戏画面的形成,都是用最简单的函数一点点地勾勒出来的界面,而算法方面也是经过了精心的策划最终敲定的。这个过程中锻炼了我们的编程能力。
2. 总体构架与分析:
2.1 设计流程:
游戏整体设计思路即从三大方面展开:界面与鼠标、算法、优化。下图简单表明了大概的设计流程。
2.2 ※基本思路与算法:
首先需要建立这个9X9表格,利用二维数组map[9][9]存储每个格子的情况(1就是有雷,0就是无雷,当然这里用宏定义可以提高可读性,作为初学者我们务必要遵循这些良好的习惯,因此用MINE和NOMINE表示有无雷),另外还建立了一个_map[9][9]存储格子状态,由右键控制其变化(2就是未翻,3就是已翻,4就是标记,5就是待定)。当玩家左击下去,利用鼠标捕获函数获得用户点击的坐标(x,y)然后将它转换成数组下标(这样就实现了界面到代码化的过度)会出现两种情况,有雷与无雷,有雷则直接失败,无雷又分9种情况(编一个判断函数judge()(后面会详细介绍):以点击的这个格子为中心搜索周围8个的情况累计总数)。周围有0—8个雷,当是1-8个雷的时候则只会在你点下去的格子上显示数字并不会延展(这是最简单的情况也是递归的出口!),但当是0个的时候,则要进入递归去搜索以周围8个格子“各自”为中心的雷数情况。而这8个格子每个格子又都套用刚才“点击那个格子”的方法去计算他们各自周围的雷数。依次类推,而递归必须要出口,这个出口就是直到递归到表格的边界或递归到一个有数字的格子(可以从Windows上的扫雷的边缘观察,看是不是这样的)。另外还有开格函数open()(后面会详细介绍),它也嵌套调用了judge()函数,只不过添加了一些更为复杂的判断。至此,扫雷的基本思路就已经理清了。
2.3 头文件、宏定义、所有函数声明、全局变量:
2.4 主函数框架:main()
主函数中用initgraph(640,480)创建一个640*480大小的图形窗口,包含对界面的初始化函数menu() stop(),以及定义类MOUSEMSG(其中用到了对象的坐标、以及鼠标信息(左键、右键、双击)),再在whlie(true)永真循环内对鼠标的时时捕获函数GetMouseMsg(),随时锁定了用户鼠标的所在位置。如果鼠标落在事先设定好的“难度方块”范围内则用move()函数伸展出9X9 16X16的选择方块,在extend()函数中进一步对用户的鼠标进行捕获。而如果鼠标落在事先设定好的“退出方块”范围内则closegraph()退出操作系统。如此以来,会形成多重永真循环,在未到达出口时(即没有扫到雷或者用户没有主动点击退出),那么是在游戏的进行阶段,当到达出口时(即用户扫到雷或者扫雷成功或主动点击退出),那么将调用MessageBox()函数询问用户是否要重来,是的话则嵌套调用extend()函数重新开始,否则退出操作系统。
2.5 ※游戏正式开始函数框架:extend())
3. 开场界面:此界面被封装在int first()函数中,当用户按下任意键时返回1,主函数响应其值,进入游戏主界面。
3.1 自弹音乐:随着用Beep()函数编写的的背景音乐“星之所在”的响起,
屏幕逐渐打印出如下图示。(此部分代码单独编写在“音符.cpp”文件中)