毕业设计(论文)-C++编程小游戏扫雷.doc_第1页
毕业设计(论文)-C++编程小游戏扫雷.doc_第2页
毕业设计(论文)-C++编程小游戏扫雷.doc_第3页
毕业设计(论文)-C++编程小游戏扫雷.doc_第4页
毕业设计(论文)-C++编程小游戏扫雷.doc_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

装订线成绩 软件技术学院毕业设计(实 训) 报 告实 训 单 位 范县新晨阳门业 实 训 时 间 2013 年 2 月 8 日至 2013 年 6 月 8 日止指导教师(校内) 指导教师(校外) 实训题目 C+编程小游戏扫雷 专 业 计算机信息管理 学 号 学 生 姓 名 、摘要 随着现代科技的高速发展,短短几十年,电脑游戏得到迅猛发展。电脑游戏充分利用多媒体网络优势,拓宽了传统游戏的界限,给人们带来全新的体验。C+是一门应用非常广泛的计算机程序设计语言。它既支持过程化程序设计,也支持面向对象程序设计。从操作系统、设备控制到数据库、网络、多媒体等众多的应用领域都能看到它的身影。目前,业界应用比较广泛的是它的两个变种:BorlandC+和VisualC+。这两种C+都是在标准C+的基础上做了一些扩展而来。扫雷游戏是Windows操作系统自带的一个小游戏,过去的几年里Windows操作系统历经数次换代,变得越来越庞大、复杂,但这个可爱的小游戏在任何版本的Windows操作系统里去却依然保持着原貌。但几乎每个电脑使用者都接触过它,并且深爱着这款小游戏。扫雷游戏是比较经典的一款小游戏,实现它的方法很多,可以用很多不同算法和语言实现,如C,C+,VB,JAVA等。本论文研究的是以VisualC+6.0为开发环境,设计并开发一款扫雷游戏,其功能类似于Windows操作系统自带的扫雷游戏。论文首先介绍了制作游戏的整体思路及整个游戏设计的流程规划,然后介绍了雷区的布置及地雷随机产生的实现方法;重点介绍了在游戏过程中各事件的处理,其中又以鼠标事件和清除未靠近地雷区方块这两方面最为最要,鼠标事件是利用鼠标所发出的信息了解使用者的意图,进而做出相对应的动作,而清除未靠近地雷区方块由于引进了“递归”这个概念而使其简单化目 录1、 引言2、 C+介绍3、 C+游戏制作过程 (一)、界面设计 1、开始界面 2、游戏界面 3、编程其它简略界面 (二)、部分代码(三)、用例图4、 总结5、 参考文献6、 致谢1、 引言 当前随着计算机的深入普及,越来越多的人有了个人电脑,人们运用计算机完成许多重要的工作,计算机在人们的生活中变的越来越来重要。随着计算机的应用和发展计算机已经不单纯是一个工作工具,人们越来越重视计算机的娱乐性了,近年来游戏产业规模持续成长,全球每年游戏业总产值已经突破200亿美金,远远超越好莱坞电影产业以及音乐娱乐事业,而成为目前娱乐事业的最大主流。不过游戏产业光鲜亮丽的背后,却也隐含着高风险、高成本的危机,显示游戏产业慢慢步入“微利时代”。目前整个游戏产业的运作模式已经跟好莱坞电影产业的运作模式相同,电影产业有制片、发行、宣传等分工,游戏产业亦同,由专业的游戏研发小组负责研发游戏,也有如微软这类国际级大厂负责游戏发行,甚至连“游戏制作人”也被培养成明星一样成为一种招牌.明确的游戏产业分工的确有助于游戏产业的规模发展与进化,但也无形中让游戏开发成本大增。为了降低游戏开发成本,开发娱乐性强成本低的游戏就成为当前的主要课题,在这种趋势下各种小型的低成本的游戏软件应运而生。在这其中,系统自带的小游戏也占据了相当重要的地位,与那些网络游戏和3D游戏相比,它有编写简单容易上手等特点,非常适合人们在完成工作的时候适当的娱乐要求。这些小游戏大都是以益智和娱乐为目的,不仅给紧张工作的人们以放松,还可以让人们的大脑得到开发。这些小游戏包括扫雷,弹球,纸牌等等。而本课题就是扫雷游戏的设计二、C+介绍 语言之所以要起名为“C”,是因为它是主要参考那个时候的一门叫B的语言,它的设计者认为C语言是B语言的进步,所以就起名为C语言;但是B语言并不是因为之前还有个A语言,而是B语言的作者为了纪念他的妻子,他的妻子名字的第一个字母是B; 当C语言发展到顶峰的时刻,出现了一个版本叫C with Class,那就是C+最早的版本,在C语言中增加class关键字和类,那个时候有很多版本的C都希望在C语言中增加类的概念;后来C标准委员会决定为这个版本的C起个新的名字,那个时候征集了很多种名字,最后采纳了其中一个人的意见,以C语言中的+运算符来体现它是C语言的进步,故而叫C+,成立了C+标准委员会。 C+是一种语言,仅仅是它的语法、特性、标准类库就已经是一门非常高深的课程,C+设计成静态类型、和C同样高效且可移植的多用途程序设计语言。设计成直接的和广泛的支援多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。设计成尽可能与C兼容,籍此提供一个从C到C+的平滑过渡。避免平台限定或没有普遍用途的特性。不使用会带来额外开销的特性。设计成无需复杂的程序设计环境。 C+标准演变了许多年。C+模板是近几年来对此语言的一种扩展,模板是根据类型参数来产生函数和类的机制,有时也称模板为“参数化的类型”。使用模板,可以设计一个对许多类型的数据进行操作的类,而不需要为每个类型的数据建立一个单独的类。标准模板库(Standard Tempalte Library,STL )和微软的活动模板库(Active Tempalte Library,ATL )都基于这个C+语言扩展。 C+标准可分为两部分, C+语言本身和C+标准库。C+标准库对于Visual C+是相当新的,实际上微软只是在发布Visual C+ 5.0时去除了一些“bug”。标准库提供了标准的输入/输出、字符串、容器(如矢量、列表和映射等)、非数值运算(如排序、搜索和合并等)和对数值计算的支持。应该说, C/C+包含了相对少的关键字,而且很多最有用的函数都来源于库,C+标准库实现容器和算法的部分就是STL。STL是数据结构和算法的一个框架,数据结构包括矢量、列表和映射等,算法包括这些数据结构的查找、拷贝和排序等。1994年7月,ANSI/ISO C+标准委员会投票决定接受STL为C+标准库的一部分,这个建议是根据Alex Stepanov、Meng Lee和David Musser这三人的编程和软件库研究提出的。STL的产生是为了满足通用性的设计目标,而不是为了提高性能。 C+对C的“增强”,表现在六个方面:(1) 类型检查更为严格。(2) 增加了面向对象的机制。(3)增加了泛型编程的机制(template)(4)增加了异常处理(5)增加了运算符重载(6)增加了标准模板库(STL)面向对象程序设计,是针对开发较大规模的程序而提出来的,目的是提高软件开发的效率不要把面向对象和面向过程对立起来, 面向对象和面向过程不是矛盾的,而是各有用途互为补充的学习C+, 既要会利用C+进行面向过程的结构化程序设计, 也要会利用C+进行面向对象的程序设计,更要会利用模板进行泛型编程优点 图1.1 C+设计成静态类型、和C同样高效且可移植的多用途程序设计语言。 C+设计成直接的和广泛的支持多种程序设计风格(程序化程序设计、资料抽象化、面向对象程序设计、泛型程序设计)。 C+设计成给程序设计者更多的选择,即使可能导致程序设计者选择错误。 C+设计成尽可能与C兼容,借此提供一个从C到C+的平滑过渡。 C+避免平台限定或没有普遍用途的特性。 C+不使用会带来额外开销的特性。 C+设计成无需复杂的程序设计环境。8出于保证语言的简洁和运行高效等方面的考虑,C+的很多特性都是以库(如STL)或其他的形式提供的,而没有直接添加到语言本身里。关于此类话题,Bjarne Stroustrup的C+语言的设计和演化(1994)里做了详尽的陈述。C+在一定程度上可以和C语言很好的结合,甚至目前大多数C语言程序是在C+的集成开发环境中完成的。C+相对众多的面向对象的语言,具有相当高的性能。C+引入了面向对象的概念,使得开发人机交互类型的应用程序更为简单、快捷。很多优秀的程序框架包括MFC、QT、wxWidgets就是使用的C+。9代码性能人们一般认为,使用Java或C#的开发成本比C+低。但是,如果充分分析C+和这些语言的差别,会发现这句话的成立是有条件的。这个条件就是:软件规模和复杂度都比较小。如果不超过3万行有效代码(不包括生成器产生的代码),这句话基本上还能成立。否则,随着代码量和复杂度的增加,C+的优势将会越来越明显。造成这种差别的就是C+的软件工程性。9缺点C+由于语言本身过度复杂,这甚至使人类难于理解其语义。更为糟糕的是C+的编译系统受到C+的复杂性的影响,非常难于编写,即使能够使用的编译器也存在了大量的问题,这些问题大多难于被发现。9由于本身的复杂性,复杂的C+程序的正确性相当难于保证。也有人提出不支持多线程的原语等缺陷。不过有如此多的知名人士提出了如此多的缺陷,正说明C+被广泛使用和成功。c+语言由于过度的复杂性,以及与unix的文化相抵触,在unix/linux领域受到很多著名人士(比如Linux之父linus torvalds与著名黑客Eric S. Raymond)的强烈批评与抵制。第 32 页 共 32 页三、C+游戏制作过程(一)、界面设计1、开始界面图1.22、 游戏界面图1.3 3、编程其它简略界面 图1.3 图1.4 图1.5 图1.6 图1.7(2) 、部分代码#include #include #include #include #include / defines#define KEY_UP 0xE048#define KEY_DOWN 0xE050#define KEY_LEFT 0xE04B#define KEY_RIGHT 0xE04D#define KEY_ESC 0x001B#define KEY_1 1#define KEY_2 2#define KEY_3 3#define GAME_MAX_WIDTH 100#define GAME_MAX_HEIGHT 100/ Strings Resource#define STR_GAMETITLE ArrowKey:MoveCursor Key1:Open Key2:Mark Key3:OpenNeighbors#define STR_GAMEWIN Congratulations! You Win! Thank you for playing!n#define STR_GAMEOVER Game Over, thank you for playing!n#define STR_GAMEEND Presented by yzfy . Press ESC to exitn/-/ Base classclass CConsoleWnd public: static int TextOut(const char*); static int GotoXY(int, int); static int CharOut(int, int, const int); static int TextOut(int, int, const char*); static int GetKey(); public:;/ class CConsoleWnd / / int CConsoleWnd:GetKey() / Wait for standard input and return the KeyCode / int CConsoleWnd:GetKey() int nkey=getch(),nk=0; if(nkey=128|nkey=0)nk=getch(); return nk0?nkey*256+nk:nkey; / / int CConsoleWnd:GotoXY(int x, int y) / Move cursor to (x,y) / Only Console Application / int CConsoleWnd:GotoXY(int x, int y) COORD cd; cd.X = x;cd.Y = y; return SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cd); / / int CConsoleWnd:TextOut(const char* pstr) / Output a string at current position / int CConsoleWnd:TextOut(const char* pstr) for(;*pstr;+pstr)putchar(*pstr); return 0; / / int CConsoleWnd:CharOut(int x, int y, const int pstr) / Output a char at (x,y) / int CConsoleWnd:CharOut(int x, int y, const int pstr) GotoXY(x, y); return putchar(pstr); / / int CConsoleWnd:TextOut(const char* pstr) / Output a string at (x,y) / int CConsoleWnd:TextOut(int x, int y, const char* pstr) GotoXY(x, y); return TextOut(pstr); /-/Application classclass CSLGame:public CConsoleWnd private: private: int curX,curY; int poolWidth,poolHeight; int bm_gamepoolGAME_MAX_HEIGHT+2GAME_MAX_WIDTH+2; public: CSLGame():curX(0),curY(0)poolWidth=poolHeight=0; int InitPool(int, int, int); int MoveCursor()return CConsoleWnd:GotoXY(curX, curY); int DrawPool(int); int WaitMessage(); int GetShowNum(int, int); int TryOpen(int, int); private: int DFSShowNum(int, int); private: const static int GMARK_BOOM; const static int GMARK_EMPTY; const static int GMARK_MARK;const int CSLGame:GMARK_BOOM = 0x10;const int CSLGame:GMARK_EMPTY= 0x100;const int CSLGame:GMARK_MARK = 0x200;/ class CSLGame:public CConsoleWnd / / int CSLGame:InitPool(int Width, int Height, int nBoom) / Initialize the game pool. / If Width*Height = nBoom, or nBoom=0, / or Width and Height exceed limit , then return 1 / otherwise return 0 / int CSLGame:InitPool(int Width, int Height, int nBoom) poolWidth = Width; poolHeight = Height; if(nBoom=Width*Height | Width GAME_MAX_WIDTH | HeightGAME_MAX_HEIGHT ) return 1; / zero memory for(int y=0; y=Height+1; +y) for(int x=0; x=Width+1; +x) bm_gamepoolyx=0; / init seed srand(time(NULL); / init Booms while(nBoom) int x = rand()%Width + 1, y = rand()%Height + 1; if(bm_gamepoolyx=0) bm_gamepoolyx = GMARK_BOOM; -nBoom; / init cursor position curX = curY = 1; MoveCursor(); return 0; / / int CSLGame:DrawPool(int bDrawBoom = 0) / Draw game pool to Console window / int CSLGame:DrawPool(int bDrawBoom = 0) for(int y=1;y=poolHeight;+y) CConsoleWnd:GotoXY(1, y); for(int x=1;x0 & bm_gamepoolyx=8) putchar(0+bm_gamepoolyx); else if(bDrawBoom=0 & (bm_gamepoolyx & GMARK_MARK) putchar(#); else if(bm_gamepoolyx & GMARK_BOOM) if(bDrawBoom) putchar(*); else putchar(.); return 0; / / int CSLGame:GetShowNum(int x, int y) / return ShowNum at (x, y) / int CSLGame:GetShowNum(int x, int y) int nCount = 0; for(int Y=-1;Y=1;+Y) for(int X=-1;X=1;+X) if(bm_gamepooly+Yx+X & GMARK_BOOM)+nCount; return nCount; / / int CSLGame:TryOpen(int x, int y) / Try open (x, y) and show the number / If there is a boom, then return EOF / int CSLGame:TryOpen(int x, int y) int nRT = 0; if(bm_gamepoolyx & GMARK_BOOM) nRT = EOF; else int nCount = GetShowNum(x,y); if(nCount=0) DFSShowNum(x, y); else bm_gamepoolyx = nCount; return nRT; / / int CSLGame:DFSShowNum(int x, int y) / Private function, no comment / int CSLGame:DFSShowNum(int x, int y) if(0x & x=poolWidth) & (0y & y=poolHeight) & (bm_gamepoolyx=0) int nCount = GetShowNum(x, y); if(nCount=0) bm_gamepoolyx = GMARK_EMPTY; for(int Y=-1;Y=1;+Y) for(int X=-1;X1)-curY; nArrow=1; break; case KEY_DOWN: if(curY1)-curX; nArrow=1; break; case KEY_RIGHT: if(curXpoolWidth)+curX; nArrow=1; break; case KEY_1: nRT = TryOpen(curX, curY); break; case KEY_2: if(bm_gamepoolcurYcurX & (GMARK_MARK|GMARK_BOOM)=0) bm_gamepoolcurYcurX = GMARK_MARK; break; case KEY_3: if(bm_gamepoolcurYcurX & 0xF) int nb = bm_gamepoolcurYcurX & 0xF; for(int y=-1;y=1;+y) for(int x=-1;x=1;+x) if(bm_gamepoolcurY+ycurX+x & GMARK_MARK) -nb; if(nb=0) for(int y=-1;y=1;+y) for(int x=-1;x=1;+x) if(bm_gamepoolcurY+ycurX+x & (0xF|GMARK_MARK) = 0) nRT |= TryOpen(curX+x, curY+y); break; case KEY_ESC: nRT = EOF; break; if(nKey = KEY_1 | nKey = KEY_3) int y=1; for(;y=poolHeight;+y) int x=1; for(;x=poolWidth; +x) if(bm_gamepoolyx=0)break; if(x=poolWidth) break; if(! (y=poolHeight) nRT = 1; if(nArrow=0) DrawPool(); MoveCursor(); return nRT; /-/ / / main function / int main(void) int x=50, y=20, b=100,n; / define width & height & n_booms CSLGame slGame; / Init Game CConsoleWnd:GotoXY(0,0); CConsoleWnd:TextOut(STR_GAMETITLE); slGame.InitPool(x,y,b); slGame.DrawPool(); slGame.MoveCursor(); while(n=slGame.WaitMessage()=0) / Game Message Loop ; / End of the Game slGame.DrawPool(1); CConsoleWnd:TextOut(n); if(n=1) CConsoleWnd:TextOut(STR_GAMEWIN); else CConsoleWnd:TextOut(STR_GAMEOVER); CConsoleWnd:TextOut(STR_GAMEEND); while(CConsoleWnd:GetKey()!=KEY_ESC) ; return 0; /(3) 、用例图 图1.8 图1.9 图2.0图2.1四、总结这次课题中,初步了解了游戏开发的流程,也知道了游戏开发的重点,自己获得一定的游戏开发经验,对于下一步的学习有很大的指导意义; 在实际的操作的过程中还通过上网等多种手段学到了不少的新的

温馨提示

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

评论

0/150

提交评论