计算机图形学课程的设计——扫雷游戏程序的设计
《计算机图形学》课程设计报告
VC++扫雷游戏的程序设计
专业班级:
小组成员:
指导老师:
日 期:2012年12月24日
1、需求分析
本课程设计实现类似于Windows XP操作系统自带的扫雷游戏。该设计以Visual C++ 6.0为开发环境
图1
游戏开始时,系统会在雷区中随机布下若干个地雷。安放地雷的小方块称之为雷方块,其他的称之为非雷方块。部署完毕后,系统会在其他非雷方块中填充一些数字。某一个具体数字表示与其紧邻的8个方块中有多少雷方块。玩家可以根据这些信息去判断是否可以鼠标点击方块,并把认为是地雷的方块打上标识。当玩家将所有地雷找出后,其余的非雷方块区域都已打开,此时游戏结束。在游戏过程中,一旦错误地打开了雷方块则立即失败,游戏结束。
游戏规则总结:
● 开始:按左键开始游戏,按按钮或菜单重新开始。
●左键:按下时,是雷则结束,非雷则显示数字。
●数字:代表此数字周围一圈八格中雷的个数。
●右键:奇次按下表示雷,偶数按下表示对上次的否定。
●结束:左键按到雷结束,找出全部雷结束。
在游戏开始后,雷区上方有两个计数器。右边的计数器显示用户扫雷所花费的总时间,以秒为单位;左边的计数器显示当前还剩余多少个雷方块。
2.2 设计流程图
图1
3.详细设计
3.1界面设置
在vc++运行环境下编写程序并调试,最终实现的游戏界面为图2所示,点击鼠标可开始游戏。
图2
3.2功能设计
3.2.1 布雷
随即获取一个状态为非雷的点,将它的属性标志为雷,重复这样的工作,直到布下足够的雷为止,其流程图如图3所示。
图3
在CMineWnd类中添加游戏的布雷模块的处理函数,其具体实现代码如下所示。
void CMineWnd::LayMines(UINT row, UINT col)
{
//埋下随机种子
srand( (unsigned)time( NULL ) );
UINT i, j;
for(UINT index = 0; index < m_uMineNum;)
{
//取随即数
i = rand() % m_uYNum;
j = rand() % m_uXNum;
if (i == row && j == col) continue;
if(m_pMines[i][j].uAttrib != ATTRIB_MINE)
{m_pMines[i][j].uAttrib = ATTRIB_MINE;//修改属性为雷
index++;}
}
}
3.2.2扫雷
3.2.2.1鼠标左击事件
其流程如图4所示。
图4
当鼠标左键点击雷区域,并且该区域不是雷方块,需要进行打开以及拓展工作。流程如图5所示。
图5
鼠标左键点击事件的关键代码详见附录2所示。
在函数体的开始部分,先用rcBtn和rcMineArea两个矩形变量存储游戏的用户提示区域位置中的笑脸图区域以及雷区域的位置。利用接口函数PtInRect()判断当前鼠标的位置(由参数point携带鼠标当前位置信息)是否在这两个区域内,如果检测到鼠标左键点击并释放在笑脸图的按钮区域rcBtn上,则调用初始化函数重新开始游戏,如果检测到鼠标左键点击并释放在雷区域rcMineArea,假若当前游戏状态处于已初始化完成但尚未开始的状态GS_WAIT时,则打开计时器,并且调用LayMines()函数进行布雷,然后修改游戏状态为GS_RUN进入游戏。接着判断点击在小方块的状态是否被用于通过右键标记(可以标记为雷或者未知,此时游戏规则规定左键点击不生效),如果未标记,该状态为普通状态STATE_NORMAL时,先通过IsMine()检测是否点中地雷而失败地结束游戏,如果是,则调用函数Dead()来进行失败后的工作处理,反之对它进行打开显示与拓展操作。先通过GetAroundNum()函数获取当前小方块相邻的8个位置的雷数。如果当前小方块相邻区域的雷数为0,则可以向8个方向进行拓展,并显示该方块区域,直到不可拓展为止;如果当前小方块相邻区域的雷数不为0,则显示该方块区域的相邻雷数,用作提供用户对其他位置的信息判断的提示。拓展操作的实现代码见附录2。
经过打开或拓展后,最后通过Victory()判断游戏是否已经胜利结束,如果是则作胜利处理。
3.2.1.2鼠标右击事件
其流程如图6所示。
图6
其实现代码详见附录3所示。
3.2.3 绘图界面的设计
3.2.3.1雷区、笑脸模块的绘制
添加三个位图资源如图7所示。
图7
ID分别为ID_BTN_COLOR、ID_MINE_COLOR、ID_NUM_COLOR,并分别添加三个位图类型的变量,