毕业论文设计-基于C++的扫雷游戏设计与实现38822.doc

上传人:yyf 文档编号:3941091 上传时间:2019-10-10 格式:DOC 页数:35 大小:1.01MB
返回 下载 相关 举报
毕业论文设计-基于C++的扫雷游戏设计与实现38822.doc_第1页
第1页 / 共35页
毕业论文设计-基于C++的扫雷游戏设计与实现38822.doc_第2页
第2页 / 共35页
毕业论文设计-基于C++的扫雷游戏设计与实现38822.doc_第3页
第3页 / 共35页
毕业论文设计-基于C++的扫雷游戏设计与实现38822.doc_第4页
第4页 / 共35页
毕业论文设计-基于C++的扫雷游戏设计与实现38822.doc_第5页
第5页 / 共35页
点击查看更多>>
资源描述

《毕业论文设计-基于C++的扫雷游戏设计与实现38822.doc》由会员分享,可在线阅读,更多相关《毕业论文设计-基于C++的扫雷游戏设计与实现38822.doc(35页珍藏版)》请在三一文库上搜索。

1、武汉理工大学C+课程设计基于C+的经典扫雷游戏程序设计目录摘 要31、引言41.1 课题背景及意义41.2 Visual C+ 发展概况5 1.3关于本课题62、游戏的总体分析与设计72.1 游戏功能简介72.2设计构想72.3流程规划83、扫雷游戏的具体实现过程93.1扫雷游戏模块的实现9 3.1.1 扫雷游戏主窗体的创建9 3.1.2 主界面控制菜单的设计133.2扫雷游戏核心-布雷算法设计133.3 扫雷鼠标事件的处理203.4扫雷其它处理27 3.4.1 难度设置菜单消息处理27 3.4.2 背景音乐菜单消息处理28 3.4.3其它处理294、扫雷游戏程序的调试与运行295、扫雷游戏设

2、计总结316、致谢317、参考文献32摘要游戏业发展一日千里,该行业极大的影响和改变了人们的生活和娱乐方式,游戏为消费者提供丰富多彩的虚拟空间,使消费者可以自由自在的享受虚拟世界的乐趣,实现自己在现实生活着那个可能永远不能实现的梦想,满足了消费者的心理和精神需求。扫雷游戏是Windows操作系统自带的一个小游戏,过去的几年里Windows操作系统历经数次换代,变得越来越庞大、复杂,但这个可爱的小游戏在任何版本的Windows操作系统里去却依然保持着原貌。但几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多不同算法和语言实现,如C,C

3、+,VB,JAVA等。本论文研究的是以Visual C+ 6.0为开发环境,设计并开发一款扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏。论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作,而清除未靠近地雷区方块由于引进了“递归”这个概念而使其简单化。关键字:扫雷;Visual C+ 6.0;事件;递归AbstractGame industry develops by l

4、eaps and bounds,and it has a great impact on the way people live and entertainment, games provide consumers with a variety of virtual space, so that consumers can enjoy the free fun of the virtual world, achieve the dream that may never achieve in real life, and satisfy the psychological and spiritu

5、al needs consumer.The Sweep Mine Game is a small game that the Windows operating system have. Over the past few years the Windows operating system has experienced a number of chang,and become much larger and more complexed. However, this lovely game in any version of the Windows operating system has

6、 keep the original appearance. Almost every computer users have come into contact with it, and love this game.The Sweep Mine Game is an classical little game, and there are many ways can achieve it,we can use many different algorithms and languages,such as C,C+,VB,JAVA and so on.This study is based

7、on Visual C+ 6.0 to designed and made the sweep mine game,its function is similar to the game that the Windows operating system has. First we introduced the whole idea of making the game and the process planning of the game design,then introduced the method of the layout of minefields and mines rand

8、omly generated. And focuses on the process of dealing with the incident in the game, among them, the mouse events and clearance of unexploded landmines around the box are the two most important thing, the mouse events is to use the message that the mouse give to understand the the users intent, then

9、 make the corresponding action, and clearance of unexploded landmines around the box has became simply with the introduction of the recursive .Key words: Sweep Mine, Visual C+ 6.0, Affairs, Recursion1 引言1.1 课题背景及意义 当前随着计算机的深入普及,越来越多的人有了个人电脑,人们运用计算机完成许多重要的工作,计算机在人们的生活中变的越来越来重要。随着计算机的应用和发展计算机已经不单纯是一个工

10、作工具,人们越来越重视计算机的娱乐性了,近年来游戏产业规模持续成长,全球每年游戏业总产值已经突破200亿美金,远远超越好莱坞电影产业以及音乐娱乐事业,而成为目前娱乐事业的最大主流。不过游戏产业光鲜亮丽的背后,却也隐含着高风险、高成本的危机,显示游戏产业慢慢步入“微利时代”。目前整个游戏产业的运作模式已经跟好莱坞电影产业的运作模式相同,电影产业有制片、发行、宣传等分工,游戏产业亦同,由专业的游戏研发小组负责研发游戏,也有如微软、美商艺电这类国际级大厂负责游戏发行,甚至连“游戏制作人”也被培养成明星一样成为一种招牌,如任天堂有王牌制作人宫本茂、SEGA有铃木裕、KONAMI有小岛秀夫、CAPCOM

11、有三上真司、TECMO有板垣伴信.等,明确的游戏产业分工的确有助于游戏产业的规模发展与进化,但也无形中让游戏开发成本大增。为了降低游戏开发成本,开发娱乐性强成本低的游戏就成为当前的主要课题,在这种趋势下各种小型的低成本的游戏软件应运而生。在这其中,系统自带的小游戏也占据了相当重要的地位,与那些网络游戏和3D游戏相比,它有编写简单容易上手等特点,非常适合人们在完成工作的时候适当的娱乐要求。这些小游戏大都是以益智和娱乐为目的,不仅给紧张工作的人们以放松,还可以让人们的大脑得到开发。这些小游戏包括扫雷,弹球,纸牌等等。而本课题就是扫雷游戏的设计。1.2 Visual C+ 发展概况Visual C+

12、是一个功能强大的可视化软件开发工具。自1993年Microsoft公司推出Visual C+1.0后,随着其新版本的不断问世,Visual C+已成为专业程序员进行软件开发的首选工具。虽然微软公司推出了Visual C+.NET(Visual C+7.0),但它的应用的很大的局限性,只适用于Windows 2000,Windows XP和Windows NT4.0。所以实际中,更多的是以Visual C+6.0为平台。Visual C+6.0不仅是一个C+编译器,而且是一个基于Windows操作系统的可视化集成开发环境(integrated development environment,ID

13、E)。Visual C+6.0由许多组件组成,包括编辑器、调试器以及程序向导AppWizard、类向导Class Wizard等开发工具。 这些组件通过一个名为Developer Studio的组件集成为和谐的开发环境。Visual C+它大概可以分成三个主要的部分:1 Developer Studio,这是一个集成开发环境,我们日常工作的99%都是在它上面完成的,再加上它的标题赫然写着“Microsoft Visual C+”,所以很多人理所当然的认为,那就是Visual C+了。其实不然,虽然Developer Studio提供了一个很好的编辑器和很多Wizard,但实际上它没有任何编译和

14、链接程序的功能,真正完成这些工作的幕后英雄后面会介绍。我们也知道,Developer Studio并不是专门用于VC的,它也同样用于VB,VJ,VID等Visual Studio家族的其他同胞兄弟。所以不要把Developer Studio当成Visual C+, 它充其量只是Visual C+的一个壳子而已。这一点请切记!2 MFC,从理论上来讲,MFC也不是专用于Visual C+,Borland C+,C+Builder和Symantec C+同样可以处理MFC。同时,用Visual C+编写代码也并不意味着一定要用MFC,只要愿意,用Visual C+来编写SDK程序,或者使用STL,

15、ATL,一样没有限制。不过,Visual C+本来就是为MFC打造的,Visual C+中的许多特征和语言扩展也是为MFC而设计的,所以用Visual C+而不用MFC就等于抛弃了Visual C+中很大的一部分功能。但是,Visual C+也不等于MFC。3 Platform SDK。这才是Visual C+和整个Visual Studio的精华和灵魂,虽然我们很少能直接接触到它。大致说来,Platform SDK是以Microsoft C/C+编译器为核心(不是Visual C+,看清楚了),配合MASM,辅以其他一些工具和文档资料。上面说到Developer Studio没有编译程序的功

16、能,那么这项工作是由谁来完成的呢?是CL,是NMAKE,和其他许许多多命令行程序,这些我们看不到的程序才是构成Visual Studio的基石。Visual C+ 之所以具有如此广泛的用途是因为它具有以下的特点:(1) 真正的面向对象编程,使开发人员不用加入太多的代码,加快了系统开发的速度。(2) 可视化的编程方法以及向导的功能,使开发人员不用加入太多的代码就可以开发出标准的Windows程序。(3) 数据访问的特性,允许对包括Microsoft SQL Server和其他企业数据库在内的大部分数据库格式建立数据库和前端应用程序,以及可调整的服务器端部件等。(4) 通过ActiveX技术可使用

17、其他应用程序提供的功能,例如Microsoft Word字处理器、Microsoft Excel电子数据表及其他Windows应用程序,甚至可直接使用Visual Basic创建的应用程序和对象。(5) Internet功能强大,使用户很容易在应用程序内通过Internet或企业内部网(Intranet)访问文档和应用程序,或者创建Internet服务器应用程序。(6) 已完成的应用程序是真正的.exe文件,您可以自由发布。1.3关于本课题随着世界经济的长足发展和计算机技术的日益成熟,计算机被应用到人类活动的各个领域,各种应用软件也相继问世,这其中有相当一部分是游戏软件。使用游戏软件自然是为了

18、满足人们对娱乐性的要求,而有些软件大都采用3D设计对系统配置的要求较高。在众多游戏软件中,也不乏一些小游戏的身影,它们对系统的配置要求较低。能够满足人们对娱乐性的需求,是人们在完成工作娱乐时候的最好选择。现在越来越多的人投入到这种小游戏的开发当中,它已经成为一类必不可少的游戏软件。在各种操作系统中都附带了一些小的游戏,而这些游戏也成为电脑用户软件中不可或缺的一部分。作为本系统的开发工具,Microsoft Visual C+ 6.0成为首选。它具有可视化的编程界面、详细的提示、以及完善的帮助文档,使得软件开发人员感到无比的亲切感。2 游戏的总体分析与设计2.1 游戏功能简介 当前各种游戏软件层

19、出不穷。因为游戏的开发成本非常大,所以游戏的开发具有一定的风险性,但是一些小游戏的开发具有成本小,编写简单的优势,所以这些小游戏在游戏开发中也占有一席之地。在这类小游戏中包括益智类游戏,它以画面精美游戏方法简单等特点得到大家的认可。成为人们在工作之余不可或缺的好伙伴。针对真种情况我用VB编写了扫雷这款小游戏。下面对该游戏的功能做个简单的介绍。扫雷游戏的基本功能 : 点击鼠标左键于未知区域,如果未知区域有雷,游戏停止,显示所有的地雷。如果没雷,则显示周围雷数,如果周围没雷,则再查看周围八个区域是否有雷直到有雷为止并显示,这其实是一个递归过程。 点击鼠标右键于未知区域,则将其置为有雷而不管是否真的

20、有雷。可选择初、中、高三级并可自定义雷数和区域大小。雷区上部左侧显示总雷数减被标明有雷区域的数目。雷区上部中间位置显示一按钮用于开局和显示鼠标动作的结果。雷区上部右侧显示扫雷的时间。将雷全部扫清后,则显示一对话框将你的姓名记入排行榜。2.2设计构想相信大多数使用Windows操作系统的使用者,对这款游戏都不陌生。这款游戏不止操作简单,规则也不难,再加上游戏速度的控制机制得宜,让整个游戏在操作过程中充满了快乐与紧张的气氛。除了游乐当中能带给使用者快乐之外,游戏的设计内容无形中也不断训练使用者的逻辑思考能力,对于依靠高度脑力工作的现代人,都可以通过这个游戏,不时的检验一下自己,所以我们不难发现,在

21、各种可携带的电子产品上都有这款游戏的踪影。在设计之前,我们先来了解这款游戏的规则。在不掀开任何藏有地雷的方块情况下,以最快的速度找出所有的地雷。如果在掀开方块的过程中,不小心翻开(踩到)藏有地雷的方块,则宣告失败(游戏结束),惟有将所有不含地雷的方块掀开,游戏才算成功。游戏的操作方面主要以鼠标为主,当鼠标指针对准未翻开的方块按下左键时即表示翻开方块,当鼠标指针对准未翻开的方块按下右键时即表示标示或疑示地雷,反复按下右键则方块会以未标示标示疑似三者关系不断循环。游戏者可以通过地雷区内的数字提示了解以数字为中心的其周边八个方格内所含的地雷数,假若翻开的方块显示数字“3”,则表示以其为中心的周边方块

22、内藏有3个地雷。当按下的方块不是地雷,且周边八个方块也都没有地雷时,方块会以被翻开方块的八个方向将空白方块翻开。2.3流程规划流程规划大致上可以分为三个部分,分别为:画面初始、游戏者按下第一个方块和为非地雷方块时展开。画面初始时,以游戏者最后一次设定的地雷区大小为范围画出地雷区,但此时并未产生地雷。当游戏者按下第一个方块时产生地雷资料并启动定时器,为何在游戏者按下第一个方块才产生地雷资料呢?其主要的用意在于不要让游戏者第一次就踩到地雷,这样在某种程度上可以提高游戏者游玩的气氛。接着就是如何判断按下的方块是非地雷时的处理,这也是整个游戏的技术核心,我们可以通过递归的观念来检查周边的方块是否含有地

23、雷及是否继续往外翻开。 基于以上思路,绘制功能图如下: 扫雷游戏窗体类模块背景音乐鼠标右键鼠标左键鼠标开始窗体加载鼠标双击函数递归函数重新开始函数画图函数音乐函数 3.扫雷游戏的具体实现过程3.1 扫雷游戏模块的实现扫雷游戏的开发主要包括两大部分:一个部分是布雷,该部分主要将雷随机布置在游戏区域内,以避免出现相同的雷区布置地图。另一部分是扫雷,该部分包括判断鼠标左键点击某区域该区域是否是雷,如果是雷该如何操作,如果不是雷该如何操作,鼠标右键点击某区域时如果判断该区域是雷则加以标记,如果不是雷也加以标记,以及当鼠标双击某区域时,判断与该区域相邻的其它8个区域是否是雷并做一个标记。下面首先介绍第一

24、部分之一扫雷主窗体创建。3.1.1 扫雷游戏主窗体的创建启动Visual C+ 6.0后,选择新建工程,Visual C+ 6.0提供了用户可能需要的各种类型的应用程序模板。如果是这种情况,选择MFC AppWizard(exe)项目,输入工程名称和位置,将创建一个新的工程如下:选择基于Dialog based:其它的默认,建立新的工程。下面介绍一下如何创建窗体界面:首先,转换窗口到资源编程窗口,修改主对话框的Caption属性为“周龙扫雷游戏程序设计”,添加2个Static控件,1个Caption改为“剩余雷数”,1个Caption改为空用来表示剩余的雷数。其设计如下:当然,这只是设计的初始

25、的界面,我们还需要在程序中添加其它代码以初始化和美化运行的主界面。添加如下代码:void OnPaint()CDC memdc;CBitmap bk;bk.LoadBitmap(IDB_BACK);memdc.CreateCompatibleDC(pDC); pDC-BitBlt(0,0,600,600,&memdc,0,0,SRCCOPY);主要是美化运行界面,如下:接下来要绘制鼠标操作区域,即游戏区域。添加绘制棋盘函数DrawChessBoard()如下:void CShaoLeiDlg:DrawChessBoard() CDC* pDC = GetDC();CPen pen(PS_SOL

26、ID,1,RGB(0,0,0);pDC-SelectObject(&pen);for (int i = 0; iMoveTo(x+cx*(i),y);pDC-LineTo(x+cx*(i),y+row*cy);for (int j = 0; jMoveTo(x,y+(j)*cy);pDC-LineTo(x+col*cx,y+(j)*cy);然后的运行结果如下:3.1.2 主界面控制菜单的设计接下来回到资源编程界面,编写菜单资源,用来控制扫雷的过程,以及难度选定,和背景音乐等。(1) “设置菜单“包含:开始,初级,中级,高级,音乐开,音乐关,退出 其中,音乐开 包含 默认的音乐和打开本地音乐两个

27、子菜单项。(2)“帮助“菜单获取该软件的版本信息。如下:将菜单添加到主界面,至此主窗体基本创建完毕。3.2扫雷游戏核心-布雷算法设计(1) 扫雷游戏是由很多相同大小的格子组成的,一般计算机中自带的游戏格子规格为9*9,16*15和30*16(第一个数字代表函数,第二个数字代表列数)。规格不同,需要埋的地雷数目就 不同,这就会涉及到随机埋雷算法,最简单的是一下两种函数的结合:void srand(unsigned int seed);/seed为随机种子一般这样使用该函数:srand(unsigned) time(NULL);/即利用系统时间作为随机种子,因为系统内置的时钟是在时刻变化的。然后使

28、用如下函数产生随机数:int rand(void)/可尝试(0,RAND_MAX)之间的随机整数,RAND_MAX为十六进制的0X7fff可进行一些算术运算,使之产生所需要的任意随机数。(2) 扫雷游戏还要求在没有雷的地方被点击后就会显示一个数字表示它周围有几个雷,这里分析实现这个功能的算法。把整个游戏区看成一个二维数组minefieldij: 要知道minefield26周围有几个雷,只要去检测如下8个网格是否有雷即可。minefield15,minefield16,minefield17minefield25,minefield27minefield35,minefield36,minef

29、ield37将上面的8个网格的位置关系与minefield26进行比较,不难发现它们之间存在一定的数学关系,抽象看来就是:minefieldij周围雷的个数是由如下8个位置处的雷的总合决定的。minefieldi-1j-1,minefieldi-1j,minefieldi-1j+1minefieldij-1,minefieldij+1minefieldi+1j-1,minefieldi+1j,minefieldi+1j+1上面几个位置可能超出了边界,因此需要根据实际情况给变量i与j设置范围。根据以上的分析,设计布雷算法的代码,添加BuLei()函数用于随机布雷。void BuLei()/随机布

30、雷 int k1,k2; srand( (unsigned)time( NULL ) ); for(int i=0;i=0)&(k2-1=0)&(m_NodeListk1-1k2-1.m_Type!=ncLEI)/左上方m_NodeListk1-1k2-1.m_Type=ncNUMBER; m_NodeListk1-1k2-1.m_Around+=1;if(k1-1=0)&m_NodeListk1-1k2.m_Type!=ncLEI)/上方m_NodeListk1-1k2.m_Type=ncNUMBER; m_NodeListk1-1k2.m_Around+=1; if(k1-1=0)&(k2

31、+1=0)&m_NodeListk1k2-1.m_Type!=ncLEI)/左方m_NodeListk1k2-1.m_Type=ncNUMBER; m_NodeListk1k2-1.m_Around+=1;if(k2+1col)&m_NodeListk1k2+1.m_Type!=ncLEI)/右方m_NodeListk1k2+1.m_Type=ncNUMBER; m_NodeListk1k2+1.m_Around+=1;if(k1+1=0)&m_NodeListk1+1k2-1.m_Type!=ncLEI)/左下方m_NodeListk1+1k2-1.m_Type=ncNUMBER; m_No

32、deListk1+1k2-1.m_Around+=1; if(k1+1row)&m_NodeListk1+1k2.m_Type!=ncLEI)/下方m_NodeListk1+1k2.m_Type=ncNUMBER; m_NodeListk1+1k2.m_Around+=1;if(k1+1row)&(k2+1col)&m_NodeListk1+1k2+1.m_Type!=ncLEI)/右下方m_NodeListk1+1k2+1.m_Type=ncNUMBER; m_NodeListk1+1k2+1.m_Around+=1; 当然,还得添加绘图代码用来在游戏区域显示随机布置的雷和周边情况,在OnP

33、aint函数中添加如下代码:void OnPaint()for(int i=0;irow;i+)for(int j=0;jBitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=1)memdc.SelectObject(&bmp_1); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOP

34、Y);else if(m_NodeListij.m_Around=2) memdc.SelectObject(&bmp_2); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=3) memdc.SelectObject(&bmp_3); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,

35、0,SRCCOPY);else if(m_NodeListij.m_Around=4) memdc.SelectObject(&bmp_4); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=5) memdc.SelectObject(&bmp_5); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&

36、memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=6) memdc.SelectObject(&bmp_6); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=7) memdc.SelectObject(&bmp_7); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2

37、,20,20,&memdc,0,0,SRCCOPY);else if(m_NodeListij.m_Around=8) memdc.SelectObject(&bmp_8); pDC-BitBlt(m_NodeListij.m_Point.x-cx/2,m_NodeListij.m_Point.y-cy/2,20,20,&memdc,0,0,SRCCOPY);随机布雷效果比较如下:第一次运行:第二次运行:如上看来,随机布雷成功。3.3 扫雷鼠标事件的处理(1) 首先,设计雷区和非雷区的判断算法。扫雷时需要判断每个格子的状态,可事先为格子设定一些状态,使之对应不同的BOOL值或整数值。在二维、三

38、维游戏里,有一种简单的构造地图的方法,即将地图划分为m*n的规格格子,使每一个格子对应二维数组中的一项,当鼠标单击时,通过找出鼠标点击区域,找到相应的格子,判断格子状态来替换相应的位图。 具体算法思想如下: A. 在应用程序的客户区划分一块区域,将该区域划分为n*m相同大小的格子;B. 将每一个格子的状态对应到二维数组的相应项上;C. 当鼠标点击某一块区域时,首先判断是否在各种区域,然后再通过鼠标的坐标找到相应的格子;D. 查询格子的状态,从而调用相应的位图进行位图替换;说明:Windows的消息响应机制对于编写一些小游戏是非常方便的,当编写大型2D或3D游戏时,Windows API 就显得有些不足,此时应使用DirectX或OpenGL等大型图形库来进行设计及编码。(2) 鼠标左键事件的处理。分两种情况:A. 当相应区域不是雷区时,挖开区域,并且若能据此判断周围区域也不是雷区则将周围相应区域也挖开;B. 当区域是雷区时,则界面中所有的雷区同时“炸开“:第一步先显示一个提示框,第二部当

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1