ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:283.96KB ,
资源ID:28845416      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/28845416.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(老鼠走迷宫数据结构课程设计报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

老鼠走迷宫数据结构课程设计报告.docx

1、老鼠走迷宫数据结构课程设计报告信息科学与技术学院数据结构课程设计报告题目名称:专业班级:学生姓名:学生学号:指导教师:走迷宫游戏计科20132班何意2013508063 高攀 完成日期: 2016年1 月 5 日一、需求分析程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。要求:1、老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;2、迷宫的墙足够结实,老鼠不能穿墙而过;3、正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;4、添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;5、

2、找出走出迷宫的所有路径,以及最短路径。利用序列化功能实现迷宫地图文件的存盘和读出等功能。本程序使用OpenGL图形库来实现上述程序功能,采用面向对象的程序设计方法编写了一个3D小游戏,定义两个类:老鼠类和迷宫类。OpenGL简介:OpenGL 作为当前主流的图形 API具有以下特点: 1、与 C 语言紧密结合。 OpenGL 命令最初就是用 C 语言函数来进行描述的,对于学习过 C 语言的人来讲,OpenGL 是容易理解和学习。2、强大的可移植性。 微软的 Direct3D 虽然也是十分优秀的图形 API,但它只用于 Windows 系统(现在还要加上一个 XBOX 游 戏机)。而 OpenG

3、L 不仅用于 Windows,还可以用于 Unix/Linux 等其它系统,它甚至在大型计算机、各种 专业计算机(如:医疗用显示设备)上都有应用。并且,OpenGL 的基本命令都做到了硬件无关,甚至是 平台无关。 3、高性能的图形渲染。OpenGL 是一个工业标准,它的技术紧跟时代,现今各个显卡厂家无一不对 OpenGL 提供强力支持,激烈 的竞争中使得 OpenGL 性能一直领先。 总之,OpenGL 是一个很强大的图形软件接口。DOOM3 和 QUAKE4 等专业大型游戏出色的视觉表现力就是OpenGL强大性能的体现。二、概要设计1、设计思路整体设计思路:采用面向对象的程序设计方法,将迷宫

4、和老鼠作为两个单独的类来实现。游戏逻辑设计思路:首先使用DFS算法思想根据用户输入迷宫的规模随机生成一个用二维矩阵形式表示的逻辑上的迷宫,再计算出迷宫在实际空间中的坐标,调用OpenGL提供的绘图API绘制迷宫,再绘制一只老鼠,当玩家按下游戏控制键后,先检测碰撞,再根据按的键计算出老鼠的新位置的坐标,然后重新绘制老鼠,期间还要一直进行所用时间的判断,若超时则提前结束游戏,若玩家成功完成游戏则输出玩家得分并结束游戏。2、程序所使用的重要抽象数据类型(部分)1、栈stack sk定义:库文件中的标准定义。 功能:DFS-遍历栈,记录表示迷宫矩阵中已经处理过的方格,将还需要打通的方格压入栈中,将已经

5、不能打通的方格弹出栈,算法将遍历每一个方格,保证每个方格都会被打洞。操作:压栈操作Push(),弹出操作Pop(),取栈顶元素Top()。2、二维向量Int2定义:templatestruct Vector2 Vector2(Type _x = Type(0), Type _y = Type(0) :x(_x), y(_y) Type x, y;typedef Vector2 Int2;功能: 用来记录创建迷宫时当前操作的位置行号与列号,检测碰撞中记录当前检测点所在的迷宫行号与列号。操作:对x和y的赋值。3、三维向量GLfloat3定义:template struct Vector3f Vec

6、tor3f(Type _x = Type(0), Type _y = Type(0), Type _dir = Type(0) :x(_x), y(_y), dir(_dir) Type x, y, dir;typedef Vector3f GLfloat3;功能:用来记录绘制迷宫墙体的立方体的坐标和朝向。操作:对x,y和dir的赋值。4、二维矩阵globalNorth,globalEast和globalRecord定义:bool globalNorth100100; bool globalEast100100;bool globalRecord100100; 功能:在创建迷宫时所用的数据结构

7、,globalNorth表示迷宫格子北面(上)的墙的状态(0可通行,1墙),globalEast表示迷宫东面的墙状态,record表示迷宫格子本身是否被处理过(1-没有处理,0-处理过)。3、程序的六个主要功能模块:1) 主程序模块,功能:负责初始化游戏窗口和控制程序中各个模块的协调工作;2) 绘制老鼠模块,功能:实现老鼠形象的创建;3) 绘制迷宫的模块,功能:实现迷宫的绘制;4)键盘控制捕捉模块;5)老鼠的移动和碰撞检测模块,功能:实现老鼠对键盘的响应和检测是否与墙壁产生碰撞;6)游戏中的时间控制模块,功能:实现对玩家所用时间和剩余时间的计算,以及判断是否超时。模块之间的调用关系图如图1-0

8、所示:图1-04、程序运行流程图如图1-1所示:图1-1三、详细设计1、老鼠类的定义UML类图如图1-2所示: 图1-22、函数实现说明:1、主函数void main(int argc,char *rgc)功能:实现对游戏整体的运行控制,依次调用各个功能模块。伪代码:void main(int argc, char *argv) 读入玩家输入的迷宫规模;调用迷宫类对象的createmaze()函数创建迷宫;调用老鼠类对象的getmaze()函数获取老鼠所在的迷宫指针;初始化OpenGL图形窗口;while(游戏未结束) 调用CPU闲时绘图函数重复绘图; 检测键盘控制;return; 2、绘制老

9、鼠函数void Mouse:drawmouse()功能:负责在OpenGL构图空间中绘制老鼠形象。用法:在需要绘制老鼠的时候调用mymouse.drawmouse()函数即可,本程序是在myDispaly()函数中调用的。伪代码:void Mouse:drawmouse() 设置对原点的偏移量,实现老鼠的移动; 设置旋转角度,实现老鼠的转向,实际先旋转再平移; 拉伸躯干和面部绘制老鼠躯干; 绘制老鼠头部;绘制右眼睛;绘制左眼睛;绘制一面白色胡须;另一面的胡须;碰撞检测参考点;绘制鼻子;绘制效果如图1-3:图1-33、创建迷宫函数void Maze:createMaze()功能:使用DFS深度优

10、先搜索算法在一个二维矩阵中生成一个逻辑上的迷宫,并且将逻辑形式上的迷宫的墙体在OpenGL构图空间的实际坐标值和方向计算出来并保存在一个栈vecCube中,共绘图函数直接使用。代码:void Maze:createMaze() for (int i = 0; i = S; i+) /给迷宫设置一个外围 for (int j = 0; j = S; j+) globalNorthij = true; globalEastij = true; globalRecordij = true; for (int i = 0; i = S + 1; i+) globalRecordi0 = globalR

11、ecordiS + 1 = false;for (int i = 0; i = S + 1; i+) globalRecord0i = globalRecordS + 1i = false; Int2 dir4 = Int2(0, -1), Int2(1, 0), Int2(0, 1), Int2(-1, 0) ; vector vg;/记录格子(左上右下)可以打洞的方向 stack sk;/DFS-遍历栈,将遍历每一个方格,保证每个方格都会被打洞 /生成“老鼠”所在的格子 int x = rand() % S + 1; int y = rand() % S + 1; sk.push(Int2

12、(x, y); while (!sk.empty() Int2 pos = sk.top(); vg.clear(); for (int i = 0; i 4; i+) int c = pos.x + diri.x; int r = pos.y + diri.y; /可以打洞 if (globalRecordcr) vg.push_back(i); if (vg.size() = 0) /该格子四周都不需要打洞 sk.pop(); continue; else /随机一个方向打洞 int i = vgrand() % vg.size(); globalRecordpos.x + diri.xp

13、os.y + diri.y = false; globalRecordpos.xpos.y = false; switch (i) case 0: globalEastpos.xpos.y - 1 = false; break; case 1: globalNorthpos.xpos.y = false; break; case 2: globalEastpos.xpos.y = false; break; case 3: globalNorthpos.x - 1pos.y = false; break; if (vg.size() = 1) sk.pop(); sk.push(Int2(po

14、s.x + diri.x, pos.y + diri.y); /最外层墙壁打洞,(生成出口) globalNorthSS = false; globalNorth01 = false; /横向线段 for (int i = 0; i = S; i+) for (int j = 1; j = S; j+) if (globalNorthij) GLfloat3 a; a.x = (j - 1)*GSZ+j*GSZ)/2; a.y = i*GSZ; a.dir = NORTH; vecCube.push_back(a); /竖向线段 for (int i = 1; i = S; i+) for (

15、int j = 0; j = S; j+) if (globalEastij) GLfloat3 b; b.x = j*GSZ; b.y = (i*GSZ+(i - 1)*GSZ)/2; b.dir = EAST; vecCube.push_back(b);4、绘制迷宫函数void Maze:drawmaze()功能:负责在OpenGL构图空间中绘制迷宫。用法:在需要绘制迷宫调用类对象的绘图成员函数即可,本程序中是在myDisply()函数中调用的。伪代码:void Maze:drawMaze() 设置围墙颜色;从保存围墙分部信息的栈vecCube中依次取出栈顶元素进行绘制墙体; 绘制终点线;

16、绘制的效果如图1-4:图1-45、移动和碰撞检测函数void Mouse:move()功能:实现老鼠对键盘的响应和使用盒式包围法检测是否与墙壁产生碰撞。用法:在OpenGL提供提供的键盘控制捕捉函数glutKeyboardFunc()中调用,对玩家输入老鼠的移动进行响应并重新设置老鼠的新位置坐标和新方向,若产生碰撞则调用碰撞处理函数。伪代码:void Mouse:move( unsigned char key,int x,int y) /按键响应函数,设置老鼠的移动并检测碰撞,使用盒式包围法思想,共需要检测四个点的碰撞情况ABCD 时间逻辑判断部分;首次按键开始计时; 移动和碰撞检测部分;判断

17、老鼠是否到达终点,是转到1,否到21:到达终点;显示得分画面并结束游戏2: switch (key) /对按键响应 case w or a or s or d : if(direction=方向)/给出朝向为Y轴正方向的的详细代码 计算碰撞点A,B的逻辑坐标 ; 计算A,B点在迷宫中的行号和列号; 检测A点是否碰撞; 检测B点是否碰撞;若未发生碰撞,则根据方向设置老鼠位置;若发生碰撞,则调用碰撞处理函数;摄像机移动部分; 当老鼠朝向为Y轴正方向时,按w键(前进)时 计算碰撞点的逻辑坐标; 检测A点是否碰撞;检测B点是否碰撞;四、调试分析1. 刚开始的时候绘制迷宫时没搞清楚迷宫行号和列号与空间坐

18、标的映射关系,导致迷宫的绘制一直不正确,后来仔细作图分析才最终确定出了正确的映射关系。2. 个人感觉最难的部分就是碰撞处理,因为碰撞多种情况,每种情况必须单独仔细的分析,计算出精确到空间像素点之间的位置关系,这个模块花费了大量的时间和脑力。3. 本程序的模块划分比较合理,而且采用面向对象的程序设计方法,很好的封装了类对象的数据和操作,增强的程序与实际的仿真性,而且使用各个模块只需调用相应对象的成员函数即可,方便直观。 4、在构图时需要运用大量空间几何的数学知识,因为绘图时需要计算关键像素点的空间位置以及和其他关键点的相对位置。5. 本课程设计作业采用面向对象的程序设计方法,设计了两个类和游戏的

19、逻辑控制模块。设计时思路清晰,实现时调试顺利。各模块具有较好的可重用性。确实得到了一次良好的程序设计训练。五、用户手册1. 本程序由一个游戏控制窗口和一个游戏显示窗口组成,游戏控制窗口负责读入玩家输入的迷宫规模,显示所用时间和剩余时间,游戏显示窗口则完成显示老鼠和迷宫的功能,程序的执行文件为 OpenGLTest.exe。2. 进入演示程序后即显示文本方式的用户界面如图1-5所示:输入迷宫的规模(边数)图1-5游戏界面如图1-6所示:图1-6每次按键显示所用时间和剩余时间如图1-7所示: 图1-7完成游戏后显示得分画面如图1-8所示:游戏分数的计算公式为:(迷宫规模的平方+100)/所用时间+

20、剩余时间同样的游戏难度,所用时间越少分数越高;同样的所用时间,游戏难度越大分数越高。图1-8六、测试结果以下数据是在本程序中输入迷宫规模为5的运行结果:开始:输入5得到的globalNorth矩阵如图1-8所示:图1-8globalEast矩阵如图1-9所示: globalRecord矩阵如图1-10: 图1-9 图1-10生成的迷宫如图1-11所示:图1-11对几个关键变量的跟踪如图1-12所示:LogicalA表示碰撞检测点的逻辑坐标,根据这个坐标与终点线之间的大小关系判断老鼠是否到达终点,UsedTime是所用时间,是计算分数和判断是否超时的重要参数,最后一个表达式计算的就是玩家所得分数。文本仅供参考,感谢下载!

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1