温馨提示程序语言:C、C++、C#、Python(红色字体表示本课设使用的程序设计语言)图形功能选项:Win32控制台程序(黑框、文本界面)、Win32程序、MFC、WinForm、DirectX10(黑体标明表示本课设的程序图形类别,默认为非图形界面Win32控制台程序)数据结构:基础类型、数组、链表、双向链表、搜索树(非平衡二叉树)、平衡二叉树、链表与平衡二叉树相结合、堆栈、队列、串、图(黑体标明表示本课设使用的数据结构)C++语言项:STL库(黑体标明表示使用C++的STL库)编译环境:Windows764位旗舰版(Linux及其他环境请谨慎下载)集成开发环境:VisualC++6.0、DEVC++、CodeBlocks、VisualStudio2015均可通过编译。(浅蓝色字体表示需要运行修改后的版本,请用户自行选择源代码测试)分多头文件编译:否(所有代码基本都包含在一个文件内,如需试验头文件功能,请自行参考相关文献)内容说明: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附录....................................................................................................................................................1211题目简介人类建造迷宫已有5000年的历史。在世界的不同文化发展时期,这些奇特的建筑物始终吸引人们沿着弯弯曲曲、困难重重的小路吃力地行走,寻找真相。迷宫小游戏应运而生。在游戏中,迷宫被表现为寻找出口的一种益智小游戏。本课设用★代表人物,○代表出口,■代表围墙,其他制表符(例如:━、┃、┳等)用来构造道路和阻挡玩家的去路。玩家要在游戏中,通过复杂的道路找到出口方可胜利。本游戏一共设计3关,难度由低逐渐提升。本课设开发基于Windows764位系统,集成开发环境VisualStudio2015Pro。22功能模块划分本游戏一共分为四个功能模块,分别是开始界面的显示、进行游戏、下一关和通关界面的显示。1、首先,打开程序的时候会进入一个欢迎界面,按任意键即可开始游戏。2、玩家通过wsad控制人物(★)的上下左右。3、每当玩家到达出口(○)会自动显示通过本关卡,并等待玩家按任意键进行下一关游戏。4、当玩家通过所有的关卡时,将会显示一个通关界面。具体的功能模块图如下:开始界面进行游戏下一关通关2.1功能模块图33界面设计本程序完全通过文本模式进行,根据上述四大功能模块,需要设计四类用户界面,分别是开始界面,游戏界面,下一个界面,游戏结束界面。1、首先就是最基本的用户欢迎界面,也称开始界面,如下图3.1所示。图3.1开始界面2、其次,就是本程序的关键,也是这个游戏的核心所在,游戏交互界面,如下图3.2所示。4图3.2游戏交互界面3、接着,就是通过本关卡之后的界面,如图3.3所示。图3.3通关界面54、最后,就是通过所有关卡的游戏界面,如图3.4所示。图3.4游戏通关界面64详细设计4.1数据结构该迷宫小游戏只需设计一个类即可控制整个游戏的运行,通过分析,迷宫小游戏需要一个构造函数Maze()对游戏数据进行初始化,一个显示开始界面的函数ShowUI(),一个绘制游戏界面的函数ShowGame(),一个初始化下一关数据的函数NextCheckpoint(),一个控制人物移动的函数Move(),其中通过Rand()管理各关卡的地图数据,一个游戏结束界面函数GameOver(),还需要一个Game()函数控制游戏的开始与结束逻辑。在整个设计中,通过二维数组来映射各种文本字符(★、■等),其中映射数据通过宏定义来实现,这样方便管理与维护。类的数据结构如下:classMaze{public:Maze();//构造函数,初始化关卡数据voidShowUI();//显示迷宫开始界面voidGame();//游戏开始voidShowGame();//显示游戏界面voidGameOver();//通关所有关卡,显示游戏结束界面voidMove();//移动voidNextCheckpoint();//下一关private:intmap[DIMENSION][DIMENSION];//记录关卡地图intcheckpoint;//记录当前关卡intx,y;//记录人物在迷宫中的坐标voidRand();//产生新地图};4.2函数说明迷宫程序设计的函数都是类Maze的成员函数,分别是Maze()、voidShowUI()、voidGame()、voidShowGame()、voidGameOver()、voidMove()、voidNextCheckpoint()、voidRand()。1、Maze()属于构造函数,初始化第一关的游戏数据,例如人物★的x,y坐标,第一关的游戏地图数据等。72、ShowUI()展示欢迎进入游戏的界面。3、Game()控制游戏的进程,比如游戏开始、游戏进行中和结束的函数过程,是程序连贯的关键函数。4、ShowGame()打印游戏进行中的界面。5、GameOver()打印游戏结束界面,并结束程序的运行。6、Move()获取键盘的按键信息,控制人物★在二维数组中的位置,是该游戏程序的核心函数。7、NextCheckpoint()控制当前是第几关,并可调用Rand()对下一关的地图数据进行初始化。8、Rand()用来初始化每一个的地图信息和人物位置信息,通过Rand()可方便关卡的增减修改,利于维护。以下是Game()成员函数的代码,代码质量风格良好。voidMaze::Game(){do{if(CHECKPOINT==checkpoint)GameOver();//游戏通关elseif(RAILING13==map[y][x])NextCheckpoint();//下一关else{ShowGame();//打印迷宫Move();//移动}}while(true);}4.3函数设计流程图迷宫程序设计的函数都是类Maze的成员函数,分别是Maze()、voidShowUI()、voidGame()、voidShowGame()、voidGameOver()、voidMove()、voidNextCheckpoint()、voidRand()。其中,比较核心的两个函数(Game()与Move()函数)的程序流程图如下所示:8是否否是Game()开始判断游戏是否结束?是否进行下一关?显示迷宫界面ShowUI()获取移动命令Move()初始化下一关数据NextCheckpoint()Game()结束调用GameOver()图4.3.1Game函数流程图9d键a键s键w键是wsad键非wsad键Move()开始获取按键信息判断wsad按键处理向上(w键)移动处理向下(s键)移动处理向左(a键)移动处理向右(d键)移动Move()结束图4.3.2Move函数流程图105遇到的问题及解决办法1、游戏开始设计的时候,不知道如何对控制台进行清屏操作,导致游戏界面比较乱。通过查阅网上资料,了解到了system(“cls”)函数可实现控制台界面的清屏操作,这样看起来便简洁了很多。2、本程序一开始通过cin函数进行键盘按键的读入,导致游戏无法连贯运行。通过查阅网上资料,_getch()函数,从键盘获取一个按键,但不回显在屏幕上,完成了游戏的实时运行操作。3、标记人物★的x,y坐标经常与数组的行列混淆,老是出现map[x][y]这样的错误。通过细心观察和总结,加深对知识的了解和运用,避免类似这样的非语法错误,养成良好的代码习惯,下面再说一次map[y][x]才是正确的写法。4、游戏结束的逻辑思路一直没连贯起来,导致程序进入死循环。通过查阅相关资料,知道exit(0)可以在代码的任何位置结束程序的运行。5、由于基础的不扎实以及考虑的不够全面,一开始在Move()的