1、3.算法结构和程序功能模块之间逻辑清晰、有相应的流程图实验实现(25%)1. 代码编写规范、风格统一、注释清楚易读 2. 程序运行正常,测试结果正确153. 界面友好、易于操作、有较强的容错性实验报告撰写(10%)1. 内容详实无缺漏,文字流畅、图表清楚2. 实验结果分析客观、详细,实验体会真实可信,对原实验方案的改进和对实验内容的发散性思考个人工作量(30%)1. 个人完成工作量2. 个人技术水平103. 团队合作精神实验运作(10%)1. 有一定用户群2. 应用前景分析综合得分: (满分100分)指导教师:(注:此表在难度为C时使用,每个成员一份。)(下面的内容由学生填写,格式统一为,字体
2、: 楷体, 行距: 固定行距18,字号: 小四,个人报告按下面每一项的百分比打分。难度A满分70分,难度B满分90分)一、【实验构思(Conceive)】(10%)1.创建四个文件,stack.h头文件、queue.h头文件、maze.h头文件和main.cpp主文件2.栈文件用于在移动玩家位置过程中,将移动的方向保存到栈中。然后在修改玩家位置时,用出栈的元素判断前方是地图的哪边。然后将这个元素保存到队列中,等玩家走出迷宫后,输出走过的路径。3.maze头文件:(1)迷宫(二位数组)中的元素数据类型为自己构造的maze类型。里面有二位数组的位置y(行),x(列)、有substance为char
3、类型、有left、right、up、down四个方位,表示二位数组中的绝对坐标关系。(2)maze * JudgeRight(maze * player,maze * playerF)这个函数是用于传入玩家当前位置和前方位置,来返回右手边的地址。(3)maze * JudgeFront(maze * player,char &go)这个函数利用玩家的当前位置,和刚刚直走以后的方向,来返回前方的地址。(4)maze * GoToFront(maze * player,maze * playerF,struct stack &S)这个函数是传入玩家的当前位置,前方位置,然后修改当前位置的地址,并返
4、回。其中还要把移动的方向压入栈中。5.主文件里面创建10X10的二维数组来表示迷宫,并且初始化迷宫中的元素,确立其绝对坐标,确立绝对的邻居关系。接下来利用迷宫口诀:“伸出右手,摸着墙顺着走”,即“如果右手边不是墙,则,右转后直走;如果右手边是墙,前方没墙,则直走;右手边是墙,前方有墙,则左转”,做一个循环,如果玩家到了u才结束。其中有入栈,出栈,入队的操作。迷宫走出来以后,利用岀队函数输出玩家走过的路径。二、【实验设计(Design)】(20%)1.可以直接利用实验三(魔王语言)中的栈和队列头文件。栈文件用于在maze.h头文件中的一个函数:maze * GoToFront(maze * &p
5、layer,maze * &playerF,struct stack &S)这个函数是在移动玩家位置过程中,将移动的方向保存到栈中。然后在修改玩家的前方位置时,用出栈的元素判断前方是地图的哪边。2.maze头文件:里面有二位数组的位置y(行),x(列),这样表示的方便是能直观利用坐标。元素中还有substance为char类型,其中有w表示墙、e表示空、p表示玩家、表示出口。还有left、right、up、down四个方位,表示二位数组中的绝对坐标关系。(5)maze * JudgeRight(maze * player,maze * playerF)函数:在里面定义一个maze型指针play
6、erR,然后判断:如果前方就坐标的下方,那么playerR是坐标中的左方;如果前方就坐标的上方,那么playerR是坐标中的右方;如果前方就坐标的左方,那么playerR是坐标中的上方;如果前方就坐标的右方,那么playerR是坐标中的下方。然后返回playerR。(6)maze * JudgeFront(maze * player,char &go)函数:在里面定义一个maze型指针playerF,传入go(表示刚刚直走的方向),如果上走,palyerF修改成player的上方;如果下走,palyerF修改成player的下方;如果左走,palyerF修改成player的左方;如果右走,pa
7、lyerF修改成player的右方;返回palyerF。(7)maze * GoToFront(maze * player,maze * playerF,struct stack &直走函数:根据前方的坐标减去玩家当前坐标,然后得出x,y的值。如果x为1,向右走;x为-1,向左走;y为1,向下走;y为-1,向上走;然后将所走的方向用char表示成U,DLR压住栈中。将玩家的前方赋值给变化后的位置,返回变化后的玩家位置。3.主文件里面创建10X10的二维数组来表示迷宫,并且初始化迷宫中的元素,确立其绝对坐标,确立绝对的邻居关系。首先是定义二维数组:maze mazeArr1010(非指针类型);
8、初始化:(1)访问二维数组的每一个元素,确立它的绝对坐标(x,y)、其中如果遇到边缘(x = 0 | y = 0 | x = 9 | y = 9)时,将其中表示成墙,否则先表示成空。(2)大量坐标中的元素初始化后,再局部修改,将部分空的地方变成墙。将(1,1)表示成玩家的初始化位置,(8,8)表示成出口。(3)之后就是定义二位数组的绝对上下左右关系。特别注意的是如果是二位数组的边缘,那么要注意将边缘中某些方向指针修改成指向NULL的情况。比如:当x为0时,表示的是二维数组的第一列,那么将第一列所有元素的左指针都指向NULL,然后再修改其右,上,下指针。如果x,y都不为0,那么表示的是迷宫的内部
9、(非边缘)。那么,按照坐标关系,下指针指向(y+1,x)的地址;上指针指向(y-1,x)的地址;右指针指向(y,x+1)的地址;左指针指向(y,x-1)的地址;(4)接下来利用迷宫口诀:其中,左转就是3次右转;直走之前将player的substance修改为空,再传直走函数,之后再判断前飞,再来判断右方,然后入队。而在每次大循环开始前,将玩家的当前位置中的substance修改成(5)迷宫走出来以后,利用岀队函数输出玩家走过的路径。三、【实现描述(Implement)】(30%)1.二位数组中每个元素的数据结构:typedef struct mazeS char substance; int
10、x,y; mazeS *left,*right,*up,*down;maze;2.判断玩家的右手边地址函数:maze * JudgeRight(maze * player,maze * playerF) maze * playerR; if(playerF = player-down) playerR = player-left;up)right;left)up;right)down; return playerR;3.判断前方maze * JudgeFront(maze * player,char &go) maze * playerF; if(go = playerF = player-
11、return playerF;4.直走函数:S) char go; int y,x; y = playerF-y - player-y; x = playerF-x - player-x; if(y = -1) go = ; if(y = 1) if(x = -1) if(x = 1) PushStack(S,go); player = playerF; return player;5.走迷宫的实现:char go;struct linkQueue Q;InitQueue(Q);struct stack S;InitStack(S); maze * player = &mazeArr11;ma
12、ze * playerF = player- maze * playerR = JudgeRight(player,playerF);/开始走迷宫,并做记录while(1) if(player-substance = )break; else player-substance = if(playerR-) if(playerF- /左转=右转3次 for(int i = 0; i 3; i+) playerF = playerR; playerR = JudgeRight(player,playerF); continue; else playerF = playerR; playerR =
13、JudgeRight(player,playerF); /直走 player = GoToFront(player,playerF,S); PopStack(S,go); playerF = JudgeFront(player,go); playerR = JudgeRight(player,playerF); EnQueue(Q,go); 五、【测试结果(Testing)】实验测试结果均为正确:测试的输入测试结果截图按照课本中的地图修改(3,5)变为墙(6,3)变成空六、【实验总结】总结:这次的实验遇到了三个问题:一是在修改二位数组的4方向指针的时候,遇到程序崩溃问题,原因是那些指针指向了错
14、误的地址。然后修改了一下迷宫边缘那些块的4个方向地址,运行才正确。二是认识了一点,在maze.h文件中已经包含了stack.h,然后main.cpp文件中包含maze.h以后,就不用在main.cpp文件中预读stack.h文件了,不然会导致很多编译错误,其实就是一处错误。三是通过传递函数,来修改指针指向的地址,目前还没找到方法。只有通过引用来修改其指向的值,而不能修改地址值。七、【项目运作描述(Operate)】本次试验,可以做进一步改进,就是在输出玩家所走过的路径后,进行dos下的游戏。玩家输出方向键后,判断方向。修改二维数组中的相应值就可以了。利用刷屏技术,实现娱乐的性质。八、【代码】S
15、tack.h和Queue.h头文件代码不再给出,下面是maze.h和mian.cpp文件的代码:#include stack.hstdlib.hstdio.h/定义迷宫二位数组中的数据类型结构/判断玩家的右手边地址/直走函数第二个文件:queue.h主文件代码如下:#includequeue.hmaze.h#include using namespace std;void main() maze mazeArr1010; /* * 数组的初始化 * */ /定义坐标(x,y)并初始化边缘为墙,将内部赋值成空气 for(int i = 0; 10; for(int j = 0; j j+) if
16、(i = 0 | i = 9 | j = 0 | j = 9) mazeArrij.substance = else mazeArrij.substance = mazeArrij.x = j; mazeArrij.y = i; /修改内部某些为墙 mazeArr13.substance = mazeArr17.substance = mazeArr23.substance = mazeArr27.substance = mazeArr35.substance = mazeArr36.substance = /实验结果二的修改地图 mazeArr53.substance = mazeArr42
17、.substance = mazeArr43.substance = mazeArr44.substance = mazeArr54.substance = mazeArr62.substance = mazeArr66.substance = mazeArr72.substance = mazeArr73.substance = mazeArr74.substance = mazeArr76.substance = mazeArr77.substance = mazeArr81.substance = /定义其他标记 mazeArr11.substance = mazeArr88.subst
18、ance = /定义数组中方向的关系 for(int y = 0; y y+) for(int x = 0; x 0 & 9) mazeArryx.up = & mazeArryx.down = & else if(x = 9) mazeArryx.right = NULL; else if(y = 0) mazeArryx.up = NULL; if(x mazeArryx.left = & mazeArryx.right = & else if(y = 9) mazeArryx.down = NULL; /*for(int y = 1;= 8; 8; coutsubstance cout /开始走迷宫,并做记录 while(1) if(player- else player- if(playerR- if(playerF- /左转=右转3
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1