1、ElemType;typedef struct NodeType ElemType data; NodeType *next;*NodeLink; NodeLink top;/指向栈顶 int size;Stack;/栈的基本操作void InitStack(Stack &S) /初始化栈,设S为空栈 S.size=0; /coutdata=e;next=S.top; S.top=p; S.size+; return true;bool Pop(Stack &S,ElemType &e) /若栈不空,将栈S的栈顶元素删除并由e带回其值,且返回true NodeType *p=S.top; if
2、(p=NULL) coutdata; S.size-; S.top=p-next; free(p);bool StackTraveser(Stack S) p=S.top; while(!p)S.top-data.di1.、main()主函数首先确定是人工探索还是系统自动探索,通过输入字符选定。选定后调用图形初始化函数,接着调用迷宫生成函数及迷宫显示函数,然后根据输入的字符调用人工探索函数或自动探索函数。探索完毕进行结果处理,最后关闭图形系统,程序关闭。 2.、Init()初始化函数由于迷宫图是在图形方式下显示的,所以要进行图形初始化工作。 3、MapRand()迷宫显示函数用数组map表示一
3、个迷宫,要随机生成迷宫,数组元素的值利用随机生成函数0或1的数。将最外面一圈设为墙壁,作为一个封闭图形,只留下入口点和出口点为通路。 4.、PrMap()迷宫显示函数根据数组map的值输出迷宫图,利用函数setfillstyle()设置图形实体填充样式,bar()函数输出图形快,如果数组元素为0,则填充为黄色,值为1显示填充为蓝色,一个数组元素对应一个矩形块,数组元素的下标为矩形块的中心坐标,利用两重循环语句可以完成迷宫图的显示。 5.、FindWay()系统自动探索从下标(1,1)开始探索,依次按照右下、下、右、上、右上、左下、左、左上的顺序前进,若该方向上的值为0,则前进一步,然后作相应的
4、标记,表示该探索物再某一方向上探索过,而在另一个方向上探索,若8个方向均已探索过,则不能再前进,需要沿着原来的路径回溯一步,然后重复上述过程直到出口。 6、PeopleFind()人工探索首先输出迷宫图及人工控制操作图示,红色探索出现在左上角,采用人工控制8个方向的移动,由于是8个方向,小键盘1、2、3、4、6、7、8、9代表8个方向,按了字符后,对应方向不是墙壁,可以将红色探索物移到相应的位置,按回车表示结果人工操作。如果此时map数组元素的坐标是出口,则yes的值为1,探索成功,否则为0. 7、Result()结果处理函数最终结果是找到和没找到两种情况,在程序中设计全局变量yes,根据ye
5、s的值进行处理。如果yes为0,调用函数NotFind(),显示通路信息,否则调用函数Find()。如果是系统自动探索,Find()会显示出所走过的路径,如果是人工探索,没有记录走过的路径,只显示找到通路的信息。3、整体设计思路在迷宫设计中,由于不能使用递归则可以借助栈来实现在迷宫中的前进和后退。同时在还需要设计迷宫的大小、迷宫的出入口、根据输入的入口来寻找迷宫的出口,并把路径输出来。在这个编程中由于不知道所走路劲步数,所以采用了链式栈实现每一步的移动,若找到出路则前进否则返回下一步改变方向来实现相关的移动,所以栈在其间起到了工具作用。在设计迷宫大小和出入口时,采用的是根据操作者实现的,但迷宫
6、的具体路障和通道是随机实现的。当然,重点是如何从出口来找出口。求迷宫的一条通路的伪码如下:设当前初始位置为出口:do 若当前位置可通,则 将该位置插入到栈顶;/纳入路径 若该位置为出口位置。则结束当前程序;/求得的路径放在栈中 否则切换当前位置的东临位置(即向右)为新的当前的位置; 否则 若栈不为空且栈顶元素尚有其他位置未被探索,则设定新的当前位置为沿着顺时针旋转得到的栈顶位置的下一个临快; 若栈不为空且栈顶位置的四周均不通 则删去栈顶元素;/后退一步,从路径中删去该通块 若栈不空,则重新测试新的栈顶位置,直到找到一个可通的相邻块或出栈至栈空;/否则while(栈不为空)本程序的模块 主程序从
7、main()函数中进行,包括输入迷宫的大小等信息,然后调用迷宫模块,在迷宫模块中也调用了栈的模块。栈模块实现栈抽象数据类型迷宫模块实现迷宫抽象数据类型各模块之间的关系如下: 主程序模块 迷宫模块 栈模块是点从入口顺利的从出口走出。4、程序中的数据结构1坐标的位置类型: typedef struct int r;2.迷宫类型: int Col,Row;/迷宫的大小 int arrRangleRangle; /0表示障碍,1表示是可走的通道,-1表示外界的围墙 /2表示已经走过, 3表示已经知道其不能通过MazeType;void InitMaze(MazeType &M,int col,int
8、row) /按照用户的输入的行数row和列数col列的二维数组(元素值为1或0) /设置迷宫的错初值,加上边缘的一圈的值void PrintMaze(MazeType M) /根据已经进行二维数组的标记值来输出迷宫(或者其通路)bool Pass(MazeType M,PosType pos)/求解迷宫M中,从Start到end的一条路径/若存在则返回true,否则返回falseStack S; InitStack(S); PosType curpos=start;/设置当前坐标为入口位置; int curstep=1; /当前的步数 bool Find=false; /是否找到出口 Elem
9、Type e; 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; return Find; else/在其东临位置上移动,当前步数加一 curpos=NextPos(curpos,1); curstep+; else/当前位
10、置不能通过 if(!StackEmpty(S) Pop(S,e);/将已经走过的最近位置弹出,数据保存在e中 while(e.di=4&!(StackEmpty(S)/当方向改变一周后仍不能找到可通过的路径 MarkPrint(M,e.seat);/留下不能通过的标记 Pop(S,e);/删除站定元素 curstep-; /while if(e.di4)/不能通过则改变方向 e.di+;/方向顺时针改变一下5、程序核心算法的流程图从入口到出口的查找的流程图6、程序改进的设想1、有限时功能。2、只有所在位置周围一定区域内的情况能显示出来。3、颜色的改变,程序中涉及到同一颜色的进行了统一的改变se
11、tfillstyle(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
12、,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=8mapx-1y!=1) DrawPeople(&x,&y,1);/*上*/ else if(c=9mapx-1y+1!y,2);/*右上*/6mapxy+1!y,3);/*右*/3mapx+1y+1! DrawPeople(&y,4
13、);/*右下*/ if(c=2mapx+1y!y,5);/*下*/ else1mapx+1y-1! DrawPeople(&y,6); /*左下*/ if(c=4mapxy-1!y,7); /*左*/ else if(c=7mapx-1y-1!y,8); /*左上*/7、总结通过本次课程设计,强化了我对C语言相关知识的掌握,学会了基本的游戏编程方法,加深了我复杂程序设计的能力,初步掌握了高级语言程序调试技能,在知识方面,在设计迷宫时需要用到一些基本的如栈的相关信息,来解决不能使用递归的问题,递归在使用过程中虽然简介但不易理解通过栈的使用来加强我们对递归的使用。在对问题的理解上我们通过对相关知识
14、的理解和认识,来解决一些实际问题。经过一个星期的上机实践学习,使我对C语言有了更进一步的认识和了解,要想学好它要重在实践,要通过不断的上机操作才能更好地学习它,通过实践,我也发现我的好多不足之处,首先是自己在指法上还不行,经常按错字母,通过学习也有所改进;再有对C语言的一些标准库函数不太了解,还有对函数调用的正确使用不够熟悉,还有对C语言中经常出现的错误也不了解,通过实践,使我在这几个方面的认识有所提高。通过实践的学习,我认到学好计算机要重视实践操作,不仅仅是学习C语言,还是其它的语言,以及其它的计算机方面的知识都要重在实践,所以后在学习过程中,我会更加注视实践操作,使自己便好地学好计算机。8
15、、参考文献1、郭翠英.C语言课程设计案例精编M.水利水电出版社,2008 2、谭浩强.C程序设计M.高等教育出版社,20053、韩宣.Turbo C语言图形函数M.机械工业出版社,20004、衣治安.C语言综合应用案例教程M.铁道出版社,2008东北石油大学课程设计成绩评价表课程名称C课程设计题目名称游戏迷宫的实现学生姓名郑思琪学号100702140603指导教师姓名李改海职称助教序号评价项目指 标(优秀)满分评分1选题难度选题难度较高,或者对原题目进行了相当程度的改进。102工作量、工作态度和出勤率工作量饱满,工作努力,遵守纪律,出勤率高,工作作风严谨,善于与他人合作。3课程设计质量按期圆满的完成了规定的任务,方案设计合理,思考问题全面,系统功能完善。404报告质量问题论述思路清晰,结构严谨,文理通顺,撰写规范,图表完备正确。305回答问题在进行课程设计程序系统检查时,能正确回答指导教师所提出的问题。6创新(加分项)工作中有创新意识,对前人工作有改进或有应用价值。在进行系统检查时能对创新性进行说明,并在报告中有相应的论述。+5总分评语:指导教师: 年 月 日
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1