数据结构课程设计迷宫问题2.docx
《数据结构课程设计迷宫问题2.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计迷宫问题2.docx(19页珍藏版)》请在冰豆网上搜索。
数据结构课程设计迷宫问题2
数据结构课程设计
题目:
迷宫问题
学院:
班级:
学生姓名:
学生学号:
指导教师:
2012年12月5日
课程设计任务书
姓名
班级
学号
设计题目
迷宫问题
理论要点
迷宫问题是取自心理学的一个古典实验。
在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒子中设置了许多墙,对行进方向形成了多处阻挡。
盒子仅有一个出口,你需要按提示指挥老鼠在迷宫中行走,将老鼠顺利送入货仓。
设计目标
仅仅认识到队列是一种特殊的线性表是远远不够的,本次实习的目的在于使学生深入了解队列的特征,以便在实际问题背景下灵活运用它,同时还将巩固这种数据结构的构造方法
研究方法步骤
1、列出研究方法和步骤。
2、进行程序的编写。
3、程序的运行与查错并修改
4、总结。
预期结果
有许多路径可以将老鼠送出出口,从而进入货仓,你需要指挥老鼠的行走发现一条能将老鼠送进货仓的路径。
计划与进步的安排
一周内完成
1、第一天写解决迷宫求解问题的思路。
2、第二天编写出程序。
3、第三、四天检查程序的运行并查找错误。
4、第五、六天找出解决错误的方法。
5、第七天写总结。
摘要
针对迷宫问题是取自心理学的一个古典实验。
本文在该实验中,把一只老鼠从一个无顶大盒子的门放入,在盒子中设置了许多墙,对行进方向形成了多处阻挡。
盒子仅有一个出口,按提示让老鼠在迷宫中寻找道路以到达出口。
对同一只老鼠重复进行上述实验,一直到老鼠从入口走到出口,而不走错一步。
老鼠经过多次试验最终学会走通迷宫的路线,好的效果设计一个计算机程序对任意设定的矩形迷宫如下,让老鼠在迷宫中寻找出口,从而进入邻居家的仓库。
关键词古典实验,迷宫中寻找道路,走通迷宫
目录
摘要I
课程设计题目1
1需求分析1
2 概要设计1
3 详细设计1
3.1流程图3
3.2函数功能图表
4
4 调试分析11
5 测试结果11
6 总结16
参考文献17
迷宫问题
1.需求分析
1.1迷宫的建立
迷宫中存在通路和障碍,为了方便迷宫的创建,W是向后走,S是向前走,A是向左走,D是向右走。
1.2迷宫中的行走
在迷宫中有许多墙,首先需要看本实验的说明,按说明中的提示指挥老鼠在迷宫中行走,发现出口将老鼠顺利送入仓库,在行走过程中若走错,程序会有提示,你只需要按照提示,重新输入,当老鼠被送入仓库时运行结果会显示“报告,我以被你成功送到了邻居的仓库里.,”
2.概要设计
1)迷宫的墙足够结实,老鼠不能穿墙而过;
2)正确检测结果,若老鼠在能走到粮仓处,提示成功,否则提示失败;
3)老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;
3.详细设计
实现概要设计中定义的所有数据类型及操作的伪代码算法
3.1流程图
进入开始界面
初始化地图
调用int函数初始化老鼠位置,仓库坐标,窗口大小
调用play函数,控制老鼠前进
操作失误
操作正常
游戏成功
退出
3.2函数功能图表
函数名称
功能
print
初始化迷宫地图的墙图案老鼠粮仓的图案和刷新屏幕。
init
初始化老鼠坐标和粮仓的坐标,设置窗口大小
show
欢迎界面
process
整的一个进度条,算一个创意吧。
m_up
向上
m_down
向下
m_left
向左
m_right
向右
alert
增强程序健壮性。
play
判断从键盘上接受字符,控制老鼠运动。
3.3源代码
#include
#include
#defineFALSE0
#defineTRUE1
typedefintmazeMap[10][10];
voidprint(mazeMap&map){
chartag[4][3]={"█","","○","鼠"};//龍▓□●○㊣◆◇■□卐
shorti,j;
system("cls");
printf("\n\n\n\n\t");
for(i=0;i<10;i++){
for(j=0;j<10;j++)
printf("%s",tag[map[i][j]]);
printf("\n\t");
}
}//初始化迷宫地图的墙图案老鼠粮仓的图案和刷新屏幕。
voidinit(mazeMap&map,short&curX,short&curY){
map[5][5]=3;//出发点
curX=5,curY=5;
map[8][8]=2;//终点
system("modecon:
cols=35lines=20");
}//初始化老鼠坐标和粮仓的坐标,设置窗口大小
voidshow(mazeMap&map){
//charinput;
system("cls");
printf("\n*#*#*#老鼠走迷宫#*#*#*\n\n");
//printf("\n");
printf("┌─────────────┒\n");
printf("│#※#功能注释#※#┃\n");
printf("│┃\n");
printf("│w→上┃\n");
printf("│s→下┃\n");
printf("│a→左┃\n");
printf("│d→右┃\n");
printf("│q→退出游戏┃\n");
printf("│┃\n");
printf("┕━━━━━━━━━━━━━┛\n\n");
printf("\n游戏时请按:
字母+回车操纵老鼠!
\n\n\n");
printf("主人,快按回车进入游戏..\n");
getchar();
print(map);
}//开始界面
voidprocess(mazeMap&map,shorta_flag,char*flag)//动作标志a_flag:
1:
加载游戏0:
退出游戏
{
shorti,j;
charinput;
for(i=1;i<=10;i++){
system("cls");
printf("\n\n\n\n\n");
printf("%s:
\n",flag);
printf("┏━━━━━━━━━━┓\n");
printf("┃");
for(j=i;j>0;j--)
printf("▊");
for(j=10-i;j>0;j--)
printf("□");
printf("┃\n");
printf("┗━━━━━━━━━━┛\n");
printf("%d0%\n",i);
//for(k=1000000;k>0;k--);
}
printf("\n\n");
if(a_flag==1)
printf("主人,载入完毕啦,快按回车键..\n");
elseif(a_flag==0)
printf("主人,你不要我了么?
你这个负心汉..\n");
printf("\n\n");
printf("");
do{
input=getchar();
if(input=='\n')
break;
else
printf("请您输入回车键..\n");
}while
(1);//此处过滤用户无效冗余输入,以免影响游戏时的正常输入
if(a_flag!
=0)
print(map);
else
printf("\n");
}//进度条
boolm_up(mazeMap&map,short&curX,short&curY){
if(map[curY-1][curX]==0)
returnFALSE;
map[curY][curX]=1;
curY--;
map[curY][curX]=3;
print(map);
returnTRUE;
}//向上
boolm_down(mazeMap&map,short&curX,short&curY){
if(map[curY+1][curX]==0)
returnFALSE;
map[curY][curX]=1;
curY++;
//printf("%d,%d\n",curX,curY);
map[curY][curX]=3;
print(map);
returnTRUE;
}//向下
boolm_left(mazeMap&map,short&curX,short&curY){
if(map[curY][curX-1]==0)
returnFALSE;
map[curY][curX]=1;
curX--;
map[curY][curX]=3;
print(map);
returnTRUE;
}//向左
boolm_right(mazeMap&map,short&curX,short&curY){
if(map[curY][curX+1]==0)
returnFALSE;
map[curY][curX]=1;
curX++;
map[curY][curX]=3;
print(map);
returnTRUE;
}//向右
voidalert(boolmove,char*drct,mazeMap&map){
print(map);
if(!
move)
printf("\n没看到%s有堵墙在这嘛..\n又走错了,再从新按..\n疼死我了!
",drct);
}//提示是否撞墙
voidplay(mazeMap&map,short&curX,short&curY){
charinput;
boolquitFlag=0;
do{
input=getchar();
switch(input){
case'\n':
continue;
case'i':
show(map);break;
case'w':
alert(m_up(map,curX,curY),"后面",map);break;
case's':
alert(m_down(map,curX,curY),"前面",map);break;
case'a':
alert(m_left(map,curX,curY),"左边",map);break;
case'd':
alert(m_right(map,curX,curY),"右边",map);break;
case'q':
curX=8;curY=8;quitFlag=TRUE;break;
default:
print(map);printf("\n按错啦..!
\,从新输入..\n\n");break;
}//switch_input
}while(curX!
=8||curY!
=8);
if(quitFlag)
{
print(map);
printf("\n你竟然想抛弃我,快点回去...\n\n\n");
}
else{
print(map);
printf("\n报告,我以被你成功送到了邻居的仓库里.,,\n啊啊啊,开饭啦...\n");
}
getchar();
getchar();
}//运行函数
voidexit(mazeMap&map){
process(map,0,"退出游戏");
}
voidmain(){
shortcurX,curY;//当前用户位置
mazeMapmap={
{0,0,0,0,0,0,0,0,0,0},//0
{0,1,1,0,1,1,1,0,1,0},//1
{0,1,1,0,1,1,1,0,1,0},//2
{0,1,1,1,1,0,0,1,1,0},//3
{0,1,0,0,0,1,1,1,1,0},//4
{0,1,1,1,0,1,1,1,1,0},//5
{0,1,0,1,1,1,0,1,1,0},//6
{0,1,0,0,0,1,0,0,1,0},//7
{0,0,1,1,1,1,1,1,1,0},//8
{0,0,0,0,0,0,0,0,0,0}//9
};//地图:
0:
障碍
init(map,curX,curY);
show(map);
process(map,1,"当前進度");
play(map,curX,curY);
exit(map);
}
4.调试分析
编译中常见错误:
字符丢失
4.1.在编程结束进入编译阶段时我们经常会遇到一些错误。
如上图所示。
最主要的就是字符丢失类的错误。
4.1.当我们双击提示的错误时,程序界面会出现如上图所示的画面,由于错误提示为:
missing';'before'for',意思是在for前面的语句中丢失了;通过检查我们可以看出,printf语句的句尾确实丢失了;然后我们改正错误。
4.3.改正完成后我们就会看到如上图所示的界面,这就表示错误已改正,程序可运行。
5.测试结果
5.1首先我们来到程序的开始界面,读功能注释,根据提示按回车键。
5.2然后我们来到了载入界面,根据提示再次按回车键进入游戏。
5.3接着我们来到了游戏的开始界面,根据开始的功能注释,按w,s,a,d键控制老鼠前进。
5.4有时我们会出现操作失误,就会出现如上图所示的错误提示,但是不要灰心,我们可以继续控制老鼠前进。
5.5如果一切操作正常,最后会出现如上图所示的游戏成功界面。
然后我们就可以根据开始的功能注释按q键退出游戏。
6.总结
数据结构是在整个计算机科学与技术领域上广泛被使用的术语。
它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。
数据结构有逻辑上的数据结构和物理上的数据结构之分。
逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。
数据结构是数据存在的形式。
数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。
数据结构课程的主要目的是介绍一些常用的数据结构,阐明数据结构内在的逻辑关系,讨论它们在计算机中的存储表示,并结合各种数据结构,讨论对它们实行的各种运算的实现算法。
课程设计对我们而言是其对所学课程内容掌握情况的一次自我验证,从而有着极其重要的意义。
通过课程设计能提高我们对所学知识的综合应用能力,能全面检查并掌握所学内容。
《数据结构》从课程性质上讲是一门专业基础课,它的目的和任务就是训练我们对计算机加工的数据对象进行分析的能力,选择适当的数据结构及相应算法的能力,训练我们的编码以及调试能力,进而增加其对学习和应用相关专业课的兴趣。
通过本课程设计的实践教学,使我们达到以下的基本要求:
(1)掌握数据的基本结构:
线性表、枝、队列、串、数组、树和图等逻辑结构,并给出相应的存贮结构和类型描述。
(2)能根据加工数据对象的特征,选择适当的数据结构、存贮结构及相应算法,初步掌握各种算法在时间和空间的分析技巧。
(3)能够创造性地进行算法设计和程序设计,并且使所设计的程序结构清楚,正确易读,并上机调试通过。
“数据结构”是计算机程序设计的重要理论技术基础,是计算机学科的核心课程,它的课程设计目的是:
学会分析、研究计算机加工的数据结构特性,以便为应用涉及的数据选择适当的逻辑结构、存储结构以及相应的算法,并初步掌握算法时间分析和空间分析的技术。
通过这次数据结构课程设计,让我学到了好多东西。
在实际操作过程中犯了一些错误但经过刘老师的精心指导使我有了意外的收获,所学数据结构理论知识得到了巩固。
通过实际操作,学会数据结构程序编程的基本步骤、基本方法,开发了自己的逻辑思维能力,培养了分析问题、解决问题的能力。
现在终于挨到了写收获与体会的时候了,的确令人兴奋,看看自己的劳动成果,好开心。
一个星期前的现在,当听到张老师布置给我们的题目时,我们都蒙了,这么难的题目我们怎么会啊,但我们只能尽我们自己最大的努力把程序给写出来,虽然知道这一路肯定是异常的艰苦,但豁出去了。
上网查资料、去图书馆查,查相关的函数,经过两三天的努力,我把框架弄出来了,可是还有计算难题摆在我的面前,真的是个难题,自从把框架弄好了以后就没有进展了,眼看一个星期快过去了,我那个急啊,可是急也没有用。
我坚持,虽然重做了好几遍,但是,在每次重做的过程中,我学会了好多,做学问是一件需要你踏踏实实的去付出去努力才会成功的事。
7.参考文献
书籍:
7.1《C语言程序设计(第三版)》,出版社:
高等教育出版社,主编:
廖雷,
出版日期:
2009年6月
7.2《数据结构(c语言描述)》,出版社:
中国水利水电出版社,主编:
马秋菊
出版日期:
2006年
《大话数据结构》,出版社:
清华大学出版社,主编,程杰,出版日期:
2011年6月
7.3
数据结构自考网:
XX知道
XX文库
课程设计评阅书
课程设计报告评语:
(评阅意见主要对设计任务的合理性、规范性和正确性以及设计报告书的完整性、规范性和通顺性等方面作出评价)
报告成绩:
答辩记录与评语:
答辩成绩:
课程设计总成绩:
教师签名:
年月日