C课程设计迷宫小游戏.doc_第1页
C课程设计迷宫小游戏.doc_第2页
C课程设计迷宫小游戏.doc_第3页
C课程设计迷宫小游戏.doc_第4页
C课程设计迷宫小游戏.doc_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

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

文档简介

温馨提示程序语言:C、C+、C#、Python(红色字体 表示本课设使用的程序设计语言)图形功能选项:Win32控制台程序(黑框、文本界面)、Win32程序、MFC、WinForm、DirectX10(黑体标明 表示本课设的程序图形类别,默认为非图形界面Win32控制台程序)数据结构:基础类型、数组、链表、双向链表、搜索树(非平衡二叉树)、平衡二叉树、链表与平衡二叉树相结合、堆栈、队列、串、图(黑体标明 表示本课设使用的数据结构)C+语言项:STL库(黑体标明 表示使用C+的STL库)编译环境:Windows 7 64位旗舰版(Linux及其他环境请谨慎下载)集成开发环境:Visual C+ 6.0、DEVC+、CodeBlocks、Visual Studio 2015均可通过编译。(浅蓝色字体 表示需要运行修改后的版本,请用户自行选择源代码测试)分多头文件编译:否(所有代码基本都包含在一个文件内,如需试验头文件功能,请自行参考相关文献)内容说明:1、课设题目及预览内容 将在第二页开始展示。2、代码行数:525行3、目录 所示内容,本文基本涵盖,如无内容,会在本页进行说明。4、附录 绝对包含用户使用手册及程序完整源代码和详细注释。5、如需下载 其他 头文件(例如DirectX需另行配置),本文会在此进行说明。6、本文撰写内容仅供学习参考,另外,由于本人水平有限,编写之处难免存在错误和纰漏,恳请各位老师或同学批评指正。题目:基于C+控制台游戏的设计任务要求:1. 代码量不低于300行,至少有5个函数,不得存在重复代码。2. 游戏设计具有一定可玩性,设计至少3关,界面和交互性友好,不得存在BUG。3. 每个人书写一份课程设计报告,报告中包含如下内容:(1) 题目简介(一段题目的简单介绍,一段题目开发的硬软要求)(2) 功能模块划分(3) 界面设计(4) 详细设计(流程图,或代码,每一部分代码要有相应的文字说明)(5) 遇到的问题及解决办法(5个问题以上)(6) 总结与展望本课设文档基于迷宫游戏进行课程设计。运行截图如下:课程设计报告 课 题: 学 院: 专 业: 学生姓名: 学 号: 指导老师 : 20XX年XX月XX日目录1题目简介12功能模块划分23界面设计34详细设计64.1数据结构64.2函数说明64.3函数设计流程图75遇到的问题及解决办法106总结与展望11附录121题目简介人类建造迷宫已有5000年的历史。在世界的不同文化发展时期,这些奇特的建筑物始终吸引人们沿着弯弯曲曲、困难重重的小路吃力地行走,寻找真相。迷宫小游戏应运而生。在游戏中,迷宫被表现为寻找出口的一种益智小游戏。本课设用代表人物,代表出口,代表围墙,其他制表符(例如:、等)用来构造道路和阻挡玩家的去路。玩家要在游戏中,通过复杂的道路找到出口方可胜利。本游戏一共设计3关,难度由低逐渐提升。本课设开发基于Windows 7 64位系统,集成开发环境Visual Studio 2015 Pro。2功能模块划分本游戏一共分为四个功能模块,分别是开始界面的显示、进行游戏、下一关和通关界面的显示。1、首先,打开程序的时候会进入一个欢迎界面,按任意键即可开始游戏。2、玩家通过wsad控制人物()的上下左右。3、每当玩家到达出口()会自动显示通过本关卡,并等待玩家按任意键进行下一关游戏。4、当玩家通过所有的关卡时,将会显示一个通关界面。具体的功能模块图如下:2.1功能模块图开始界面进行游戏下一关通关3界面设计本程序完全通过文本模式进行,根据上述四大功能模块,需要设计四类用户界面,分别是开始界面,游戏界面,下一个界面,游戏结束界面。1、首先就是最基本的用户欢迎界面,也称开始界面,如下图3.1所示。图3.1开始界面2、其次,就是本程序的关键,也是这个游戏的核心所在,游戏交互界面,如下图3.2所示。图3.2游戏交互界面3、接着,就是通过本关卡之后的界面,如图3.3所示。图3.3通关界面4、最后,就是通过所有关卡的游戏界面,如图3.4所示。图3.4游戏通关界面4详细设计4.1数据结构该迷宫小游戏只需设计一个类即可控制整个游戏的运行,通过分析,迷宫小游戏需要一个构造函数Maze()对游戏数据进行初始化,一个显示开始界面的函数ShowUI(),一个绘制游戏界面的函数ShowGame(),一个初始化下一关数据的函数NextCheckpoint(),一个控制人物移动的函数Move(),其中通过Rand()管理各关卡的地图数据,一个游戏结束界面函数GameOver(),还需要一个Game()函数控制游戏的开始与结束逻辑。在整个设计中,通过二维数组来映射各种文本字符(、等),其中映射数据通过宏定义来实现,这样方便管理与维护。类的数据结构如下:class Maze public:Maze();/构造函数,初始化关卡数据void ShowUI();/显示迷宫开始界面void Game();/游戏开始void ShowGame();/显示游戏界面void GameOver();/通关所有关卡,显示游戏结束界面void Move();/移动void NextCheckpoint();/下一关private:int mapDIMENSIONDIMENSION;/记录关卡地图int checkpoint;/记录当前关卡int x, y;/记录人物在迷宫中的坐标void Rand();/产生新地图;4.2函数说明迷宫程序设计的函数都是类Maze的成员函数,分别是Maze()、void ShowUI()、void Game()、void ShowGame()、void GameOver()、void Move()、void NextCheckpoint()、void Rand()。1、Maze()属于构造函数,初始化第一关的游戏数据,例如人物的x,y坐标,第一关的游戏地图数据等。2、ShowUI()展示欢迎进入游戏的界面。3、Game()控制游戏的进程,比如游戏开始、游戏进行中和结束的函数过程,是程序连贯的关键函数。4、ShowGame()打印游戏进行中的界面。5、GameOver()打印游戏结束界面,并结束程序的运行。6、Move()获取键盘的按键信息,控制人物在二维数组中的位置,是该游戏程序的核心函数。7、NextCheckpoint()控制当前是第几关,并可调用Rand()对下一关的地图数据进行初始化。8、Rand()用来初始化每一个的地图信息和人物位置信息,通过Rand()可方便关卡的增减修改,利于维护。以下是Game()成员函数的代码,代码质量风格良好。void Maze:Game()do if (CHECKPOINT = checkpoint)GameOver();/游戏通关else if (RAILING13 = mapyx)NextCheckpoint();/下一关else ShowGame();/打印迷宫Move();/移动 while (true);4.3函数设计流程图迷宫程序设计的函数都是类Maze的成员函数,分别是Maze()、void ShowUI()、void Game()、void ShowGame()、void GameOver()、void Move()、void NextCheckpoint()、void Rand()。其中,比较核心的两个函数(Game()与Move()函数)的程序流程图如下所示:图4.3.1 Game函数流程图是否否是Game()开始判断游戏是否结束?是否进行下一关?显示迷宫界面ShowUI()获取移动命令Move()初始化下一关数据NextCheckpoint()Game()结束调用GameOver()图4.3.2 Move函数流程图d键a键s键w键是wsad键非wsad键Move()开始获取按键信息判断wsad按键处理向上(w键)移动处理向下(s键)移动处理向左(a键)移动处理向右(d键)移动Move()结束5遇到的问题及解决办法1、游戏开始设计的时候,不知道如何对控制台进行清屏操作,导致游戏界面比较乱。通过查阅网上资料,了解到了system(“cls”)函数可实现控制台界面的清屏操作,这样看起来便简洁了很多。2、本程序一开始通过cin函数进行键盘按键的读入 ,导致游戏无法连贯运行。通过查阅网上资料,_getch()函数,从键盘获取一个按键,但不回显在屏幕上,完成了游戏的实时运行操作。3、标记人物的x,y坐标经常与数组的行列混淆,老是出现mapxy这样的错误。通过细心观察和总结,加深对知识的了解和运用,避免类似这样的非语法错误,养成良好的代码习惯,下面再说一次mapyx才是正确的写法。4、游戏结束的逻辑思路一直没连贯起来,导致程序进入死循环。通过查阅相关资料,知道exit(0)可以在代码的任何位置结束程序的运行。5、由于基础的不扎实以及考虑的不够全面,一开始在Move()的时候只进行了小写字母wsad按键的处理,没有处理大写的WSAD按键,这样会导致大写的时候,无法控制游戏人物的移动。通过刻苦的学习,在switch里面每个的case w:上下,再增加一行case W:即可,这样执行同样的代码就无须再复制粘贴一遍了,或者再写一个函数解决。6总结与展望在做这个课程设计的时候,我感觉我就像迷宫里的一样,通过解决一个个的问题,最后通过了一关关的关卡,得到了游戏的胜利。一路走来着实不易,在一次次调试奔溃中躺过,如果不是老师和同学们的指导和帮助,或许我已经放弃了前进。这次小游戏的开发,是我人生中的一次淬炼,是我迈向一名出色工程师的试炼。无数个日日夜夜的积累与奋斗在这次开发中反映的淋漓尽致,人生也像课程设计一样,不能缺少规划和磨练。只有坚持奋斗,克服一个个困难,才能到达最后的终点,品味风雨后的彩虹。在此次开发设计中,我领悟了很多的道理,收获了很多以往在课堂上得不到的心得和感悟,也提高了我对C+的兴趣,完成一件作品的成就感不言而喻。以后,我一定会好好学习,加强自己对软件开发的学习,提高自己的编程能力,成为一名出色的工程师,在C+编程的世界大放异彩。在此,我要感谢所有帮助过我的同学和指导老师们,你们的鼓励和帮助是我成功的动力。 附录用户使用手册1、根据提示,按任意键即可开始游戏。2、根据提示,按wsad即可进行游戏的操作。程序源代码#include#include#include#include#define CHECKPOINT 3/第3关通关,即最后一关通关,表示总关卡数#define DIMENSION 20/迷宫地图数组大小/定义栏杆#define ACCESS 0/表示迷宫中可以走动的路#define RAILING1 1/栏杆 #define RAILING2 2/栏杆 #define RAILING3 3/栏杆 #define RAILING4 4/栏杆 #define RAILING5 5/栏杆 #define RAILING6 6/栏杆 #define RAILING7 7/栏杆 #define RAILING8 8/栏杆 #define RAILING9 9/栏杆 #define RAILING10 10/栏杆 #define RAILING11 11/栏杆 #define RAILING12 12/人物 #define RAILING13 13/出口 #define RAILING14 14/墙 using namespace std;class Maze public:Maze();/构造函数,初始化关卡数据void ShowUI();/显示迷宫开始界面void Game();/游戏开始void ShowGame();/显示游戏界面void GameOver();/通关所有关卡,显示游戏结束界面void Move();/移动void NextCheckpoint();/下一关private:int mapDIMENSIONDIMENSION;/记录关卡地图int checkpoint;/记录当前关卡int x, y;/记录人物在迷宫中的坐标void Rand();/产生新地图;/主函数入口int main(void)Maze m;m.ShowUI();/显示初始界面m.Game();/游戏开始return 0;Maze:Maze()checkpoint = 0;/第一关Rand();system(cls);void Maze:ShowUI()cout endl;cout endl;cout endl;cout endl;cout endl;cout endl;cout endl;cout 欢 迎 进 入 小 游 戏 endl;cout endl;cout endl;cout 请 按 任 意 键 继 续. endl;cout endl;cout endl;cout endl;cout endl;cout endl;_getch();void Maze:Game()do if (CHECKPOINT = checkpoint)GameOver();/游戏通关else if (RAILING13 = mapyx)NextCheckpoint();/下一关else ShowGame();/打印迷宫Move();/移动 while (true);void Maze:ShowGame()int i = 0, j = 0;system(cls);cout endl;for (i = 0; i DIMENSION; i+)for (j = 0; j DIMENSION; j+) switch (mapij)case ACCESS:cout ; break;case RAILING1:cout ; break;case RAILING2:cout ; break;case RAILING3:cout ; break;case RAILING4:cout ; break;case RAILING5:cout ; break;case RAILING6:cout ; break;case RAILING7:cout ; break;case RAILING8:cout ; break;case RAILING9:cout ; break;case RAILING10:cout ; break;case RAILING11:cout ; break;case RAILING12:cout ; break;case RAILING13:cout ; break;case RAILING14:cout ; break;default:break;if (DIMENSION - 1 = j)/换行cout endl;cout endl t按键WSAD依次对应着上下左右 endl;void Maze:GameOver()system(cls);cout endl;cout endl;cout endl;cout endl;cout endl;cout endl;cout 恭喜你已经通关 endl;cout endl;cout endl;cout endl;cout endl;cout 0 & ACCESS = mapy - 1x) mapyx = ACCESS;map-yx = RAILING12;else if (y 0 & RAILING13 = mapy - 1x)/出口不覆盖数据-y;break;case s:/向下移动case S:if (y DIMENSION - 1 & ACCESS = mapy + 1x) mapyx = ACCESS;map+yx = RAILING12;else if (y 0 & ACCESS = mapyx - 1) mapyx = ACCESS;mapy-x = RAILING12;else if (x 0 & RAILING13 = mapyx - 1)-x;break;case d:/向右移动case D:if (x DIMENSION - 1 & ACCESS = mapyx + 1) mapyx = ACCESS;mapy+x = RAILING12;else if (x = CHECKPOINT)return;Rand();system(cls);cout endl endl t恭喜您第 checkpoint 关已通关,请按任意键继续。 endl;_getch();void Maze:Rand()int i = 0,j=0;for (i = 0; i DIMENSION; i+)for (j = 0; j DIMENSION; j+)mapij = ACCESS;for (i = 0; i DIMENSION; i+) /初始化砖墙位置mapi0 = RAILING14;mapiDIMENSION - 1 = RAILING14;map0i = RAILING14;mapDIMENSION - 1i = RAILING14;switch (checkpoint) case 0:/第一关map90 = RAILING12;/人物位置map9DIMENSION - 1 = RAILING13;/出口位置x = 0;/记录人物的x,y坐标y = 9;/ for (i = 3; i 8; i+) mapi2 = RAILING2;mapi8 = RAILING2;mapi10 = RAILING2;mapi17 = RAILING2;/ for (i = 11; i 17; i+) mapi2 = RAILING2;mapi8 = RAILING2;mapi10 = RAILING2;mapi17 = RAILING2;/ for (i = 3; i 8; i+) map2i = RAILING1;map8i = RAILING1;map10i = RAILING1;map17i = RAILING1;/ for (i = 11; i 17; i+) map2i = RAILING1;map8i = RAILING1;map10i = RAILING1;map17i = RAILING1;/map22 = RAILING3;map102 = RAILING3;map210 = RAILING3;map1010 = RAILING3;/map82 = RAILING4;map172 = RAILING4;map810 = RAILING4;map1710 = RAILING4;/map28 = RAILING5;map108 = RAILING5;map217 = RAILING5;map1017 = RAILING5;/map88 = RAILING6;map817 = RAILING6;map178 = RAILING6;map1717 = RAILING6;break;case 1:/第二关map80 = RAILING12;/人物位置map12DIMENSION - 1 = RAILING13;/出口位置x = 0;/记录人物的x,y坐标y = 8;for (i = 3; i 17; i+) map1i = RAILING1;map18i = RAILING1;for (i = 2; i 18; i+)mapi2 = RAILING2;map82 = ACCESS;map12 = RAILING3;map92 = RAILING3;map152 = RAILING7;map172 = RAILING7;map182 = RAILING4;for (i = 2; i 18; i+)mapi17 = RAILING2;for (i = 11; i 14; i+)mapi17 = ACCESS;map917 = ACCESS;map117 = RAILING5;map1817 = RAILING6;for (i = 3; i 5; i+) mapi4 = RAILING2;mapi11 = RAILING2;for (i = 5; i 11; i+) map2i = RAILING1;map4i = RAILING1;map47 = RAILING9;map410 = RAILING9;map24 = RAILING3;map44 = RAILING4;map211 = RAILING5;map411 = RAILING6;map68 = RAILING1;map69 = RAILING9;map57 = RAILING2;map510 = RAILING2;map67 = RAILING4;map610 = RAILING8;map79 = RAILING8;for (i = 7; i 9; i+)map7i = RAILING1;map76 = RAILING10;map74 = RAILING4;map64 = RAILING2;map66 = RAILING2;map54 = RAILING3;map56 = RAILING5;map75 = RAILING1;map55 = RAILING1;map89 = RAILING2;map109 = RAILING2;map99 = RAILING8;map119 = RAILING6;map98 = RAILING1;map97 = RAILING1;map118 = RAILING1;map117 = RAILING1;map96 = RAILING3;map116 = RAILING4;map106 = RAILING2;map93 = RAILING1;map94 = RAILING5;for (i = 10; i 15; i+)mapi4 = RAILING2;map154 = RAILING6;map153 = RAILING1;map173 = RAILING1;map183 = RAILING1;map184 = RAILING10;map174 = RAILING5;map186 = RAILING10;for (i = 14; i 18; i+) mapi6 = RAILING2;mapi8 = RAILING2;map136 = RAILING3;map137 = RAILING1;map138 = RAILING9;map188 = RAILING10;for (i = 9; i17; i+)map13i = RAILING1;map1317 = RAILING5;map710 = RAILING2;map810 = RAILING2;map910 = RAILING7;map1010 = RAILING2;map1110 = RAILING4;for (i = 11; i 17; i+) map9i = RAILING1;map11i = RAILING1;map917 = RAILING8;map1117 = RAILING6;break;case 2:/第三关map80 = RAILING12;/人物位置map12DIMENSION - 1 = RAILING13;/出口位置x = 0;/记录人物的x,y坐标y = 8;map91 = RAILING1;map92 = RAILING8;for (i = 1; i 9; i+)mapi2 = RAILING2;map52 = ACCESS;map42 =

温馨提示

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

评论

0/150

提交评论