毕业论文-基于Visual C++的新版扫雷游戏设计与实现_第1页
毕业论文-基于Visual C++的新版扫雷游戏设计与实现_第2页
毕业论文-基于Visual C++的新版扫雷游戏设计与实现_第3页
毕业论文-基于Visual C++的新版扫雷游戏设计与实现_第4页
毕业论文-基于Visual C++的新版扫雷游戏设计与实现_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、核准通过,归档资料。未经允许,请勿外传!9JWKffwvG#tYM*Jg&6a*CZ7H$dq8KqqfHVZFedswSyXTy#&QA9wkxFyeQ!djs#XuyUP2kNXpRWXmA&UE9aQGn8xp$R#m_uXNum = ADVANCE_XNUM;m_uYNum = ADVANCE_YNUM;m_uMineNum = ADVANCE_MINENUM;SetCheckedLevel();InitGame();Invalidate();SizeWindow();(2) 雷区大小的自定义实现首先新建一个自定义雷区对话框资源(IDD_DLG_CUSTOM),然后添加高度、宽度、雷数

2、三个静态文本控件和三个对应的(IDC_HEIGHT)、(IDC_WIDTH) 、(IDC_NUMBER)编辑框控件,最后将OK和Cancel按钮分别改名为“确定”和“取消”。结果如图4。图4 自定义雷区接着为该对话框创建CDlgCustom类,然后为三个编辑控件分别添加关联变量m_uHeight、m_uNumber、m_uWidth,最后为OK按钮创建命令消息处理函数OnOK(),代码如下所示。void CDlgCustom:OnOK() UpdateData();if (m_uWidth 30) m_uWidth = 30;if (m_uHeight 24) m_uHeight = 24;i

3、f (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);/ TODO: Add extra validation hereCDialog:OnOK();(3) 使用帮助的实现由于Windows 自带有扫雷游戏,所以直接调用它的使用手。为“使用帮助”菜单选项创建命令消息处理函数OnMemuHelpUse(),代码如下所示。显示

4、结果如图5所示。void CMineWnd:OnMemuHelpUse() ShellExecute(NULL,open,1.txt,NULL,NULL,SW_SHOW); 图5 使用帮助(4) 以往的记录每一次游戏破记录则将有关信息保存下来。显示结果如图6所示。图6 以往记录(5) 扫雷英雄榜的实现首先创建两个对话框模板,一个用作当用户胜利结束游戏并打破历史记录后弹出的签名记录对话框模板IDD_DLG_NEWRECORD,另外一个是用以显示以往最高的游戏记录的对话框模板IDD_DLG_HERO。如图7和图8所示。图7 记录对话框图8 排行榜然后为IDD_DLG_HERO对话框模板创建CDlg

5、Hero类,分别为编辑框控件添加关联变量m_szBHolder、m_szBRecord、m_szEHolder、m_szERecord、m_szIHolder、m_szIRecord,并将Cancel按钮的ID和标题分别改为IDC_RESET和重新计分,三个静态文本标题设置为初级记录、中级记录、高级记录,最后为重新计分按钮创建命令消息处理函数OnReset()和其他成员函数。对IDD_DLG_NEWRECORD对话框模板类似处理。3.3布雷,扫雷核心算法的设计与实现(1) 算法的设计把整个雷区看成一个二维数组,aij周围的雷个数是由如下8个雷区决定的(如果超出边界,应该再加以判断):ai-1j

6、-1, ai-1j, ai-1j+1,ai, aij+1,ai+1 j-1, ai+1j, ai+1j+1,在被展开时,检查周围的雷数是否与周围标示出来的雷数相等,如果相等则展开周围未标示的雷区。这样新的雷区展开又触发这个事件,就这样递归下去,一直蔓延到不可展开的雷区。(2) 核心算法的实现整个游戏程序包含3个阶段:布雷、扫雷过程和结果(并不是操作结果展示,而是在扫雷过程中,玩家通过与游戏交互后的操作结果展示)。首先定义雷方块的数据结构,具体描述如下所示。typedef struct UINT uRow; /所在雷区二维数组的行UINT uCol; /所在雷区二位数组的列UINT uState

7、; /当前状态UINT uAttrib; /方块属性UINT uOldState; /历史状态 MINEWND;/ 雷方块结构体然后定义雷方块的状态类别和属性类别。A 布雷随即获取一个状态为非雷的点,将它的属性标志为雷,重复这样的工作,直到布下足够的雷为止,其流程如图9所示。开始生成随机的雷方块的坐标(x,y)判断(x,y)区域是否已经布下雷在(x,y)区域布雷,修改状态数据判断是否布下所有雷结束否是是否图9 布雷流程在CMineWnd类中添加游戏的布雷模块的处理函数,该函数的实现如下。void CMineWnd:LayMines(UINT row, UINT col)/埋下随机种子srand

8、( (unsigned)time( NULL ) );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(

9、m_pOldMine-uRow, m_pOldMine-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_ME

10、MORY | SND_ASYNC | SND_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_pOldMin

11、e-uRow, m_pOldMine-uCol);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)/标志为

12、“?”问号的时候m_pOldMine-uState = 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_NOR

13、MAL;InvalidateRect(rcBtn);ReleaseCapture();CWnd:OnLButtonUp(nFlags, point);在函数体的开始部分,先用rcBtn和rcMineArea两个矩形变量存储游戏的用户提示区域位置中的笑脸图区域以及雷区域的位置。利用接口函数PtInRect()判断当前鼠标的位置(由参数point携带鼠标当前位置信息)是否在这两个区域内,如果检测到鼠标左键点击并释放在笑脸图的按钮区域rcBtn上,则调用初始化函数重新开始游戏,如果检测到鼠标左键点击并释放在雷区域rcMineArea,假若当前游戏状态处于已初始化完成但尚未开始的状态GS_WAIT时,

14、则打开计时器,并且调用LayMines()函数进行布雷,然后修改游戏状态为GS_RUN进入游戏。接着判断点击在小方块的状态是否被用于通过右键标记(可以标记为雷或者未知,此时游戏规则规定左键点击不生效),如果未标记,该状态为普通状态STATE_NORMAL时,先通过IsMine()检测是否点中地雷而失败地结束游戏,如果是,则调用函数Dead()来进行失败后的工作处理,反之对它进行打开显示与拓展操作。先通过GetAroundNum()函数获取当前小方块相邻的8个位置的雷数。如果当前小方块相邻区域的雷数为0,则可以向8个方向进行拓展,并显示该方块区域,直到不可拓展为止;如果当前小方块相邻区域的雷数不

15、为0,则显示该方块区域的相邻雷数,用作提供用户对其他位置的信息判断的提示。拓展操作的实现代码如下。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_pMinesrowcol.uState = 15 -

16、 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-uOldState = STATE

17、_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, point);3.4 绘图界面的

18、设计(1)雷区、笑脸模块的绘制添加三个位图资源如图13所示。 图13 位图的绘制ID分别为ID_BTN_COLOR、ID_MINE_COLOR、ID_NUM_COLOR,并分别添加三个位图类型的变量,然后调用LoadBitmap(UINT nIDResource)函数来实现位图资源与变量的关联并添加函数DrawButton()、DrawMineArea()、DrawNumber()分别实现笑脸按钮、雷区、数字图像(计时器数字和剩余雷数数字)的绘图。绘制雷区的函数DrawMineArea()的实现代码如下。绘制笑脸按钮的函数实现类似。void CMineWnd:DrawMineArea(CPai

19、ntDC &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(MINEAREA_FRAME_X+16*j, MINEAREA_FRAME_Y+16*i, 16, 16, &dc

20、Memory, 0, 16*m_pMinesij.uState, 16, 16, SRCCOPY);(2)3D效果外壳模块的绘制首先调用FillSolidRect()在框架的左部和顶部分别绘制2个小白条,这样看起来有点立体的,然后调用Draw3dRect()在笑脸以及计时显示区域周围绘上一个较小的3D边框,最后在雷区周围绘上一个较大的3D边框。3D效果外壳绘制结果显示如图16。(3) 数字模块的绘制数字图像的绘制不是由鼠标事件触发的,而是由系统时间触发的。首先在CMineWnd类中添加定时器标识的成员变量m_uTimer和一个记录游戏开始直到目前所花费的时间的成员变量m_uSpendTime。

21、接着在游戏的开始函数布下时间种子,时间间隔为1000us,然后选择到预定时间间隔后发送Windows命令消息函数WM_TIMER。接着在CMineWnd类中找到对应的消息WM_TIMER,并为其添加重写函数OnTimer(),该函数首先判断这次的WM_TIMER命令是否为所布下的时间种子到时而产生的,如果是则让使用的时间变量m_uSpendTime自增,然后通知系统重绘图像。雷区、笑脸按钮、3D效果外壳和数字图像的绘制都是在OnPaint()函数中实现的。其函数代码如下所示。void CMineWnd:OnPaint() CPaintDC dc(this); /创建一个CPaintDC类型的用

22、以屏幕显示的dc设备 /参数是指向当前框架窗口CDC dcMemory;/ 内存设备CBitmap bitmap;/创建临时的位图资源if (!dc.IsPrinting() /判断不是使用打印机来进行绘制工作/ 使内存设备与dc设备兼容if (dcMemory.CreateCompatibleDC(&dc)/ 使得bitmap与实际显示的dc设备兼容if(bitmap.CreateCompatibleBitmap(&dc,m_rcClient.right,m_rcClient.bottom)/ 内存设备选择物件位图dcMemory.SelectObject(&bitmap);/绘制背景框dc

23、Memory.FillRect(&m_rcClient, &m_brsBG);DrawButton(CPaintDC&) dcMemory);/笑脸按钮绘图DrawNumber(CPaintDC&) dcMemory);/数字图像绘图DrawShell(CPaintDC&) dcMemory);/3D效果外壳绘图DrawMineArea(CPaintDC&) dcMemory);/雷区绘图/ 将内存设备的内容拷贝到实际屏幕显示的设备dc.BitBlt(m_rcClient.left, m_rcClient.top, m_rcClient.right, m_rcClient.bottom, &d

24、cMemory, 0, 0, SRCCOPY);bitmap.DeleteObject();4 异常处理绘图过程大多放在OnDraw()或OnPaint()函数中,OnDraw()在进行屏幕显示时是由OnPaint()进行调用的。当窗口因为某种原因需要重绘时,总是先用背景色将显示区清除,然后才调用OnPaint(),而背景色往往与绘图内容反差很大,这样在短时间内背景色和显示图形的交替出现,使得显示窗口看起来会闪。对此可以使用内存设备环境来解决。用户可以把要显示的图形先在内存中绘制好,然后再一次性的将内存中的图形一个点一个点的覆盖到屏幕上去。在内存中绘图时,内存中的图像数据只作标识而没有显示效果

25、。当贴到屏幕上时,由于内存中最终的图形与屏幕上显示图形差别很小,所以看起来就不会闪了。 结 论毕业设计是本科学习阶段一次非常难得的理论与实际相结合的机会,通过这次比较完整的一个游戏的开发,我摆脱了单纯的理论学习状态,和实际设计的结合锻炼了我的综合运用所学的专业基础知识,解决问题的能力,同时也提高我查阅文献资料、对程序整体的把握等其他能力与水平,而且通过对整体的掌控,对局部的取舍,以及对细节的斟酌处理,都使我的能力得到了锻炼,经验得到了丰富。这些都我们都希望通过毕业设计所能达到的目标。在毕业设计过程中,在导师王老师的带领下,不断地对源程序进行改进与完善,增加了一些以往扫雷游戏所没有的功能。并且在

26、编写的过程中,各种组件的运用,各种算法的应用,各种控件的利用我都是随着毕业设计的不断深入而不断熟悉并逐步掌握的。和老师以及同学们的沟通交流跟使我对程序整体的规划与设计有了新的认识也对自己提出了新的要求。提高是有限的但也是全面的,正是这次设计让我积累了许多实际经验,也必然会让我在未来的工作学习中表现出更高的应变能力和理解能力。顺利如期的完成本次毕业设计给了我很大的信心,但是也让我看到了自己许多的不足,学习其实就是一个不断完善的过程,正视自己的不足之处,在以后的工作和学习中不断的弥补这些不足之处,在以后的工作中也要保持同样的态度,不断完善自己。致 谢经过几个月的不懈努力,我的毕业设计终于完成了。在

27、这里,首先要感谢的就是我的指导老师王留洋。在这次的毕业设计过程中,从酝酿、选题、撰写到定稿,我遇到了许许多多的问题,有许许多多的地方需要改善,王老师总是耐心的帮我分析,并凭借他多年的工作经验给我提供合理的解决方案,让我更好地完成扫雷游戏的编写。在此,要向我的指导老师王留洋老师表示最诚挚的敬意和最衷心的感谢。同时我也要感谢大学期间所有教导过我的老师们,是他们传授给我方方面面的知识,拓宽了我的知识面,培养了我的功底,对毕业设计的完成不无裨益。我还要感谢和自己生活在一起的同学们,并不是所有的问题都得麻烦王老师,在有些问题上同学给了我很大的帮助。另外还要感谢计算机工程学院所提供的优良的实验环境,让我很

28、好的锻炼了自己的实践能力。最后我还要感谢班主任这四年来对我的关心和培养,对我的学习和成长有着极为积极的作用。还有感谢陪伴了我的同学们,他们不仅在毕业设计上,而且在生活上给了我很大的帮助,正是由于有了他们的鼓励和帮助,我才能在遇到困难的时候坚持下来,在此衷心的感谢他们。参 考 文 献吴乃玲.C+程序设计.北京:人民邮电出版社,2008邝玲辉. 应用系统开发.北京:人民邮电出版社,2007罗齐.物流系统功能与构建战略分析.上海 200433 2003年第10期夏邦贵,郭胜等.Sql Server数据库开发入门与范例解析.北京:机械工业出版社,2004闪四清.数据库原理与应用教程.北京:清华大学出版

29、社,2004甘仞初. 信息系统开发.北京:经济科学出版社,2000陈禹.信息系统分析与设计.北京:电子工业出版社,2005 黄梯云.管理信息系统.北京:高等教育出版社,1999方美琪.软件开发工具.北京:经济科学出版社,200210. 王珊.数据组织与管理.北京:经济科学出版社,1996ag an employment tribunal clai Emloyment tribunals sort out disagreements between employers and employees. You may need to make a claim to an employment tri

30、bunal if: you dont agree with the disciplinary action your employer has taken against you your employer dismisses you and you think that you have been dismissed unfairly. For more informu, take advice from one of the organisations listed underFur ther help. Employment tribunals are less formal than

31、some other courts, but it is still a legal process and you will need to give evidence under an oath or affirmation. Most people find making a claim to an employment tribunal challenging. If you are thinking about making a claim to an employment tribunal, you should get help straight away from one of

32、 the organisations listed underFurther help. ation about dismissal and unfair dismissal, seeDismissal. You can make a claim to an employment tribunal, even if you haventappealedagainst the disciplinary action your employer has taken against you. However, if you win your case, the tribunal may reduce

33、 any compensation awarded to you as a result of your failure to appeal. Remember that in most cases you must make an application to an employment tribunal within three months of the date when the event you are complaining about happened. If your application is received after this time limit, the tri

34、bunal will not usually accept i. If you are worried about how the time limits apply to you If you are being represented by a solicitor at the tribunal, they may ask you to sign an agreement where you pay their fee out of your compensation if you win the case. This is known as adamages-based agreemen

35、t. In England and Wales, your solicitor cant charge you more than 35% of your compensationif you win the case. You are clear about the terms of the agreement. It might be best to get advice from an experienced adviser, for example, at a Citizens Advice Bureau. To find your nearest CAB, including tho

36、se that give advice by e-mail, click onnearest CAB. For more information about making a claim to an employment tribunal, seeEmployment tribunals. The (lack of) air up there Watch m Cay man Islands-based Webb, the head of Fifas anti-racism taskforce, is in London for the Football Associations 150th a

37、nniversary celebrations and will attend Citys Premier League match at Chelsea on Sunday. I am going to be at the match tomorrow and I have asked to meet Ya ya Toure, he told BBC Sport. For me its about how he felt and I would like to speak to him first to find out what his experience was. Uefa has H

38、YPERLINK http:/www.bbc.co.uk/sport/0/football/24654499 opened disciplinary proceedings against CSKAfor the racist behaviour of their fans during HYPERLINK http:/www.bbc.co.uk/sport/0/football/24615218 Citys 2-1 win. Michel Platini, president of European footballs governing body, has also ordered an

39、immediate investigation into the referees actions. CSKA said they were surprised and disappointed by Toures complaint. In a statement the Russian side added: We found no racist insults from fans of CSKA. Age has reached the end of the beginning of a word. May be guilty in his seems to passing a lot

40、of different life became the appearance of the same day; May be back in the past, to oneself the paranoid weird belief disillusionment, these days, my mind has been very messy, in my mind constantly. Always feel oneself should go to do something, or write something. Twenty years of life trajectory d

41、eeply shallow, suddenly feel something, do it.一字开头的年龄已经到了尾声。或许是愧疚于自己似乎把转瞬即逝的很多个不同的日子过成了同一天的样子;或许是追溯过去,对自己那些近乎偏执的怪异信念的醒悟,这些天以来,思绪一直很凌乱,在脑海中不断纠缠。总觉得自己似乎应该去做点什么,或者写点什么。二十年的人生轨迹深深浅浅,突然就感觉到有些事情,非做不可了。The end of our life, and can meet many things really do?而穷尽我们的一生,又能遇到多少事情是真正地非做不可? During my childhood, t

42、hink lucky money and new clothes are necessary for New Year, but as the advance of the age, will be more and more found that those things are optional; Junior high school, thought to have a crush on just means that the real growth, but over the past three years later, his writing of alumni in peace,

43、 suddenly found that isnt really grow up, it seems is not so important; Then in high school, think dont want to give vent to out your inner voice can be in the high school children of the feelings in a period, but was eventually infarction when graduation party in the throat, later again stood on th

44、e pitch he has sweat profusely, looked at his thrown a basketball hoops, suddenly found himself has already cant remember his appearance. Baumgartner the disappointing news: Mission aborted. r plays an important role in this mission. Starting at the ground, conditions have to be very calm - winds le

45、ss than 2 mph, with no precipitation or humidity and limited cloud cover. The balloon, with capsule attached, will move through the lower level of the atmosphere (the troposphere) where our day-to-day weather lives. It will climb higher than the tip of Mount Everest (5.5 miles/8.85 kilometers), drifting even higher than the cruising altitude of commercial airliners (5.6 miles/9.17 kilometers) and into the stratosphere. As he crosses the boundary layer (called the tropop

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论