




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、计算机图形学课程设计报告VC+扫雷游戏的程序设计专业班级:小组成员: 指导老师:日 期:2012年12月24日1、需求分析本课程设计实现类似于Windows XP操作系统自带的扫雷游戏。该设计以Visual C+ 6.0为开发环境, Windows 7/XP为程序运行平台。在程序设计中,把整个雷区看成一个二维数组,把雷方块定义为具有所在雷区二维数组的行和列、当前状态、方块属性、历史状态的结构体,采用了MFC机制解决问题的方法。整个游戏程序包括了布雷、扫雷过程和结果三个阶段,在处理鼠标响应事件中伴随着GDI绘图。程序通过调试运行,实现简单的设计目标,满足扫雷游戏初学者的需要。 通过本课程设计,以
2、便更好的巩固计算机图形学相关知识,掌握课程设计基本的方法和技巧,同时增加同学之间的团队合作精神以及培养分析问题、解决问题的能力。2.总体设计2.1 功能概述扫雷游戏的游戏界面如图1所示。在这个界面中,由众多面积均等的小方块所组成的区域称之为雷区,雷区的大小由用户设置的游戏等级决定。玩家标定地雷周围雷数提示未知雷区玩家标定未知雷图1 游戏开始时,系统会在雷区中随机布下若干个地雷。安放地雷的小方块称之为雷方块,其他的称之为非雷方块。部署完毕后,系统会在其他非雷方块中填充一些数字。某一个具体数字表示与其紧邻的8个方块中有多少雷方块。玩家可以根据这些信息去判断是否可以鼠标点击方块,并把认为是地雷的方块
3、打上标识。当玩家将所有地雷找出后,其余的非雷方块区域都已打开,此时游戏结束。在游戏过程中,一旦错误地打开了雷方块则立即失败,游戏结束。 游戏规则总结: 开始:按左键开始游戏,按按钮或菜单重新开始。左键:按下时,是雷则结束,非雷则显示数字。数字:代表此数字周围一圈八格中雷的个数。右键:奇次按下表示雷,偶数按下表示对上次的否定。结束:左键按到雷结束,找出全部雷结束。在游戏开始后,雷区上方有两个计数器。右边的计数器显示用户扫雷所花费的总时间,以秒为单位;左边的计数器显示当前还剩余多少个雷方块。2.2 设计流程图开始初始化游戏绘制雷区绘制笑脸绘制计数器鼠标右键触发动作鼠标左键触发动作图13.详细设计3
4、.1界面设置在vc+运行环境下编写程序并调试,最终实现的游戏界面为图2所示,点击鼠标可开始游戏。图23.2功能设计3.2.1 布雷随即获取一个状态为非雷的点,将它的属性标志为雷,重复这样的工作,直到布下足够的雷为止,其流程图如图3所示。开始生成随机的雷方块的坐标(x,y)判断(x,y)区域是否已经布下雷在(x,y)区域布雷,修改状态数据判断是否布下所有雷结束否是是否图3在CMineWnd类中添加游戏的布雷模块的处理函数,其具体实现代码如下所示。void CMineWnd:LayMines(UINT row, UINT col)/埋下随机种子srand( (unsigned)time( NULL
5、 ) );UINT i, j;for(UINT index = 0; index uRow, m_pOldMine-uCol);if (m_uGameState = GS_WAIT)m_uBtnState = BUTTON_NORMAL;Invalidate();ReleaseCapture();return;/假若周围已经标识的雷周围真正的雷数,拓展if (m_pOldMine-uState != STATE_FLAG)OpenAround(m_pOldMine-uRow, m_pOldMine-uCol);if (ErrorAroundFlag(m_pOldMine-uRow, m_pOl
6、dMine-uCol)Dead(m_pOldMine-uRow, m_pOldMine-uCol);ReleaseCapture();return;else /如果游戏尚未开始,点击左键启动游戏if (m_uGameState = GS_WAIT) if (m_uTimer)KillTimer(ID_TIMER_EVENT);m_uTimer = 0;m_uSpendTime = 1;Invalidate();if (m_bSoundful) sndPlaySound(LPCTSTR)LockResource(m_pSndClock), SND_MEMORY | SND_ASYNC | SND
7、_NODEFAULT);/启动定时器m_uTimer = SetTimer(ID_TIMER_EVENT, 1000, NULL);/布雷LayMines(m_pOldMine-uRow, m_pOldMine-uCol);/改变游戏状态为运行/GS_RUNm_uGameState = GS_RUN;if (m_pOldMine-uOldState = STATE_NORMAL)/当该雷区域为正常未作标记才打开/如果该区域为雷,则死亡if (IsMine(m_pOldMine-uRow, m_pOldMine-uCol) Dead(m_pOldMine-uRow, m_pOldMine-uCo
8、l);ReleaseCapture();return;/不是雷的时候,获取其周围的雷数目around = GetAroundNum(m_pOldMine-uRow, m_pOldMine-uCol);/ 如果为空白区域,拓展,否则打开该区域(显示周围有多少雷数)if (around = 0) ExpandMines(m_pOldMine-uRow, m_pOldMine-uCol);else DrawDownNum(m_pOldMine, around);else if (m_pOldMine-uOldState = STATE_DICEY) /标志为“?”问号的时候m_pOldMine-uS
9、tate = STATE_DICEY;/判断是否为胜利if (Victory()Invalidate();ReleaseCapture();return;break;case GS_VICTORY:case GS_DEAD:ReleaseCapture();return;default :break;m_uBtnState = BUTTON_NORMAL;Invalidate();else /点击非雷区域if (m_uGameState = GS_WAIT | m_uGameState = GS_RUN)m_uBtnState = BUTTON_NORMAL;InvalidateRect(rc
10、Btn);ReleaseCapture();CWnd:OnLButtonUp(nFlags, point);/拓展操作的实现代码void CMineWnd:ExpandMines(UINT row, UINT col)UINT i, j;UINT minRow = (row = 0) ? 0 : row - 1;UINT maxRow = row + 2;UINT minCol = (col = 0) ? 0 : col - 1;UINT maxCol = col + 2;UINT around = GetAroundNum(row, col);/显示该区域的方块状态m_pMinesrowco
11、l.uState = 15 - around;m_pMinesrowcol.uOldState = 15 - around;/ “打开”该区域,重绘DrawSpecialMine(row, col);/对周围一个雷都没有的空白区域if (around = 0)for (i = minRow; i maxRow; i+) for (j = minCol; j uRow, m_pNewMine-uCol);elseswitch(m_pNewMine-uState) /普通状态case STATE_NORMAL:m_pNewMine-uState = STATE_FLAG;m_pNewMine-uO
12、ldState = STATE_FLAG;m_nLeaveNum-;break;/标记状态case STATE_FLAG:m_pNewMine-uState = STATE_DICEY;m_pNewMine-uOldState = STATE_DICEY;m_nLeaveNum+;break;/未知状态case STATE_DICEY:m_pNewMine-uState = STATE_NORMAL;m_pNewMine-uOldState = STATE_NORMAL;break;default: break;Invalidate();CWnd:OnRButtonDown(nFlags, p
13、oint);附录3:绘制雷区的函数代码void CMineWnd:DrawMineArea(CPaintDC &dc)CDC dcMemory; /用作内存设备 /源设备dcMemory.CreateCompatibleDC(&dc); /使得这个设备与dc兼容 /dc是目标设备dcMemory.SelectObject(m_bmpMine); /将内存设备与位图资源关联for (UINT i = 0; im_uYNum; i+) for (UINT j = 0; jm_uXNum; j+) /根据ij区域的雷方块状态拷贝相应的图像到ij雷区的特定区域dc.StretchBlt(MINEARE
14、A_FRAME_X+16*j, MINEAREA_FRAME_Y+16*i, 16, 16, &dcMemory, 0, 16*m_pMinesij.uState, 16, 16, SRCCOPY);附录4:雷区、笑脸按钮、3D效果外壳和数字图像的绘制代码void CMineWnd:OnPaint() CPaintDC dc(this); /创建一个CPaintDC类型的用以屏幕显示的dc设备 /参数是指向当前框架窗口CDC dcMemory;/ 内存设备CBitmap bitmap;/创建临时的位图资源if (!dc.IsPrinting() /判断不是使用打印机来进行绘制工作/ 使内存设备
15、与dc设备兼容if (dcMemory.CreateCompatibleDC(&dc)/ 使得bitmap与实际显示的dc设备兼容if(bitmap.CreateCompatibleBitmap(&dc,m_rcClient.right,m_rcClient.bottom)/ 内存设备选择物件位图dcMemory.SelectObject(&bitmap);/绘制背景框dcMemory.FillRect(&m_rcClient, &m_brsBG);DrawButton(CPaintDC&) dcMemory);/笑脸按钮绘图DrawNumber(CPaintDC&) dcMemory);/数
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 班级的一场比赛记事作文(12篇)
- 新兴产业技术发展趋势表
- 电影行业收入预测报告统计表
- 固废综合利用示范基地项目实施方案(参考范文)
- 学习中的一次挑战与成功记事并议论文(12篇)
- 我的英雄赞美身边英雄的话题作文14篇
- 体育设施与资源优化配置的实施路径
- 建筑设计理论实践练习题集
- 2025年艺术设计专业考试题及答案
- 2025年医学影像技术与临床应用的综合能力考试卷及答案
- GA/T 1535-2018生物检材中地芬诺酯检验液相色谱-质谱法
- FZ/T 12001-2015转杯纺棉本色纱
- 藤仓化成株式会社
- 化工设备操作工培训资料课件
- petrel RE详细培训资料
- 等级医院评审汇报课件
- 火场侦察和督查的组织与实施
- 2021年中日青年交流中心有限公司二十一世纪饭店校园招聘笔试试题及答案解析
- 小班语言课《水果歌》PPT
- TSG11-2020 锅炉安全技术规程
- 人才培养方案编写质量标准
评论
0/150
提交评论