




已阅读5页,还剩12页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
数据结构课程设计 走迷宫游戏 数据结构课程设计报告 设计题目:走迷宫游戏专 业:计算机科技院 系:计算机学院姓 名: xxxxxxxx学 号: xxxxxxxxx时间:2013年10月10日目 录一、课程设计的目的.2二、需求分析.2三、课程设计报告内容.31.概要设计.32.详细设计.43.调试分析.94.用户手册.95.测试结果.106.程序清单.11四、小结16 五、参考文献16一、课程设计的目的(1) 熟练使用 C 语言编写程序,解决实际问题;(2) 了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;(3) 初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;(4) 提高综合运用所学的理论知识和方法独立分析和解决问题的能力;二、需求分析程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。要求:老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;迷宫的墙足够结实,老鼠不能穿墙而过;正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;找出走出迷宫的所有路径,以及最短路径。利用序列化功能实现迷宫地图文件的存盘和读出等功能三、实验报告内容1 概要设计(1) 具体要求构建一个二维数组mazeM+2N+2用于存储迷宫矩阵自动或手动生成迷宫,即为二维数组mazeM+2N+2赋值构建一个队列用于存储迷宫路径建立迷宫节点struct point,用于存储迷宫中每个节点的访问情况实现搜索算法屏幕上显示操作菜单 (2)本程序包含10个函数: 主函数 main()手动生成迷宫函数 shoudong_maze()自动生成迷宫函数 zidong_maze()将迷宫打印成图形 print_maze()打印迷宫路径 (若存在路径) result_maze()入队 enqueue()出队 dequeue()判断队列是否为空 is_empty()访问节点 visit()搜索迷宫路径 mgpath()2 详细设计实现概要设计中定义的所有数据类型及操作的伪代码算法节点类型和指针类型迷宫矩阵类型:int mazeM+2N+2;为方便操作使其为全局变量迷宫中节点类型及队列类型:struct pointint row,col,predecessor que512迷宫的操作(1)手动生成迷宫void shoudong_maze(int m,int n)定义i,j为循环变量for(i=m)for(j=n)输入mazeij的值(2)自动生成迷宫void zidong_maze(int m,int n)定义i,j为循环变量for(i=m)for(j=n) mazeij=rand()%2 /由于rand()产生的随机数是从0到RAND_MAX,RAND_MAX是定义在stdlib.h中的,其值至少为32767),要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X;(3)打印迷宫图形void print_maze(int m,int n)用i,j循环变量,将mazeij输出 、(4)打印迷宫路径void result_maze(int m,int n)用i,j循环变量,将mazeij输出 、搜索迷宫路径迷宫中队列入队操作void enqueue(struct point p)将p放入队尾,tail+迷宫中队列出队操作struct point dequeue(struct point p)head+,返回quehead-1判断队列是否为空int is_empty()返回head=tail的值,当队列为空时,返回0访问迷宫矩阵中节点void visit(int row,int col,int maze4141)建立新的队列节点visit_point,将其值分别赋为row,col,head-1,mazerowcol=2,表示该节点以被访问过;调用enqueue(visit_point),将该节点入队路径求解void mgpath(int maze4141,int m,int n)先定义入口节点为struct point p=0,0,-1,从maze00开始访问。如果入口处即为障碍,则此迷宫无解,返回0 ,程序结束。否则访问入口节点,将入口节点标记为访问过mazep.rowp.col=2,调用函数enqueue(p)将该节点入队。判断队列是否为空,当队列不为空时,则运行以下操作: 调用dequeue()函数,将队头元素返回给p,如果p.row=m-1且p.col=n-1,即到达出口节点,即找到了路径,结束如果p.col+1n且mazep.rowp.col+1=0,说明未到迷宫右边界,且其右方有通路,则visit(p.row,p.col+1,maze),将右边节点入队标记已访问如果p.row+10且mazep.rowp.col-1=0,说明未到迷宫左边界,且其左方有通路,则visit(p.row,p.col-1,maze),将左方节点入队标记已访问如果p.row-10且mazep.row-1p.col=0,说明未到迷宫上边界,且其上方有通路,则visit(p.row,p.col+1,maze),将上方节点入队标记已访问访问到出口(找到路径)即p.row=m-1且p.col=n-1,则逆序将路径标记为3即mazep.rowp.col=3;while(p.predecessor!=-1)p=queuep.predecessor; mazep.rowp.col=3; 最后将路径图形打印出来。菜单选择while(cycle!=(-1)printf(n);printf( 欢迎进入走迷宫游戏演示系统 n);printf( - n);printf( -1. 手动生成迷宫 n);printf( -2.系统自动生成迷宫 n);printf( -3.退出系统 n);printf(n);printf(n);printf(请选择你的操作 bb);scanf(%d,&i);switch(i)case 1:printf(n请输入行数 bb);scanf(%d,&m);printf(n);printf(请输入列数 bb);scanf(%d,&n);while(m39)|(n39)printf(n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入:nn);printf(请输入行数 bb);scanf(%d,&m);printf(n);printf(请输入列数 bb);scanf(%d,&n);shoudong_maze(m,n);print_maze(m,n);mgpath(maze,m,n);if(X!=0)result_maze(m,n);printf(nnPress Enter Contiue!n);getchar();while(getchar()!=n);break;case 2:printf(n请输入行数 bb);scanf(%d,&m);printf(n);printf(请输入列数 bb);scanf(%d,&n);while(m39)|(n39)printf(n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入!nn);printf(请输入行数 bb);scanf(%d,&m);printf(n);printf(请输入列数 bb);scanf(%d,&n);zidong_maze(m,n);print_maze(m,n);mgpath(maze,m,n);if(X!=0) result_maze(m,n);printf(nnPress Enter Contiue!n);getchar();while(getchar()!=n);break;case 3: cycle=(-1);break;default:printf(n);printf(你的输入有误!n);printf(nPress Enter Contiue!n);getchar();while(getchar()!=n);break;注:具体源代码见附录3调试分析 在调试过程中,首先使用的是栈进行存储,但是产生的路径是多条或不是最短路径,所以通过算法比较,改用此算法4.用户手册本程序的运行环境为windows7 64位操作系统进入演示程序后即显示文本方式的用户界面5.测试结果图1 手动生成迷宫图2 系统自动生成迷宫6程序清单#include#include#define N 39#define M 39int X;int mazeN+2M+2;struct pointint row,col,predecessor;queue512;int head=0,tail=0;void shoudong_maze(int m,int n)int i,j;printf(nn);printf(请按行输入迷宫,0表示通路,1表示障碍:nn);for(i=0;im;i+)for(j=0;jn;j+)scanf(%d,&mazeij);void zidong_maze(int m,int n)int i,j;printf(n迷宫生成中nn);system(pause);for(i=0;im;i+)for(j=0;jn;j+)mazeij=rand()%2;/由于rand()产生的随机数是从0到RAND_MAX/RAND_MAX是定义在stdlib.h中的,其值至少为32767)/要产生从X到Y的数,只需要这样写:k=rand()%(Y-X+1)+X; void print_maze(int m,int n)int i,j;printf(n迷宫生成结果如下:nn);printf(迷宫入口n);printf();for(i=0;im;i+)printf(n);for(j=0;jn;j+) if(mazeij=0) printf();if(mazeij=1) printf();printf(迷宫出口n);void result_maze(int m,int n)int i,j;printf(迷宫通路(用“鼠”表示)如下所示:nt);for(i=0;im;i+)printf(n);for(j=0;jn;j+)if(mazeij=0|mazeij=2) printf();if(mazeij=1) printf();if(mazeij=3) printf(鼠);void enqueue(struct point p)queuetail=p;tail+;struct point dequeue()head+;return queuehead-1;int is_empty()return head=tail;void visit(int row,int col,int maze4141)struct point visit_point=row,col,head-1;mazerowcol=2;enqueue(visit_point);int mgpath(int maze4141,int m,int n)X=1;struct point p=0,0,-1;if(mazep.rowp.col=1)printf(n-n);printf(此迷宫无解nn);X=0;return 0;mazep.rowp.col=2;enqueue(p);while(!is_empty()p=dequeue();if(p.row=m-1)&(p.col=n-1) break;if(p.col+1n)&(mazep.rowp.col+1=0) visit(p.row,p.col+1,maze);if(p.row+1=0)&(mazep.rowp.col-1=0) visit(p.row,p.col-1,maze);if(p.row-1=0)&(mazep.row-1p.col=0) visit(p.row-1,p.col,maze);if(p.row=m-1&p.col=n-1)printf(n-n);printf(迷宫路径为:n);printf(%d,%d)n,p.row,p.col);mazep.rowp.col=3;while(p.predecessor!=-1)p=queuep.predecessor;printf(%d,%d)n,p.row,p.col);mazep.rowp.col=3;else printf(n-n);printf(此迷宫无解!nn);X=0;return 0;void main()int i,m,n,cycle=0;system(cls);system(color 1f);printf( n);printf( 必做题:走迷宫游戏 n);printf( 姓名:xxxx n);printf( 学号:xxxxxxxxx n);printf( n);while(cycle!=(-1) printf(n); printf( 欢迎进入走迷宫游戏演示系统 n); printf( - n); printf( 1.手动生成迷宫 n); printf( 2.系统自动生成迷宫 n); printf( 3.退出系统 n); printf(n);printf(n);printf(请选择你的操作 bb);scanf(%d,&i);switch(i)case 1:printf(n请输入行数 bb);scanf(%d,&m);printf(n);printf(请输入列数 bb);scanf(%d,&n);while(m39)|(n39)printf(n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入:nn);printf(请输入行数 bb);scanf(%d,&m);printf(n);printf(请输入列数 bb);scanf(%d,&n);shoudong_maze(m,n);print_maze(m,n);mgpath(maze,m,n);if(X!=0)result_maze(m,n);printf(nnPress Enter Contiue!n);getchar();while(getchar()!=n);break;case 2:printf(n请输入行数 bb);scanf(%d,&m);printf(n);printf(请输入列数 bb);scanf(%d,&n);while(m39)|(n39)printf(n抱歉,你输入的行列数超出预设范围(0-39,0-39),请重新输入!nn);printf(请输入行数 bb);scanf(%d,&m);printf(n);printf(请输入列数 bb);scanf(%d,&n);zidong_maze(m,n);print_maze(m,n);mgpath(maze,m,n);if(
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高级离婚协议书模板:房产、股权与子女抚养协议
- 离婚后财产重新分配及子女成长费用承担合同
- 离婚协议书中关于共同子女抚养权转移协议书五
- 绿色建筑物业权益转让与节能减排合同
- 离婚协议中共同债务处理与子女抚养责任专题合同
- 智能建筑垃圾清运与环保科技研发合作协议
- 经典离婚协议范本:财产分割与子女抚养详细规定
- 离婚子女轮流抚养期间生活照料协议
- 2025年疼痛科疼痛评估与镇痛方案设计考核答案及解析
- 口语交际应对课件
- 品牌推广策划方案(3篇)
- 诊疗器械器具和物品清洁消毒
- T/CAPE 11005-2023光伏电站光伏组件清洗技术规范
- FOCUS-PDCA原理及流程课件
- 涉税服务保密协议书
- 复合材料在航空航天领域的应用课件
- 家政三方合同协议范本
- 大学生就业心理调适与应对
- 动物医院运营课件
- 《思想道德与法治》(23版):第一章 领悟人生真谛 把握人生方向
- 2025年半月谈材料试题及答案
评论
0/150
提交评论