用VC设计与实现扫雷系统.docx
- 文档编号:3138301
- 上传时间:2022-11-17
- 格式:DOCX
- 页数:11
- 大小:147.53KB
用VC设计与实现扫雷系统.docx
《用VC设计与实现扫雷系统.docx》由会员分享,可在线阅读,更多相关《用VC设计与实现扫雷系统.docx(11页珍藏版)》请在冰豆网上搜索。
用VC设计与实现扫雷系统
用VC++实现扫雷游戏程序
学生姓名:
尹一笑指导老师:
颜宏文
摘要:
本课程设计实现类似于Windows操作系统自带的扫雷游戏。
在课程设计中,系统开发平台为WindowsXP,程序设计语言采用VisualC++,程序运行平台为Windows2000/XP。
在程序设计中,把整个雷区看成一个二维数组,把雷方块概念为具有所在雷区二维数组的行和列、当前状态、方块属性、历史状态的结构体,采用了MFC机制解决问题的方式。
整个游戏程序包括了布雷、扫雷进程和结果三个阶段,在处置鼠标响应事件中伴随着GDI画图。
程序通过调试运行,实现了设计目标,能够同时知足扫雷游戏初学者和高手的需要。
关键词:
扫雷游戏程序设计VisualC++GDI画图
扫雷游戏历史
VisualC++
GDI原理基础
2需求分析
1功能概述
扫雷游戏的游戏界面如图所示。
在那个界面中,由众多面积均等的小方块所组成的区域称之为雷区,雷区的大小由用户设置的游戏品级决定。
图
游戏开始时,系统会在雷区的某些小方块中随机布下若干个地雷。
安放好地雷的小方块称之为雷方块,其他的称之为非雷方块。
部署完毕后,系统会在其他非雷方块中填充一些数字。
某一个具体数字表示与其紧邻的8个方块中有多少雷方块。
玩家能够按照这些信息去判断是不是能够打开某些方块,并把以为是地雷的方块打上标识。
当玩家将所有地雷找出后,其余的非雷方块区域都已打开,现在游戏结束。
在游戏进程中,一旦错误地打开了雷方块则当即失败,游戏结束;当玩家标识的地雷数超进程序设定,虽然打开了全数其余方块,游戏仍然不会结束。
在游戏开始后,雷区上方有两个计数器。
右边的计数器显示用户扫雷所花费的总时刻,以秒为单位;左侧的计数器显示当前还剩余多少个雷方块。
本课程设计实现类似于Windows操作系统自带的扫雷游戏。
游戏需要提供一个菜单栏,上面有不同的相关选项,如游戏的开始、难度设置、退出等。
按功能将游戏区域分成两个区域:
雷区和提示区。
提示区包括两个计数器和一个按键操作结果图像提示。
游戏进程中,当玩家用鼠标点击相应的方块,程序就会作出相应的鼠标响应事件,并伴随着GDI画图,而众多鼠标事件的处置,都是围绕实在现扫雷程序的算法而衍生的。
系统总框图及每一个模块的设计分析
二、框架的搭建
3、菜单的制作
4、布雷,扫雷核心算法的实现
五、界面的制作
3整体设计
游戏框架的搭建
3.1.1工程项目的创建
利用应用程序向导创建一个名称为Mine的工程项目。
由于不需要诸如工具栏、状态栏等功能,而且扫雷游戏的框架是不允许改变窗口大小的,所以在向导的第四步里面把所有的选项置空,然后点击“Advanced”按钮,在弹出的对话框当选中“WindowsStyles”选项卡,将“Maximizebox”项置空,其他均利用默许设置。
3.1.2框架的改造
通过类向导添加一个继承于CFrameWnd的类,命名为CMineWnd,删除CMineDoc、CMineView和CAboutDlg类,将CMineWnd类代替CFrameWnd,让程序启动的时候以此窗口为主窗口予以显示。
结果如图。
图
菜单的制作
参考Windows自带的扫雷游戏,创建出“游戏”和“帮忙”菜单,然后通过菜单资源编辑器设定菜单的功能选项,包括难度级别的选择、颜色和音效是不是开启、扫雷英雄榜、利用手册、关于软件的信息等。
具体的菜单选项别离如图。
3.2.1难度级别的选择
不同的难度级别有不同的雷区大小和不同的布雷数量,所以通过宏概念预概念不同级别的横向方块数量、纵向方块数量和雷数。
并将该宏概念放入新建的头文件“”中。
窗口除雷区外至少还包括蓝色窗口边缘Frame_wide、白色的视觉效果区line_wide、3D的外壳边框3D_line_wide、雷区mine_area_wide等。
于是还需要概念关于位置的宏变量。
由于难度级别的不同,窗口大小也会随之改变,因此通过在CMineWnd类增加一个改变窗口大小的函数SizeWindow()去实现。
通过ClassWizard别离选择“低级”、“中级”和“高级”菜单资源ID,为它们添加处置函数OnMenuPrimary()、OnMenuSecond()、OnMenuAdvance()。
OnMenuAdvance()的实现如下,另外两个类似。
voidCMineWnd:
:
OnMenuAdvance()
{
m_uLevel=LEVEL_ADVANCE;
m_uXNum=ADVANCE_XNUM;
m_uYNum=ADVANCE_YNUM;
m_uMineNum=ADVANCE_MINENUM;
SetCheckedLevel();
InitGame();
Invalidate();
SizeWindow();
}
3.2.2雷区大小的自概念实现
第一新建一个自概念雷区对话框资源(IDD_DLG_CUSTOM),然后添加高度、宽度、雷数三个静态文本控件和三个对应的(IDC_HEIGHT)、(IDC_WIDTH)、(IDC_NUMBER)编辑框控件,最后将OK和Cancel按钮别离更名为“肯定”和“取消”。
如图
接着为该对话框创建CDlgCustom类,然后为三个编辑控件别离添加关联变量m_uHeight、m_uNumber、m_uWidth,最后为OK按钮创建命令消息处置函数OnOK(),代码如下所示。
voidCDlgCustom:
:
OnOK()
{
UpdateData();
if(m_uWidth<9)m_uWidth=9;
if(m_uWidth>30)m_uWidth=30;
if(m_uHeight<9)m_uHeight=9;
if(m_uHeight>24)m_uHeight=24;
if(m_uNumber<10)m_uNumber=10;
if(m_uNumber>m_uWidth*m_uHeight)m_uNumber=m_uWidth*m_uHeight-1;
CMineWnd*pMine=(CMineWnd*)AfxGetMainWnd();
pMine->SetCustom(m_uWidth,m_uHeight,m_uNumber);3.2.33.2.43.2.53.3.13.3.2
Attrib!
=ATTRIB_MINE)
{
m_pMines[i][j].uAttrib=ATTRIB_MINE;
State=15-around;
m_pMines[row][col].uOldState=15-around;
State==STATE_NORMAL
&&m_pMines[i][j].uAttrib!
=ATTRIB_MINE)
{
if(!
IsInMineArea(i,j))continue;
ExpandMines(i,j);
3.3.1
State,16,16,SRCCOPY);
}
}
}
3D效果外壳模块的绘制
第一挪用FillSolidRect()在框架的左部和顶部别离绘制2个小白条,如此看起来有点立体的,然后挪用Draw3dRect()在笑脸和计时显示区域周围绘上一个较小的3D边框,最后在雷区周围绘上一个较大的3D边框。
3.3.3数字模块的绘制
数字图像的绘制不是由鼠标事件触发的,而是由系统时刻触发的。
第一在CMineWnd类中添加按时器标识的成员变量m_uTimer和一个记录游戏开始直到目前所花费的时刻的成员变量m_uSpendTime。
接着在游戏的开始函数布下时刻种子,时刻距离为1000us,然后选择到预按时刻距离后发送Windows命令消息函数WM_TIMER。
接着在CMineWnd类中找到对应的消息WM_TIMER,并为其添加重写函数OnTimer(),该函数第一判断这次的WM_TIMER命令是不是为所布下的时刻种子到时而产生的,若是是则让利用的时刻变量m_uSpendTime自增,然后通知系统重画图像。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VC 设计 实现 扫雷 系统