




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、 湖南工业大学课 程 设 计资 料 袋 计算机与通信 学院(系、部) 2009 2010 学年第 二 学期 课程名称 数据结构 指导教师 邓彬 职称 学生姓名 柏云 专业班级 软件工程 学号 09408300134 题 目 编制一个求解迷宫通路的程序 成 绩 起止日期 2010年 6 月 28日 2010年 7 月 4 日目 录 清 单序号材 料 名 称资料数量备 注1课程设计任务书12课程设计说明书13课程设计图纸1张456 湖南工业大学课程设计任务书2009 2010 学年第 二 学期 计算机与通信 学院(系、部) 软件工程 专业 091 班级课程名称: 数据结构 设计题目: 编制一个求解
2、迷宫通路的程序 完成期限:自 2010 年 6 月 28日至 2010 年 7 月 4 日共 1 周内容及任务一、设计的主要技术参数使用栈机制模拟迷宫的寻路过程, 图的dfs 自动生成随机迷宫地图.二、设计任务使用c语言实现各个模块的功能.三、设计工作量 汪婷负责实现迷宫的寻路算法以及栈机制等的实现, 柏云负责迷宫地图自生成算法,以及游戏功能,友好界面等的实现.进度安排起止日期工作内容2010-6-28-2010-6-29设计本程序思路2010-6-29-2010-7-1实现子程序模块函数2010-7-1 -2010-7-2将子程序和主程序构建成完整的c源程序,并且进行相关编译调试2010-7
3、-2 -2010-7-4数据测试、形成文档主要参考资料<<面向对象c语言程序设计>><<数据结构(c语言版)>><<图算法>><<windows系统编程-第三版>>指导教师(签字): 年 月 日系(教研室)主任(签字): 年 月 日2数据结构设计说明书数据结构课程设计编制一个求解迷宫通路的程序起止日期: 2010 年 6 月 28日 至 2010年 7 月 4 日学生姓名柏云班级软件091班学号09408300134成绩指导教师(签字)计算机与通信学院(部)年 月 日湖南工业大学课程设计情况分析表课
4、程设计名称数据结构设计周数17周学院(部)计算机与通信学院系(教研室)软件工程系指导教师邓彬学生专业、班级软件工程0901选题设计一个迷宫生成算法成绩分布优良中及格不及格学生数百分比学生课程设计存在的主要问题改进措施及建议指导教师(签字): 年 月 日系(教研室)主任(签字): 年 月 日备注:本表在课程设计完成后由指导教师填写,与课程设计资料一起存档。 目录1. 题目及需求分析 vi2. 概要设计 vii3. 详细设计 x4. 调试分析 xix5. 用户手册 xxi6. 测试结果 xxiii7. 附录 程序清单 xxv题目:编制一个求解迷宫通路的程序.扩展:增加迷宫地图的随机生成;增加人工操
5、作游戏功能;可显示迷宫通路.一 . 需求分析( 1 ) 以二维数组的形式存储迷宫地图, 0 代表通路 , 1 代表墙壁 , 2 代表已走过的足迹 , 3 代表 死路 ,以上 用宏定义如下:( 2 ) 设计交互界面 , 用户只需输入选择就可做想做的事情.( 3 ) 用户可以自己输入迷宫的大小 , 然后由程序自动生成随机迷宫.( 4 ) 求出迷宫通路并且打印在屏幕上.( 5 ) 用户可以通过方向键控制小人自己走出迷宫.( 6 ) 使用文件存储迷宫的 矩阵表示 以及 图形表示.二 . 概要设计1. 设定栈的抽象数据类型定义 :adt stack 数据对象 : d=ai|aiadt mazetype
6、, i = 0,1,2n , n0数据关系 : r1= <ai-1,ai> | ai-1,ai d,i=2,n 基本操作 :initstack(sqstack &s)操作结果 : 构造一个空栈gettop(sqstack s,selemtype &e)初始条件 : 栈 s 以存在操作结果 : 获取栈顶元素push(sqstack &s,selemtype &e)初始条件 : 栈 s 以存在操作结果 : 在栈顶插入新元素pop(sqstack &s,selemtype &e)初始条件 : 栈 s 以存在操作结果 : 删除栈顶元素,并删除
7、e值stackempty(sqstack s)初始条件 : 栈 s 以存在操作结果 : 判断栈是否为空clearstack(sqstack &s)初始条件 : 栈 s 以存在操作结果 : 将栈置为空栈 adt sqstack;2. 设定迷宫的抽象数据类型adt mazetype数据对象 : d=ai,j|ai,j ,#、*,0<=i<=m+1, 0<=j<=n+1,m,n<=10数据关系 : r=row,colrow=<a i-1,j,ai,j>|ai-1,j,ai,jd,i=1,m+1,j=0,n+1cow=<a i-1,j,ai,j&
8、gt;|ai-1,j,ai,jd,i=1,m+1,j=0,n+1基本操作 :status initmaze(mazetype &maze,int a,int row,int col)初始条件: 数组a 中存放了迷宫的矩阵表示,row 和 col 为迷宫的大小操作结果: 将数组 a 复制到迷宫类型的 数组 arr 中,并保存迷宫的行和列status pass(mazetype &maze,postype curpos)初始条件: maze 存在迷宫, curpos 保存了当前位置的坐标操作结果: 如果可通,返回真,否则为假status footprint(mazetype &am
9、p;maze,postype curpos)初始条件: maze 存在迷宫, curpos 保存了当前位置的坐标操作结果: 将当前坐标curpos处的arr值记为 足迹status markprint(mazetype &maze,postype curpos)初始条件: maze 存在迷宫, curpos 保存了当前位置的坐标操作结果: 将当前坐标curpos处的arr值记为 死路selemtype createselem(int step,postype pos,directivetype di)初始条件: 各参数值都已经定义操作结果: 为要走的当前位置生成一个栈元素类型posty
10、pe &nextpos(postype curpos,directivetype di)初始条件: 各参数值已经定义操作结果: 求得以当前位置为栈顶的下一个方向的元素的坐标status posequare(postype pos1,postype pos2)初始条件: 个参数值已经定义操作结果: 判断是否为同一位置,是则返回真, 否则为假.void printmaze(mazetype maze)初始条件: maze 存在迷宫地图操作结果: 在屏幕上打印出迷宫的可用路径status mazepath(mazetype &maze,postype start,postype en
11、d) 初始条件: maze 存在迷宫地图操作结果: 为建立的迷宫找到一条路径adt mazetype;3. 本程序包含6个模块1) 主程序模块:int main()主菜单函数, 实现时间循环.return 0;/主函数2) 栈模块-实现栈抽象数据类型3) 迷宫模块-实现迷宫抽象数据类型4) 迷宫随机地图生成模块-用户自定义迷宫地图的生成5) 菜单模块-实现与用户交互菜单6) 游戏模块-实现游戏功能各模块之间的调用如下:主程序模块 菜单模块游戏模块迷宫模块迷宫生成模块 栈模块4. 求解迷宫通路的伪码算法:设定当前位置的初值为入口位置;do若当前位置可通,则将当前位置插入栈顶;/纳入路径若该位置为
12、出口位置,则结束;/求的路径存放在栈中否则切换当前位置的东邻方块为新的当前位置;否则若栈不空且栈顶位置还有其他位置没有被探索,则设定新的当前位置为沿顺时针方向旋转找到的栈顶位置的下一相邻块.若栈不空但栈顶位置的四周均不可通,则删去栈顶位置;/后退一步,从路径中删去该通道快若栈不空,则重新测试新的栈顶位置,直到找到一个可通的相邻块或出栈至空栈;while ( 栈不空 ); 栈空说明没有路径存在 三. 详细设计工程文件视图: 类视图:-头文件设计-1. my_stack.h 文件 #ifndef my_stack_h#define my_stack_h#define ture 1#define f
13、alse 0#define ok 1#define error 0#define infeasible -1#define overflow -2#define stack_init_size 100#define stackincrement 10typedef int status;typedef int directivetype; typedef struct int row;int col;postype;typedef struct /栈中的数据元素类型int step;postype seat;directivetype di;selemtype;typedef struct /
14、栈结构selemtype *base;selemtype *top;int stacksize;sqstack; /-栈的基本操作-/初始化status initstack(sqstack &s);/得到栈顶元素status gettop(sqstack s,selemtype &e);/入栈status push(sqstack &s,selemtype &e);/出栈status pop(sqstack &s,selemtype &e);/判断栈是否为空int stackempty(sqstack s);/清空栈status clearsta
15、ck(sqstack &s);#endif2. my_maze_create.h 文件#ifndef my_maze_create_h#define my_maze_create_h#define maze_max 155/路径查找int search(int mapmaze_max+2maze_max+2,int x,int y);/迷宫生成void make_maze(int mapmaze_max+2maze_max+2,int x,int y);/生成迷宫文件void maze_file_make (int mazemapmaze_max * 2maze_max * 2,int
16、 x,int y );#endif3. my_maze.h 文件#ifndef my_maze_h#define my_maze_h#include "my_stack.h"#include "my_maze_create.h"#define range 300 /迷宫最大限制#define roar 0/迷宫中点可通点#define wall 1/墙#define etr 2/已走过的足迹#define jam 3/死路typedef struct int x,y; /迷宫的实际行、列int arrrangerange; /迷宫最多的行列,限定作用ma
17、zetype;/-迷宫的基本操作-/初始化迷宫status initmaze(mazetype &maze,int amaze_max * 2maze_max * 2,int row,int col);/判断当前位置是否可通status pass(mazetype &maze,postype curpos);/可通标记 status footprint(mazetype &maze,postype curpos);/不可通标记 status markprint(mazetype &maze,postype curpos);/为要走的当前位置生成一个栈元素类型se
18、lemtype createselem(int step,postype pos,directivetype di);/求得以当前位置为栈顶的下一个方向的元素的坐标postype &nextpos(postype curpos,directivetype di);/判断是否为同一位置status posequare(postype pos1,postype pos2);/打印迷宫void printmaze(mazetype maze);/为建立的迷宫找到一条路径status mazepath(mazetype &maze,postype start,postype end)
19、;#endif4. mazeplay.h 文件#ifndef mazeplay_h#define mazeplay_h/获取 方向键 响应事件int getpos();/移动 小人 的位置status movepos ( mazetype &maze, int pos );/判断按键方向是否可以移动bool ismoveable ( mazetype &maze ,postype pos);/显示 当前位置的状态1void display ( mazetype &maze, postype pos );/显示 当前位置的状态2void display_2 ( mazet
20、ype &maze, postype pos );/游戏主事件int playmain ( mazetype &maze );#endif5. main_menu.h 文件#ifndef main_menu_h#define main_menu_htypedef struct postype start;postype end;etrandoutpos;/菜单显示1void displaymenu_1 ();/菜单显示2void displaymenu_2 ();/菜单调节void displaymenu_3 ();/自定义迷宫etrandoutpos creatpsnmaze
21、 (int mazemapmaze_max * 2maze_max * 2 , mazetype &maze );/主选择菜单int mainchoicemenu();/光标移动void gotoxy(int x, int y);#endif6. myheader.h 主包含头文件#include <stdio.h>#include <stdlib.h>#include <string.h>#include <conio.h>#include <time.h>#include <memory.h>#include
22、<windows.h>#include "my_stack.h"#include "my_maze.h"#include "my_maze_create.h"#include "main_menu.h"#include "mazeplay.h"#include <iostream>#include <fstream>using namespace std;-实现文件(部分)-1. my_maze_create.cpp 文件#include "myhe
23、ader.h"int mapmaze_max+2maze_max+2;int search(int mapmaze_max+2maze_max+2,int x,int y)static int d42=0,1,1,0,0,-1,-1,0; int zx=x*2,zy=y*2,next,turn,i; mapzxzy=1;turn = rand()%2 ? 1 : 3; for(i=0,next=rand()%4; i<4; i+,next=(next+turn)%4) if(mapzx+2*dnext0zy+2*dnext1=0) mapzx+dnext0zy+dnext1=1
24、;search(map,x+dnext0,y+dnext1);return 0;void make_maze(int mapmaze_max+2maze_max+2,int x,int y) int z1,z2; for(z1=0,z2=2*y+2;z1<=2*x+2;z1+)mapz10=1,mapz1z2=1; for(z1=0,z2=2*x+2;z1<=2*y+2;z1+)map0z1=1,mapz2z1=1; map12=1;map2*x+12*y=1;srand(unsigned)time(null); search(map,rand()%x+1,rand()%y+1);
25、map10 = '1'mapx-2y-1 = '1'/生成迷宫文件 c 实现void maze_file_make (int mazemapmaze_max * 2maze_max * 2,int x,int y )生成随机迷宫地图文件并读取;2. my_maze.cpp文件/打印迷宫void printmaze(mazetype maze)打印迷宫路径地图;/为建立的迷宫找到一条路径status mazepath(mazetype &maze,postype start,postype end)sqstack s;selemtype e;initsta
26、ck(s);postype curpos=start;curstep = 1;doif(pass(maze,curpos)footprint(maze,curpos);e=createselem(curstep,curpos,1);push(s,e);if(posequare(curpos,end)return ture;curpos=nextpos(curpos,1);curstep+;elseif(!stackempty(s)pop(s,e);while(e.di = 4 && !stackempty(s)markprint(maze,e.seat);pop(s,e);cu
27、rstep-;if( e.di < 4 )e.di +;push(s,e);curpos=nextpos(e.seat,e.di);while(!stackempty(s);return false;3. mazeplay.cpp文件#include "myheader.h"postype start;postype end;postype curpos;postype prepos;int getpos()pos = 键位标识符;return pos;status movepos ( mazetype &maze, int pos )switch(pos)c
28、ase : 向pos方向移动;return 0;bool ismoveable ( mazetype &maze ,postype pos)if ( maze.arrpos.rowpos.col = 1 )return false;return true;void display ( mazetype &maze, postype pos )显示迷宫; void display_2 ( mazetype &maze, postype pos )显示小人的当前位置;4. main.cpp 主函数#include "myheader.h"int main
29、()/主菜单mainchoicemenu();return 0;/主函数函数调用关系图如下:四: 调试分析1. 本次作业比较简单 , 只是后期在原来的程序上做了许多扩展, 如实现随机迷宫地图的自动生成 和 游戏模式. 初期的调试总是输出 “没有找到路径”, 但是迷宫的路径确实是存在的,后来发现是由于迷宫的自生成算法与输入有些不一致, 更正了行列顺序后,程序能正常运行.2. 在设计迷宫初始化函数的时候,参数的传递出现错误,主要是对指针和引用的理解出现混淆,通过查阅相关资料, 弄清楚了两者之间的区别,指针是用于指向一个变量的地址,而引用只是对一个已存在变量的一个重命名.3. 在调试过程中使用printf函数输出标志信息跟踪函数调用,收到了显著的效果,大大提高了调试效率,有利于以后的代码调试.4. 使用了小部分的win32 api,发现使用局部句柄时,调用的winapi不能正常运行,改成全局后问题解决.5. 程序源代码中仍有部分重复代码,可以模块化,实现代码重用.6. 在实现游戏功能时发现,每次调用display 函数时都进行清屏操作,屏幕的闪动幅度非常大,眼睛很容易疲劳, 第一次改进后, 去除了清屏操作,而采用覆盖式的输出 ,即在原来已有的画面上再次打印.经过这次改进, 界面趋向与稳定,但是,在进行高频率按键时,仍然可以发现有较小的闪动现象.经过思考,发现迷宫地图是不变的,只
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 木结构建筑的日照模拟与优化考核试卷
- 畜牧养殖疫病防控技术的研发与推广考核试卷
- 纸板容器操作人员素质提升考核试卷
- 稻谷种植农业产业链协同创新考核试卷
- 喷枪在现代建筑外墙涂装的应用考核试卷
- 竹材采运项目管理与招投标实务考核试卷
- 灯具行业展会策划与参展技巧考核试卷
- 西藏大学《第二外语1(日语)》2023-2024学年第二学期期末试卷
- 玉树藏族自治州称多县2025届三下数学期末教学质量检测模拟试题含解析
- 苏州信息职业技术学院《面向对象分析和设计实践》2023-2024学年第二学期期末试卷
- 2024届高考语文复习-新高考卷文学类阅读真题《建水记》《大师》讲评
- 八年级道德与法治下册第一单元坚持宪法至上思维导图人教部编版
- 2023年山东中烟工业有限责任公司人员招聘笔试试题及答案解析
- 2023年新疆初中学业水平考试生物试卷真题(含答案)
- 中考冠词专项训练100题 (带答案)
- 幼儿心理学(陈帼眉)期中考试试卷含答案
- 罗盘仪林地测量-罗盘仪林地面积测量(森林调查技术)
- 电力现货市场基础知识
- 公司收支明细表
- 2023年电子产品营销试题库
- GB/T 7251.6-2015低压成套开关设备和控制设备第6部分:母线干线系统(母线槽)
评论
0/150
提交评论