迷宫报告Word文档格式.docx
《迷宫报告Word文档格式.docx》由会员分享,可在线阅读,更多相关《迷宫报告Word文档格式.docx(16页珍藏版)》请在冰豆网上搜索。
3、整体设计思路;
4、程序中的数据结构;
5、程序核心算法的流程图;
6、程序改进的设想;
7、总结。
参考资料
1、郭翠英.C语言课程设计案例精编[M].水利水电出版社,2008
2、谭浩强.C程序设计[M].高等教育出版社,2005
3、韩宣.TurboC语言图形函数[M].机械工业出版社,2000
4、衣治安.C语言综合应用案例教程[M].铁道出版社,2008
完成期限21周
指导教师
专业负责人
2011年7月18日
课程设计报告
目录
1、程序的功能4
2、游戏界面设计和图形函数的使用5
3、整体设计思路5
4、程序中的数据结构5
5、程序核心算法的流程图5
6、程序改进的设想5
7、总结5
8、参考文献5
1、程序的功能
设计并实现一个类似于手机游戏“走迷宫”的程序。
一般设计迷宫为二维平面图,将迷宫的左上角作为入口,右下角作为出口。
一个点从入口通过键盘方向键的移动,走过通道,从出口成功走出。
迷宫随机生成,黄色代表可以通过,蓝色代表墙壁不能通过。
程序有两种运行方式:
一种是由系统自动运行探索;
一种是人工探索通路。
2、游戏界面设计和图形函数的使用
Stack.h
#include<
iostream.h>
malloc.h>
typedefstruct{
intr;
intc;
}PosType;
typedefstruct{
intstep;
//当前位置在路径上的序号
PosTypeseat;
//当前位置的坐标
intdi;
//往下一坐标的方向
}ElemType;
typedefstructNodeType{
ElemTypedata;
NodeType*next;
}*NodeLink;
NodeLinktop;
//指向栈顶
intsize;
}Stack;
////////////栈的基本操作
voidInitStack(Stack&
S){
//初始化栈,设S为空栈
S.size=0;
///cout<
<
"
栈初始化成功"
endl;
S.top=NULL;
}
intLengthStack(StackS){returnS.size;
boolStackEmpty(StackS)
{
if(S.size==0)returntrue;
elsereturnfalse;
boolPush(Stack&
S,ElemTypee)
//若分配空间成功,则在S的栈顶插入新的栈顶元素e,并返回true
NodeType*p;
if((p=(NodeType*)malloc(sizeof(NodeType)))==NULL)
returnfalse;
p->
data=e;
next=S.top;
S.top=p;
S.size++;
returntrue;
boolPop(Stack&
S,ElemType&
e){
//若栈不空,将栈S的栈顶元素删除并由e带回其值,且返回true
NodeType*p=S.top;
if(p==NULL)
{
cout<
栈为kong,无法删除栈顶元素……\n"
;
}
e=p->
data;
S.size--;
S.top=p->
next;
free(p);
boolStackTraveser(StackS)
p=S.top;
while(!
p){
S.top->
data.di<
p=p->
1.、main()主函数
首先确定是人工探索还是系统自动探索,通过输入字符选定。
选定后调用图形初始化函数,接着调用迷宫生成函数及迷宫显示函数,然后根据输入的字符调用人工探索函数或自动探索函数。
探索完毕进行结果处理,最后关闭图形系统,程序关闭。
2.、Init()初始化函数
由于迷宫图是在图形方式下显示的,所以要进行图形初始化工作。
3、MapRand()迷宫显示函数
用数组map表示一个迷宫,要随机生成迷宫,数组元素的值利用随机生成函数0或1的数。
将最外面一圈设为墙壁,作为一个封闭图形,只留下入口点和出口点为通路。
4.、PrMap()迷宫显示函数
根据数组map的值输出迷宫图,利用函数setfillstyle()设置图形实体填充样式,bar()函数输出图形快,如果数组元素为0,则填充为黄色,值为1显示填充为蓝色,一个数组元素对应一个矩形块,数组元素的下标为矩形块的中心坐标,利用两重循环语句可以完成迷宫图的显示。
5.、FindWay()系统自动探索
从下标(1,1)开始探索,依次按照右下、下、右、上、右上、左下、左、左上的顺序前进,若该方向上的值为0,则前进一步,然后作相应的标记,表示该探索物再某一方向上探索过,而在另一个方向上探索,若8个方向均已探索过,则不能再前进,需要沿着原来的路径回溯一步,然后重复上述过程直到出口。
6、PeopleFind()人工探索
首先输出迷宫图及人工控制操作图示,红色探索出现在左上角,采用人工控制8个方向的移动,由于是8个方向,小键盘1、2、3、4、6、7、8、9代表8个方向,按了字符后,对应方向不是墙壁,可以将红色探索物移到相应的位置,按回车表示结果人工操作。
如果此时map数组元素的坐标是出口,则yes的值为1,探索成功,否则为0.
7、Result()结果处理函数
最终结果是找到和没找到两种情况,在程序中设计全局变量yes,根据yes的值进行处理。
如果yes为0,调用函数NotFind(),显示通路信息,否则调用函数Find()。
如果是系统自动探索,Find()会显示出所走过的路径,如果是人工探索,没有记录走过的路径,只显示找到通路的信息。
3、整体设计思路
在迷宫设计中,由于不能使用递归则可以借助栈来实现在迷宫中的前进和后退。
同时在还需要设计迷宫的大小、迷宫的出入口、根据输入的入口来寻找迷宫的出口,并把路径输出来。
在这个编程中由于不知道所走路劲步数,所以采用了链式栈实现每一步的移动,若找到出路则前进否则返回下一步改变方向来实现相关的移动,所以栈在其间起到了工具作用。
在设计迷宫大小和出入口时,采用的是根据操作者实现的,但迷宫的具体路障和通道是随机实现的。
当然,重点是如何从出口来找出口。
求迷宫的一条通路的伪码如下:
设当前初始位置为出口:
do{
若当前位置可通,则{
将该位置插入到栈顶;
//纳入路径
若该位置为出口位置。
则结束当前程序;
/求得的路径放在栈中
否则切换当前位置的东临位置(即向右)为新的当前的位置;
否则{
若栈不为空且栈顶元素尚有其他位置未被探索,则设定新的当前位置为沿着顺时针旋转得到的栈顶位置的下一个临快;
若栈不为空且栈顶位置的四周均不通
则删去栈顶元素;
//后退一步,从路径中删去该通块
若栈不空,则重新测试新的栈顶位置,直到找到一个可通的相邻块或出栈至栈空;
}//否则
}while(栈不为空)
本程序的模块
主程序从main()函数中进行,包括输入迷宫的大小等信息,然后调用迷宫模块,在迷宫模块中也调用了栈的模块。
栈模块——实现栈抽象数据类型
迷宫模块——实现迷宫抽象数据类型
各模块之间的关系如下:
主程序模块
迷宫模块
栈模块
是点从入口顺利的从出口走出。
4、程序中的数据结构
1.坐标的位置类型:
typedefstruct{
intr;
2.迷宫类型:
intCol,Row;
//迷宫的大小
intarr[Rangle][Rangle];
//0表示障碍,1表示是可走的通道,-1表示外界的围墙//2表示已经走过,3表示已经知道其不能通过
}MazeType;
voidInitMaze(MazeType&
M,intcol,introw)
//按照用户的输入的行数row和列数col列的二维数组(元素值为1或0)
//设置迷宫的错初值,加上边缘的一圈的值
voidPrintMaze(MazeTypeM)
//根据已经进行二维数组的标记值来输出迷宫(或者其通路)
boolPass(MazeTypeM,PosTypepos)
{//求解迷宫M中,从Start到end的一条路径
//若存在则返回true,否则返回false
StackS;
InitStack(S);
PosTypecurpos=start;
//设置当前坐标为入口位置;
intcurstep=1;
//当前的步数
boolFind=false;
//是否找到出口
ElemTypee;
do{
if(Pass(M,curpos))//如果当前位置可以通过(不是障碍物且未曾留下足迹)
FootPrint(M,curpos);
//在当前位置标记为2
e.step=1;
e.seat=curpos;
e.di=1;
//初始化为向东临位置移动(即向右)
Push(S,e);
//将已经周的的放入栈中
if(curpos.c==end.c&
&
curpos.r==end.r)//如果找到了出口则终止,并返回true
{
Find=true;
returnFind;
}
else{//在其东临位置上移动,当前步数加一
curpos=NextPos(curpos,1);
curstep++;
else{//当前位置不能通过
if(!
StackEmpty(S)){
Pop(S,e);
//将已经走过的最近位置弹出,数据保存在e中
while(e.di==4&
!
(StackEmpty(S))){//当方向改变一周后仍不能找到可通过的路径
MarkPrint(M,e.seat);
//留下不能通过的标记
Pop(S,e);
//删除站定元素
curstep--;
}//while
if(e.di<
4)//不能通过则改变方向
{
e.di++;
//方向顺时针改变一下
5、程序核心算法的流程图
从入口到出口的查找的流程图
6、程序改进的设想
1、有限时功能。
2、只有所在位置周围一定区域内的情况能显示出来。
3、颜色的改变,程序中涉及到同一颜色的进行了统一的改变
setfillstyle(SOLID_FILL,YELLOW);
/*设置白色实体填充样式*/
/*消去红色探索物,恢复原迷宫图*/
/*白色为可走的路*/
4、改变控制的键盘,原来由字母控制,现改成由小数字键盘控制。
部分修改程序如下:
line(500,200,550,200);
outtextxy(570,197,"
6"
);
line(500,200,450,200);
outtextxy(430,197,"
4"
line(500,200,500,150);
outtextxy(497,130,"
8"
line(500,200,500,250);
outtextxy(497,270,"
2"
line(500,200,450,150);
outtextxy(445,130,"
7"
line(500,200,550,150);
outtextxy(550,130,"
9"
line(500,200,450,250);
outtextxy(445,270,"
1"
line(500,200,550,250);
outtextxy(550,270,"
3"
/*以上是画个方向的控制介绍*/
还有:
if(c=='
8'
map[x-1][y]!
=1)
DrawPeople(&
x,&
y,1);
/*上*/
else
if(c=='
9'
map[x-1][y+1]!
y,2);
/*右上*/
6'
map[x][y+1]!
y,3);
/*右*/
3'
map[x+1][y+1]!
DrawPeople(&
y,4);
/*右下*/
if(c=='
2'
map[x+1][y]!
y,5);
/*下*/
else
1'
map[x+1][y-1]!
DrawPeople(&
y,6);
/*左下*/
if(c=='
4'
map[x][y-1]!
y,7);
/*左*/
elseif(c=='
7'
map[x-1][y-1]!
y,8);
/*左上*/
7、总结
通过本次课程设计,强化了我对C语言相关知识的掌握,学会了基本的游戏编程方法,加深了我复杂程序设计的能力,初步掌握了高级语言程序调试技能,在知识方面,在设计迷宫时需要用到一些基本的如栈的相关信息,来解决不能使用递归的问题,递归在使用过程中虽然简介但不易理解通过栈的使用来加强我们对递归的使用。
在对问题的理解上我们通过对相关知识的理解和认识,来解决一些实际问题。
经过一个星期的上机实践学习,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;
再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。
通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。
8、参考文献
东北石油大学课程设计成绩评价表
课程名称
C课程设计
题目名称
游戏迷宫的实现
学生姓名
郑思琪
学号
100702140603
指导教师姓名
李改海
职称
助教
序号
评价项目
指标(优秀)
满分
评分
1
选题难度
选题难度较高,或者对原题目进行了相当程度的改进。
10
2
工作量、工作态度和出勤率
工作量饱满,工作努力,遵守纪律,出勤率高,工作作风严谨,善于与他人合作。
3
课程设计质量
按期圆满的完成了规定的任务,方案设计合理,思考问题全面,系统功能完善。
40
4
报告质量
问题论述思路清晰,结构严谨,文理通顺,撰写规范,图表完备正确。
30
5
回答问题
在进行课程设计程序系统检查时,能正确回答指导教师所提出的问题。
6
创新(加分项)
工作中有创新意识,对前人工作有改进或有应用价值。
在进行系统检查时能对创新性进行说明,并在报告中有相应的论述。
+5
总分
评语:
指导教师:
年月日