版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
温馨提示程序语言:C、C++、C*、Python〔红色字体表示本课设使用的程序设计语言〕图形功能选项:Win32控制台程序〔黑框、文本界面〕、Win32程序、MFC、WinForm、Direct*10〔黑体标明表示本课设的程序图形类别,默认为非图形界面Win32控制台程序〕数据构造:根底类型、数组、链表、双向链表、搜索树〔非平衡二叉树〕、平衡二叉树、链表与平衡二叉树相结合、堆栈、队列、串、图〔黑体标明表示本课设使用的数据构造〕C++语言项:STL库〔黑体标明表示使用C++的STL库〕编译环境:Windows764位旗舰版〔Linu*及其他环境请慎重下载〕集成开发环境:VisualC++6.0、DEVC++、CodeBlocks、VisualStudio2015均可通过编译。〔浅蓝色字体表示需要运行修改后的版本,请用户自行选择源代码测试〕分多头文件编译:否〔所有代码根本都包含在一个文件,如需试验头文件功能,请自行参考相关文献〕容说明:1、课设题目及预览容将在第二页开场展示。2、代码行数:525行3、目录所示容,本文根本涵盖,如无容,会在本页进展说明。4、附录绝对包含用户使用手册及程序完整源代码和详细注释。5、如需下载其他头文件〔例如Direct*需另行配置〕,本文会在此进展说明。6、本文撰写容仅供学习参考,另外,由于本人水平有限,编写之处难免存在错误和纰漏,恳请各位教师或同学批评指正。题目:基于C++控制台游戏的设计任务要求:代码量不低于300行,至少有5个函数,不得存在重复代码。游戏设计具有一定可玩性,设计至少3关,界面和交互性友好,不得存在BUG。每个人书写一份课程设计报告,报告中包含如下容:题目简介〔一段题目的简单介绍,一段题目开发的硬软要求〕功能模块划分界面设计详细设计〔流程图,或代码,每一局部代码要有相应的文字说明〕遇到的问题及解决方法〔5个问题以上〕总结与展望本课设文档基于迷宫游戏进展课程设计。运行截图如下:课程设计报告课题:学院:专业:学生:**:指导教师:20**年**月**日目录1题目简介32功能模块划分33界面设计34详细设计34.1数据构造34.2函数说明34.3函数设计流程图35遇到的问题及解决方法36总结与展望3附录31题目简介人类建造迷宫已有5000年的历史。在世界的不同文化开展时期,这些奇特的建筑物始终吸引人们沿着弯弯曲曲、困难重重的小路吃力地行走,寻找真相。迷宫小游戏应运而生。在游戏中,迷宫被表现为寻找出口的一种益智小游戏。本课设用*代表人物,○代表出口,■代表围墙,其他制表符〔例如:━、┃、┳等〕用来构造道路和阻挡玩家的去路。玩家要在游戏中,通过复杂的道路找到出口方可胜利。本游戏一共设计3关,难度由低逐渐提升。本课设开发基于Windows764位系统,集成开发环境VisualStudio2015Pro。2功能模块划分本游戏一共分为四个功能模块,分别是开场界面的显示、进展游戏、下一关和通关界面的显示。1、首先,翻开程序的时候会进入一个欢送界面,按任意键即可开场游戏。2、玩家通过wsad控制人物〔*〕的上下左右。3、每当玩家到达出口〔○〕会自动显示通过本关卡,并等待玩家按任意键进展下一关游戏。4、当玩家通过所有的关卡时,将会显示一个通关界面。具体的功能模块图如下:2.1功能模块图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(),一个初始化下一关数据的函数Ne*tCheckpoint(),一个控制人物移动的函数Move(),其过Rand()管理各关卡的地图数据,一个游戏完毕界面函数GameOver(),还需要一个Game()函数控制游戏的开场与完毕逻辑。在整个设计中,通过二维数组来映射各种文本字符〔*、■等〕,其中映射数据通过宏定义来实现,这样方便管理与维护。类的数据构造如下:classMaze{public: Maze(); //构造函数,初始化关卡数据voidShowUI(); //显示迷宫开场界面voidGame(); //游戏开场voidShowGame(); //显示游戏界面voidGameOver(); //通关所有关卡,显示游戏完毕界面voidMove(); //移动voidNe*tCheckpoint(); //下一关private:intmap[DIMENSION][DIMENSION]; //记录关卡地图intcheckpoint; //记录当前关卡int*,y; //记录人物在迷宫中的坐标voidRand(); //产生新地图};4.2函数说明迷宫程序设计的函数都是类Maze的成员函数,分别是Maze()、voidShowUI()、voidGame()、voidShowGame()、voidGameOver()、voidMove()、voidNe*tCheckpoint()、voidRand()。1、Maze()属于构造函数,初始化第一关的游戏数据,例如人物*的*,y坐标,第一关的游戏地图数据等。2、ShowUI()展示欢送进入游戏的界面。3、Game()控制游戏的进程,比方游戏开场、游戏进展中和完毕的函数过程,是程序连贯的关键函数。4、ShowGame()打印游戏进展中的界面。5、GameOver()打印游戏完毕界面,并完毕程序的运行。6、Move()获取键盘的按键信息,控制人物*在二维数组中的位置,是该游戏程序的核心函数。7、Ne*tCheckpoint()控制当前是第几关,并可调用Rand()对下一关的地图数据进展初始化。8、Rand()用来初始化每一个的地图信息和人物位置信息,通过Rand()可方便关卡的增减修改,利于维护。以下是Game()成员函数的代码,代码质量风格良好。voidMaze::Game(){do{if(CHECKPOINT==checkpoint) GameOver();//游戏通关elseif(RAILING13==map[y][*]) Ne*tCheckpoint(); //下一关else{ ShowGame(); //打印迷宫Move(); //移动 } }while(true);}4.3函数设计流程图迷宫程序设计的函数都是类Maze的成员函数,分别是Maze()、voidShowUI()、voidGame()、voidShowGame()、voidGameOver()、voidMove()、voidNe*tCheckpoint()、voidRand()。其中,比拟核心的两个函数〔Game()与Move()函数〕的程序流程图如下所示:图4.3.1Game图4.3.1Game函数流程图是否否是Game()开场判断游戏是否完毕?是否进展下一关?显示迷宫界面ShowUI()获取移动命令Move()初始化下一关数据Ne*tCheckpoint()Game()完毕调用GameOver()图4.3.2Move图4.3.2Move函数流程图d键a键s键w键是wsad键非wsad键Move()开场获取按键信息判断wsad按键处理向上(w键)移动处理向下(s键)移动处理向左(a键)移动处理向右(d键)移动Move()完毕5遇到的问题及解决方法1、游戏开场设计的时候,不知道如何对控制台进展清屏操作,导致游戏界面比拟乱。通过查阅网上资料,了解到了system(“cls〞)函数可实现控制台界面的清屏操作,这样看起来便简洁了很多。2、本程序一开场通过cin函数进展键盘按键的读入,导致游戏无法连贯运行。通过查阅网上资料,_getch()函数,从键盘获取一个按键,但不回显在屏幕上,完成了游戏的实时运行操作。3、标记人物*的*,y坐标经常与数组的行列混淆,老是出现map[*][y]这样的错误。通过细心观察和总结,加深对知识的了解和运用,防止类似这样的非语法错误,养成良好的代码习惯,下面再说一次map[y][*]才是正确的写法。4、游戏完毕的逻辑思路一直没连贯起来,导致程序进入死循环。通过查阅相关资料,知道e*it(0)可以在代码的任何位置完毕程序的运行。5、由于根底的不扎实以及考虑的不够全面,一开场在Move()的时候只进展了小写字母wsad按键的处理,没有处理大写的WSAD按键,这样会导致大写的时候,无法控制游戏人物的移动。通过刻苦的学习,在switch里面每个的casew:上下,再增加一行caseW:即可,这样执行同样的代码就无须再复制粘贴一遍了,或者再写一个函数解决。6总结与展望在做这个课程设计的时候,我感觉我就像迷宫里的*一样,通过解决一个个的问题,最后通过了一关关的关卡,得到了游戏的胜利。一路走来着实不易,在一次次调试奔溃中躺过,如果不是教师和同学们的指导和帮助,或许我已经放弃了前进。这次小游戏的开发,是我人生中的一次淬炼,是我迈向一名出色工程师的试炼。无数个日日夜夜的积累与奋斗在这次开发中反映的淋漓尽致,人生也像课程设计一样,不能缺少规划和磨练。只有坚持奋斗,克制一个个困难,才能到达最后的终点,品味风雨后的彩虹。在此次开发设计中,我领悟了很多的道理,收获了很多以往在课堂上得不到的心得和感悟,也提高了我对C++的兴趣,完成一件作品的成就感不言而喻。以后,我一定会好好学习,加强自己对软件开发的学习,提高自己的编程能力,成为一名出色的工程师,在C++编程的世界大放异彩。在此,我要感所有帮助过我的同学和指导教师们,你们的鼓励和帮助是我成功的动力。附录用户使用手册1、根据提示,按任意键即可开场游戏。2、根据提示,按wsad即可进展游戏的操作。程序源代码*include<iostream>*include<conio.h>*include<stdlib.h>*include<time.h>*defineCHECKPOINT3 //第3关通关,即最后一关通关,表示总关卡数*defineDIMENSION20 //迷宫地图数组大小//定义栏杆*defineACCESS0 //表示迷宫中可以走动的路*defineRAILING11 //栏杆━*defineRAILING22 //栏杆┃*defineRAILING33 //栏杆┏*defineRAILING44 //栏杆┗*defineRAILING55 //栏杆┓*defineRAILING66 //栏杆┛*defineRAILING77 //栏杆┣*defineRAILING88 //栏杆┫*defineRAILING99 //栏杆┳*defineRAILING1010 //栏杆┻*defineRAILING1111 //栏杆╋*defineRAILING1212 //人物**defineRAILING1313 //出口○*defineRAILING1414 //墙■usingnamespacestd;classMaze{public: Maze(); //构造函数,初始化关卡数据voidShowUI(); //显示迷宫开场界面voidGame(); //游戏开场voidShowGame(); //显示游戏界面voidGameOver(); //通关所有关卡,显示游戏完毕界面voidMove(); //移动voidNe*tCheckpoint(); //下一关private:intmap[DIMENSION][DIMENSION]; //记录关卡地图intcheckpoint; //记录当前关卡int*,y;//记录人物在迷宫中的坐标voidRand(); //产生新地图};//主函数入口intmain(void){Mazem; m.ShowUI(); //显示初始界面m.Game(); //游戏开场return0;}Maze::Maze(){ checkpoint=0; //第一关Rand(); system("cls");}voidMaze::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();}voidMaze::Game(){do{if(CHECKPOINT==checkpoint) GameOver(); //游戏通关elseif(RAILING13==map[y][*]) Ne*tCheckpoint(); //下一关else{ ShowGame(); //打印迷宫Move(); //移动 } }while(true);}voidMaze::ShowGame(){inti=0,j=0; system("cls"); cout<<endl;for(i=0;i<DIMENSION;i++)for(j=0;j<DIMENSION;j++){switch(map[i][j]) {caseACCESS:cout<<"";break;caseRAILING1:cout<<"━";break;caseRAILING2:cout<<"┃";break;caseRAILING3:cout<<"┏";break;caseRAILING4:cout<<"┗";break;caseRAILING5:cout<<"┓";break;caseRAILING6:cout<<"┛";break;caseRAILING7:cout<<"┣";break;caseRAILING8:cout<<"┫";break;caseRAILING9:cout<<"┳";break;caseRAILING10:cout<<"┻";break;caseRAILING11:cout<<"╋";break;caseRAILING12:cout<<"*";break;caseRAILING13:cout<<"○";break;caseRAILING14:cout<<"■";break;default:break; }if(DIMENSION-1==j) //换行cout<<endl; } cout<<endl<<"\t按键WSAD依次对应着上下左右"<<endl;}voidMaze::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<<"┗━━━━━━━━━━━━━━━━┛"<<endl; _getch(); e*it(0);}voidMaze::Move(){switch(_getch()){case'w': //向上移动case'W':if(y>0&&ACCESS==map[y-1][*]){ map[y][*]=ACCESS; map[--y][*]=RAILING12; }elseif(y>0&&RAILING13==map[y-1][*]) //出口不覆盖数据--y;break;case's': //向下移动case'S':if(y<DIMENSION-1&&ACCESS==map[y+1][*]){ map[y][*]=ACCESS; map[++y][*]=RAILING12; }elseif(y<DIMENSION-1&&RAILING13==map[y+1][*]) ++y;break;case'a': //向左移动case'A':if(*>0&&ACCESS==map[y][*-1]){ map[y][*]=ACCESS; map[y][--*]=RAILING12; }elseif(*>0&&RAILING13==map[y][*-1]) --*;break;case'd': //向右移动case'D':if(*<DIMENSION-1&&ACCESS==map[y][*+1]){ map[y][*]=ACCESS; map[y][++*]=RAILING12; }elseif(*<DIMENSION-1&&RAILING13==map[y][*+1]) ++*;break; }}voidMaze::Ne*tCheckpoint(){ checkpoint++;if(checkpoint>=CHECKPOINT)return; Rand(); system("cls"); cout<<endl<<endl<<"\t恭喜您第"<<checkpoint<<"关已通关,请按任意键继续。"<<endl; _getch();}voidMaze::Rand(){inti=0,j=0;for(i=0;i<DIMENSION;i++)for(j=0;j<DIMENSION;j++) map[i][j]=ACCESS;for(i=0;i<DIMENSION;i++){ //初始化砖墙位置map[i][0]=RAILING14; map[i][DIMENSION-1]=RAILING14; map[0][i]=RAILING14; map[DIMENSION-1][i]=RAILING14; }switch(checkpoint){case0: //第一关map[9][0]=RAILING12; //人物位置map[9][DIMENSION-1]=RAILING13; //出口位置*=0; //记录人物的*,y坐标y=9;//┃for(i=3;i<8;i++){ map[i][2]=RAILING2; map[i][8]=RAILING2; map[i][10]=RAILING2; map[i][17]=RAILING2; }//┃for(i=11;i<17;i++){ map[i][2]=RAILING2; map[i][8]=RAILING2; map[i][10]=RAILING2; map[i][17]=RAILING2; }//━for(i=3;i<8;i++){ map[2][i]=RAILING1; map[8][i]=RAILING1; map[10][i]=RAILING1; map[17][i]=RAILING1; }//━for(i=11;i<17;i++){ map[2][i]=RAILING1; map[8][i]=RAILING1; map[10][i]=RAILING1; map[17][i]=RAILING1; }//┏map[2][2]=RAILING3; map[10][2]=RAILING3; map[2][10]=RAILING3; map[10][10]=RAILING3;//┗map[8][2]=RAILING4; map[17][2]=RAILING4; map[8][10]=RAILING4; map[17][10]=RAILING4;//┓map[2][8]=RAILING5; map[10][8]=RAILING5; map[2][17]=RAILING5; map[10][17]=RAILING5;//┛map[8][8]=RAILING6; map[8][17]=RAILING6; map[17][8]=RAILING6; map[17][17]=RAILING6;break;case1: //第二关map[8][0]=RAILING12; //人物位置map[12][DIMENSION-1]=RAILING13; //出口位置*=0; //记录人物的*,y坐标y=8;for(i=3;i<17;i++){ map[1][i]=RAILING1; map[18][i]=RAILING1; }for(i=2;i<18;i++) map[i][2]=RAILING2; map[8][2]=ACCESS; map[1][2]=RAILING3; map[9][2]=RAILING3; map[15][2]=RAILING7; map[17][2]=RAILING7; map[18][2]=RAILING4;for(i=2;i<18;i++) map[i][17]=RAILING2;for(i=11;i<14;i++) map[i][17]=ACCESS; map[9][17]=ACCESS; map[1][17]=RAILING5; map[18][17]=RAILING6;for(i=3;i<5;i++){ map[i][4]=RAILING2; map[i][11]=RAILING2; }for(i=5;i<11;i++){ map[2][i]=RAILING1; map[4][i]=RAILING1; } map[4][7]=RAILING9; map[4][10]=RAILING9; map[2][4]=RAILING3; map[4][4]=RAILING4; map[2][11]=RAILING5; map[4][11]=RAILING6; map[6][8]=RAILING1; map[6][9]=RAILING9; map[5][7]=RAILING2; map[5][10]=RAILING2; map[6][7]=RAILING4; map[6][10]=RAILING8; map[7][9]=RAILING8;for(i=7;i<9;i++) map[7][i]=RAILING1; map[7][6]=RAILING10; map[7][4]=RAILING4; map[6][4]=RAILING2; map[6][6]=RAILING2; map[5][4]=RAILING3; map[5][6]=RAILING5; map[7][5]=RAILING1; map[5][5]=RAILING1; map[8][9]=RAILING2; map[10][9]=RAILING2; map[9][9]=RAILING8; map[11][9]=RAILING6; map[9][8]=RAILING1; map[9][7]=RAILING1; map[11][8]=RAILING1; map[11][7]=RAILING1; map[9][6]=RAILING3; map[11][6]=RAILING4; map[10][6]=RAILING2; map[9][3]=RAILING1; map[9][4]=RAILING5;for(i=10;i<15;i++) map[i][4]=RAILING2; map[15][4]=RAILING6; map[15][3]=RAILING1; map[17][3]=RAILING1; map[18][3]=RAILING1; map[18][4]=RAILING10; map[17][4]=RAILING5; map[18][6]=RAILING10;for(i=14;i<18;i++){ map[i][6]=RAILING2; map[i][8]=RAILING2; } map[13][6]=RAILING3; map[13][7]=RAILING1; map[13][8]=RAILING9; map[18][8]=RAILING10;for(i=9;i<17;i++) map[13][i]=RAILING1; map[13][17]=RAILING5; map[7][10]=RAILING2; map[8][10]=RAILING2; map[9][10]=RAILING7; map[10][10]=RAILING2; map[11][10]=RAILING4;for(i=11;i<17;i++){ map[9][i]=RAILING1; map[11][i]=RAILING1; } map[9][17]=RAILING8; map[11][17]=RAILING6;break;case2: //第三关map[8][0]=RAILING12; //人物位置map[12][DIMENSION-1]=RAILING13; //出口位置*=0; //记录人物的*,y坐标y=8; map[9][1]=RAILING1; map[9][2]=RAILING8;for(i=1;i<9;i++) map[i][2]=RAILING2; map[5][2]=ACCESS; map[4][2]=RAILING4; map[6][2]=RAILING3;for(i=3;i<11;i++) map[4][i]=RAILING1;for(i=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 搬运装卸服务项目投标方案投标文件(技术方案)
- 护理质量控制与护理质量管理体系
- 畜禽屠宰加工工安全培训效果竞赛考核试卷含答案
- 铌碳还原火法冶炼工安全生产意识竞赛考核试卷含答案
- 道路客运服务员安全生产基础知识能力考核试卷含答案
- 掩膜版制造工操作能力强化考核试卷含答案
- 民间工艺品艺人岗前技术传承考核试卷含答案
- 排岩机操作工岗前冲突管理考核试卷含答案
- 种苗繁育员岗前设备考核试卷含答案
- 量具制造工持续改进竞赛考核试卷含答案
- 给小学生讲中医知识课件
- 培训生态环境培训课件
- 主生产计划(MPS)编制案例
- 可信数据空间解决方案星环科技
- DB11-T 1713-2020 城市综合管廊工程资料管理规程
- 《纺织材料的基础概念》课件
- 2025年浙江宁波市粮食收储有限公司招聘笔试参考题库含答案解析
- 二零二五年度高校毕业生论文保密及知识产权保护协议3篇
- 12J201平屋面建筑构造图集(完整版)
- DB21-T 4052-2024 统筹共享卫星遥感影像数据生产技术规程
- Profinet(S523-FANUC)发那科通讯设置
评论
0/150
提交评论