实验四报告Word下载.docx
《实验四报告Word下载.docx》由会员分享,可在线阅读,更多相关《实验四报告Word下载.docx(19页珍藏版)》请在冰豆网上搜索。
15
3.界面友好、易于操作、有较强的容错性
实验报告撰写(10%)
1.内容详实无缺漏,文字流畅、图表清楚
2.实验结果分析客观、详细,实验体会真实可信,对原实验方案的改进和对实验内容的发散性思考
个人工作量(30%)
1.个人完成工作量
2.个人技术水平
10
3.团队合作精神
实验运作(10%)
1.有一定用户群
2.应用前景分析
综合得分:
(满分100分)
指导教师:
年月日
一、【实验构思(Conceive)】
(10%)
借助栈来实现在迷宫中的前进和后退。
同时在还需要设计迷宫的大小、迷宫的出入口、根据输入的入口来寻找迷宫的出口,并把路径输出来。
在这个编程中由于不知道所走路劲步数,所以采用了链式栈实现每一步的移动,若找到出路则前进否则返回下一步改变方向来实现相关的移动,所以栈在其间起到了工具作用。
迷宫的具体路障和通道是随机实现的。
出口位置的的寻找方法:
do{
若当前位置可通,则{
将该位置插入到栈顶;
若该位置为出口位置。
则结束当前程序;
否则切换当前位置的东临位置(即向右)为新的当前的位置;
}
否则{
若栈不为空且栈顶元素尚有其他位置未被探索,则设定新的当前位置为沿着顺时针旋转得到的栈顶位置的下一个临快;
若栈不为空且栈顶位置的四周均不通
{
则删去栈顶元素;
//后退一步,从路径中删去该通块
若栈不空,则重新测试新的栈顶位置,直到找到一个可通的相邻块或出栈至栈空;
}
}while(栈不为空)
二、【实验设计(Design)】
(20%)
主程序从main()函数中进行,包括输入迷宫的大小等信息,然后调用迷宫模块,在迷宫模块中也调用了栈的模块。
栈模块——实现栈抽象数据类型
迷宫模块——实现迷宫抽象数据类型
三、【实现描述(Implement)】
(30%)
(一)主要数据类型
1.坐标的位置类型:
typedefstruct
{
intr;
//行
intc;
//列
}PosType;
2.栈的元素类型
typedefstruct{
intstep;
//当前位置在路径上的序号
PosTypeseat;
//当前位置的坐标
intdi;
//往下一坐标的方向
}ElemType;
3.结点类型,指针类型
typedefstructNodeType{
ElemTypedata;
NodeType*next;
}NodeType,*NodeLink;
4.栈类型
NodeLinktop;
//指向栈顶
intsize;
}Stack;
5.迷宫类型:
intCol,Row;
intarr[Rangle][Rangle];
}MazeType
(二)主要函数
1.stack.h
voidInitStack(Stack&
S)//初始化栈,设S为空栈
StatusStackEmpty(StackS)//检测栈是否为空
StatusPush(Stack&
S,ElemTypee)//进栈
StatusPop(Stack&
S,ElemType&
e)//出栈
2.迷宫.cpp
voidInitMaze(MazeType&
M,intcol,introw)
voidPrintMaze(MazeTypeM)
StatusPass(MazeTypeM,PosTypepos)
voidFootPrint(MazeType&
M,PosTypepos)
voidMarkPrint(MazeType&
PosTypeNextPos(PosTypeCurPos,intDir)
StatusMazePath(MazeTypeM,PosTypestart,PosTypeend)
StatusPlay(MazeType&
M,PosTypestart,PosTypeend)
(三)操作部分伪代码:
1.MazePath()函数
StatusMazePath(MazeTypemaze.PosTypestart,PosTypeend)
{
InitStack(S);
curpos=start;
Curstep=1;
found=FALSE;
if(Pass(maze,curpos)
FootPrint(maze,curpos);
e=(curstep,curpos,1);
Push(S,e);
if(Same(curpos,end))found=TRUE;
else{
curpos=NextPos(curpos,1);
curstep++;
}//else
}∥if
else
if(!
StackEmpty(S)){
Pop(S,e);
while(e.di==4&
&
!
StackEmpTy(S)){
MarkPrint(maze,e.seat);
Pop(S,e);
curstep--;
}∥while
if(e.di<
4){
e.di++;
Push(S,e);
curpos=NextPos(e.seat,e.di);
}∥if
}while(!
StackEmpty(S)&
found){
returnfound;
}∥MazePath
2.Play()函数
{
charch;
intsuccess=0;
intr,c;
PosTypecurpos=start;
clock_tTimeStart,TimeEnd;
doubleduration;
四、【测试结果(Testing)】
1.成功走出了迷宫:
2.中途按q键可以退出:
五、【实验总结】
利用随机数来设计这个迷宫图。
利用%运算则可以完成迷宫的生成,因为在设置迷宫数组时,1就代表通道,而0就是障碍,随意一个随机数%2得到的就是0或者1就可以自由设计迷宫了。
在设计迷宫时需要用到一些基本的如栈的相关信息,通过栈的使用来加强对递归的使用。
六、【项目运作描述(Operate)】
1.本程序是一个迷宫游戏,运行后先输入想要生成迷宫的行数和列数。
程序会自动生成可用的迷宫,然后按任意键即可开始游戏。
游戏方法:
w-上s-下a-左d-右q–退出(可中途退出)
游戏结束后,程序会给出游戏所用时间,和是否成功走出迷宫。
2.应用前景分析:
实现了迷宫游戏,操作简单。
七、【代码】
#include<
stdio.h>
typedefintStatus;
typedefstruct
}*NodeLink;
S){
S.size=0;
S.top=NULL;
StatusStackEmpty(StackS)
if(S.size==0)
returntrue;
else
returnfalse;
S,ElemTypee)
NodeType*p;
if((p=(NodeType*)malloc(sizeof(NodeType)))==NULL)
p->
data=e;
next=S.top;
S.top=p;
S.size++;
returntrue;
e)
NodeType*p=S.top;
if(p==NULL)
printf("
栈为空,无法删除栈顶元素……\n"
);
e=p->
data;
S.size--;
S.top=p->
next;
free(p);
2.主程序:
stdlib.h>
time.h>
#include"
stack.h"
string.h>
process.h>
conio.h>
#defineRangle100
}MazeType;
M.Col=col;
M.Row=row;
inti,j,n;
srand(time(NULL));
for(i=1;
i<
M.Row+2;
i++)
for(j=1;
j<
M.Col+2;
j++)
{
n=rand()%101+100;
M.arr[i][j]=n%2;
}
for(i=0;
i<
M.Col+2;
i++)
M.arr[0][i]=-1;
M.arr[M.Row+1][i]=-1;
M.Row+2;
M.arr[i][0]=-1;
M.arr[i][M.Col+1]=-1;
{inti,j;
for(i=0;
i++){
for(j=0;
j++)
if(M.arr[i][j]==0)
printf("
█"
elseif(M.arr[i][j]==-1)
printf("
※"
elseif(M.arr[i][j]==2)
◇"
"
printf("
\n"
}
if(M.arr[pos.r][pos.c]!
=0
&
M.arr[pos.r][pos.c]!
=-1
=2
=3)
M.arr[pos.r][pos.c]=2;
{M.arr[pos.r][pos.c]=3;
{PosTypeReturnPos;
switch(Dir)
case1:
//向右
ReturnPos.r=CurPos.r;
ReturnPos.c=CurPos.c+1;
break;
case2:
//向下
ReturnPos.r=CurPos.r+1;
ReturnPos.c=CurPos.c;
case3:
//向左
ReturnPos.c=CurPos.c-1;
case4:
//向上
ReturnPos.r=CurPos.r-1;
returnReturnPos;
StackS;
InitStack(S);
intcurstep=1;
StatusFind=false;
ElemTypee;
do{
if(Pass(M,curpos)){
FootPrint(M,curpos);
e.step=1;
e.seat=curpos;
e.di=1;
Push(S,e);
if(curpos.c==end.c&
curpos.r==end.r)
{
Find=true;
returnFind;
}
else
curpos=NextPos(curpos,1);
curstep++;
else
if(!
StackEmpty(S))
{
Pop(S,e);
while(e.di==4&
!
(StackEmpty(S)))
{
MarkPrint(M,e.seat);
Pop(S,e);
curstep--;
}while
if(e.di<
4)
e.di++;
Push(S,e);
curpos=NextPos(e.seat,e.di);
}if
}if
}else
}while(!
!
Find);
//(!
//当栈不为空且没有找到出口
returnfalse;
charch;
PosTypecurpos=start;
\n游戏方法:
\n\n"
w-上\n"
s-下\n"
a-左\n"
d-右\n\n"
q-退出\n\n\n"
按任意键开始游戏"
getch();
TimeStart=clock();
system("
cls"
r=curpos.r;
c=curpos.c;
M.arr[r][c]=2;
PrintMaze(M);
ch=getch();
switch(ch)
case'
w'
:
//向上走
if(M.arr[r-1][c]==1)
M.arr[r][c]=1;
curpos.r=curpos.r-1;
break;
s'
//向下走
if(M.arr[r+1][c]==1)
curpos.r=curpos.r+1;
a'
//向左走
if(M.arr[r][c-1]==1)
curpos.c=curpos.c-1;
d'
//向右走
if(M.arr[r][c+1]==1)
curpos.c=curpos.c+1;
if(curpos.c==end.c&
success=1;
curpos=end;
system("
r=curpos.r;
c=curpos.c;
M.arr[r][c]=2;
PrintMaze(M);
}while(success!
=1&
ch!
='
q'
TimeEnd=clock();
duration=(double)(TimeEnd-TimeStart)/CLOCKS_PER_SEC;
\n用时%0.2f秒,"
duration);
if(success==0)
没有走出迷宫\n"
if(success==1)
成功走出迷宫\n"
returnsuccess;
intmain()
MazeTypeM;
intcol,row;
PosTypestart,end;
do{
请输入迷宫的行数:
"
scanf("
%d"
&
row);
请输入迷宫的宽度:
col);
if(row>
40||col>
37)
\n输入的行列过大!
按任意键开始重新输入.\n\n"
getch();
}while(row>
37);
start.c=1;
start.r=1;
end.r=row;
end.c=col;
InitMaze(M,col,row);
}while(MazePath(M,start,end)==false);
Play(M,start,end);
system("
pause"
return0;