高级编程技术课程实验报告班级通信一班姓名陈远春学号201100120084课程实验内容扫雷游戏,是Windows操作系统自带的一款经典游戏。
其规则简单,上手容易,不论男女老少皆可娱乐。
扫雷的目的就是要把所有非地雷的格子揭开即胜利。
踩到地雷格子就算失败。
设计的扫雷游戏应包含以下功能:能够显示主菜单和界面;能够接收鼠标输入功能;能够根据规则翻转相应的格子;能够标记指定格子的功能;游戏胜负判断功能;游戏支持背景音乐功能;游戏提供帮助说明。
设计分工安排本程序由三人共同完成。
其中我主要负责程序代码编写调试和上台讲解方面的工作。
其余两个主要负责游戏设计部分模块的工作。
一、系统概述扫雷游戏,是Windows操作系统自带的一款经典游戏。
其规则简单,上手容易,不论男女老少皆可娱乐。
扫雷的目的就是要把所有非地雷的格子揭开即胜利。
踩到地雷格子就算失败。
本设计的扫雷游戏包含以下功能:能够显示主菜单和界面;能够接收鼠标输入功能;能够根据规则翻转相应的格子;能够标记指定格子的功能;游戏胜负判断功能;英雄榜记录更新;游戏支持背景音乐功能;游戏提供帮助说明。
二、需求分析随着世界经济的长足发展和计算机技术的日益成熟,计算机被应用到人类活动的各个领域,各种应用软件也相继问世,这其中有相当一部分是游戏软件。
使用游戏软件自然是为了满足人们对娱乐性的要求,而有些软件大都采用3D设计对系统配置的要求较高。
在众多游戏软件中,也不乏一些小游戏的身影,它们对系统的配置要求较低。
能够满足人们对娱乐性的需求,是人们在完成工作娱乐时候的最好选择。
在各种操作系统中都附带了一些小的游戏,而这些游戏也成为电脑用户软件中不可或缺的一部分。
扫雷游戏是比较经典的一款小游戏,过去的几年里Windows操作系统历经数次换代,变得越来越庞大、复杂,但这个可爱的小游戏在任何版本的Windows操作系统里去却依然保持着原貌。
但几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。
三、设计思路在设计之前,我们先来了解这款游戏的规则:在不打开任何藏有地雷的格子情况下,以最快的速度找出所有的地雷。
如果在打开格子的过程中,不小心翻开(踩到)藏有地雷的格子,则宣告失败(游戏结束),惟有将所有不含地雷的格子打开,游戏才算成功。
游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的格子按下左键时即表示翻开格子,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按下右键则格子会以未标示→标示→疑似三者关系不断循环。
游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个格子内所含的地雷数,假若翻开的格子显示数字“3”,则表示以其为中心的周边格子内藏有3个地雷。
四、模块功能介绍和程序流程图(1)游戏共由四个类和一个模块组成,如图1所示。
主界面对话框类:主要负责主界面、菜单及各个窗口类对象的创建和调用等处理。
扫雷窗口类:主要负责接收玩家鼠标输入的打开格子位置、格子变换、花费时间及地雷格子的显示等处理。
英雄榜对话框类:主要负责游戏等级记录的更新。
背景音乐播放模块:主要负责游戏中背景音乐的播放。
帮组对话框类:主要负责帮助提示的显示及其它显示功能。
扫雷游戏主界面对话框类扫雷窗口类英雄榜对话框类背景音乐播放模块帮助对话框类图1 游戏主要类结构(2)游戏主界面的设计扫雷的游戏主界面设计,如图2所示。
游戏界面菜单地雷个数开始按钮花费时间图2 设计的游戏主界面(3)游戏主菜单结构的设计扫雷的游戏菜单设计,如图3所示。
扫雷游戏游戏设置游戏帮助开始退出背景音乐帮助关于图3 设计的游戏菜单结构 (4)程序流程图扫雷游戏程序流程图,如图4所示。
图4 程序流程图五、设计主要模块代码分析(1)游戏菜单的实现在扫雷游戏中,通过如下几个步骤即可实现添加游戏的菜单。
(1)在扫雷游戏工程的资源中添加一个菜单资源(2)给每个菜单栏添加响应函数到CMineDlg 类中。
(3)菜单响应函数的实现,如以下代码。
BOOL CMineDlg::OnInitDialog()//初始化对话框void CMineDlg::OnOK() //单击“确认”按钮响应函数void CMineDlg::OnCancel() //单击“退出”按钮响函数void CMineDlg::OnAbout() //关于菜单栏响应函数void CMineDlg::OnExitGame() //退出菜单栏响应函数void CMineDlg::OnHelp() //帮助菜单栏响应函数void CMineDlg::OnPlayMusic() //背景音乐菜单栏响应函数void CMineDlg::OnStartGame() //调用游戏开始接口函数void CMineDlg::InitMenu()//初始化菜单函数(2)游戏播放背景音乐的实现播放游戏背景音乐,是通过调用Windows的API函数sndPlaySound()来实现的。
当玩家选择“游戏设置”|“播放音乐”命令时,就播放音乐。
相反,如果取消,就停止播放音乐。
要实现这个功能,需要如下几步:实现CMineDlg类中的PlayBackMusic()成员函数实现CMineDlg类中的PlayBackMusic()成员函数实现void CMineDlg::PlayBackMusic(BOOL bCheck){ //指定文件并播放if(bCheck){ //播放指定音乐文件sndPlaySound("music.wav",SND_ASYNC);}else{ //停止播放sndPlaySound(NULL,SND_PURGE);}}(3)地雷格子模块的设计与实现地雷格子的处理是扫雷游戏的核心内容,包括如下几个部分。
1.地雷铺设模块。
游戏中的地雷是随机铺设的,可以调用随机数发生函数生成随机数。
利用随机数去除最大行数或者最大列数,得到放置地雷行列坐标。
然后分别防止地雷到不同的行和列的格子中去。
2.自动打开周围不是地雷的格子。
在游戏中,当玩家单击的格子周围没有地雷格子时,就需要程序自动地把周围的格子自动打开来提高玩家的效率。
3.获得周围地雷个数模块。
在游戏中当玩家打开一个格子时,如果当前这个格子不是地雷,那么其一定是标明周围的地雷个数的格子。
要实现这个功能主要是通过遍历当前格子周围的3×3范围的数组。
当找到一个元素状态是地雷时,就把记录增加1,知道九个格子全部找完。
/*在雷区铺设地雷*/void CMyMine::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 = A TTRIB_MINE;}}}/*自动打开相关不是地雷的格子*/void CMyMine::ExpandMines(UINT row, UINT col)UINT CMyMine::GetAroundNum(UINT row, UINT col);//获得周围地雷个数UINT CMyMine::GetAroundFlags(UINT row, UINT col);//得到周围格子状态/*地雷判断*/BOOL CMyMine::IsMine(UINT row, UINT col){ //比较指定数据是否是地雷return (m_pMines[row][col].uAttrib == ATTRIB_MINE);}/*雷区判断*/BOOL CMyMine::IsInMineArea(UINT row, UINT col){ //判断是否是在地雷区以内return (row >= 0 && row < m_uYNum && col >= 0 && col < m_uXNum);}(4)游戏规则模块的设计与实现游戏规则模块的实现,主要由游戏胜利和游戏结束判断函数组成。
通过对游戏的结果进行判断,实现扫雷游戏的规则。
1. 游戏胜利的判断通过遍历整个地雷数组,查找是否全部的地雷格子已经被标记或者找出来。
如果已经全部被找出来或者标示出来,那么说明玩家胜利。
反之,说明玩家未胜利,需要继续游戏。
2.游戏结束的判断当玩家打开一个格子时,就对当前格子进行判断。
如果是地雷,说明玩家不幸踩雷。
游戏以失败结束。
void CMyMine::Dead(UINT row, UINT col); //游戏结束AfxMessageBox("您踩到地雷了,游戏结束");/*获得胜利*/BOOL CMyMine::Victory(); //获得胜利.(5)游戏绘图模块的设计与实现在扫雷游戏中,通过绘图模块要实现地雷、格子、地雷个数、当前时间及控制按钮等图片和信息的提示。
1.绘按钮函数绘按钮函数,主要通过在游戏中不断地得到当前游戏的状态。
根据这个按钮,在按钮图片中把指定的坐标范围图片绘制到主界面上。
2.绘数字区域函数剩余地雷个数和消耗时间的数字显示,主要通过一定的算法,得到当前地雷剩余个数和已经消耗时间的个位、十位和百位数字把相应的数字图片绘制到指定的区域。
3.绘雷区函数绘雷区函数,是通过遍历当前雷区数组,并根据当前元素所代表的类型不同,将不同的图片绘制到位置。
void CMyMine::DrawButton(CPaintDC &dc) ;void CMyMine::DrawNumber(CPaintDC &dc) //画地雷数字void CMyMine::DrawMineArea(CPaintDC &dc) //画地雷区域六、设计结果显示与测试该测试主要是测试游戏的菜单和界面显示是否成功,其测试步骤如下。
(1)运行扫雷程序,选中其中的.exe 图标。
(2)程序启动后,其菜单及主界面如图所示,并可开始点击鼠标测试鼠标输入功能。