数据结构课程设计之迷宫游戏.docx
- 文档编号:2084533
- 上传时间:2022-10-26
- 格式:DOCX
- 页数:26
- 大小:88.30KB
数据结构课程设计之迷宫游戏.docx
《数据结构课程设计之迷宫游戏.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计之迷宫游戏.docx(26页珍藏版)》请在冰豆网上搜索。
数据结构课程设计之迷宫游戏
数据结构课程设计之迷宫游戏
##大学
数据结构课程设计报告
题目:
走迷宫游戏
院(系):
计算机工程学院学生姓名:
班级:
学号:
起迄日期:
2011-6-21至2011-6-30指导教师:
2010—2011年度第2学期
一、需求分析
1问题描述
走迷宫游戏
程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。
游戏的任务是使用键盘上的方向键操纵老鼠在规定的时间内走到粮仓处。
2基本功能
1)老鼠形象可辨认,可用键盘操纵老鼠上下左右移动;
2)迷宫的墙足够结实,老鼠不能穿墙而过;
3)正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,否则提示失败;
4)添加编辑迷宫功能,可修改当前迷宫,修改内容:
墙变路、路变墙;
5)找出走出迷宫的所有路径,以及最短路径。
利用序列化功能实现迷宫地图文件的存盘和读出等功能3输入输出
输入为字符型:
1,2,3分别实现功能选择
w(上),s(下),a(左),d(右)控制迷宫的走向
y表示确定n表示否定
二、概要设计
1.设计思路:
实现走迷宫
game()
对迷宫地图进行修改实现自动搜路change()Mathpath()
对搜寻的路径进行输对修改的地图数组进行保存出edit()print()
对修改的地图进行保存
savemap()
2.数据结构设计:
采用的是栈来存储数据,进栈实际是在栈中插入三元组,出栈则只数组的个数进行操作
抽象数据类型线性表的定义如下:
ADTSqStack{
数据对象:
D={a|a?
SElemType,i=1,2,3……,n,n?
0}ii
数据关系:
R1={|a,a?
D,i=1,2,3,……,n}i-1ii-1i
基本操作:
SqStack*InitStack()
操作结果:
创建一个空栈
voidPush(SqStack*S,SElemTypedata)
初始条件:
栈S已存在
操作结果:
插入一个元素,并且使数据个数加一(top++)
voidPop(SqStack*S)
初始条件:
栈S已存在。
操作结果:
栈中元素个数减一(top--)
}
2.软件结构设计:
game()模块
函数原型:
voidgame(intmap1[h][w])//游戏函数
{
#definekilltime15
clock_tstart,finish;
doubleduration;
intx=1,y=1,m=0,n=0,M,N,MAP[100][100];//x->colomy->row
charcCtrl='\0';
cout<<"游戏规则:
"< "< for(M=0;M<=h-1;M++)for(N=0;N<=w-1;N++)MAP[M][N]=map1[M][N]; { { start=clock();//开始计时 while((cCtrl=getch())! ='q') { switch(cCtrl) { case'w': //向上 {cout<<'\a';//响铃 if(y>0&&! MAP[y-1][x]) y--; }break; case's': //下 {cout<<'\a'; if(! MAP[y+1][x]) y++; }break; case'a': //左 {cout<<'\a'; if(x>0&&! MAP[y][x-1]) x--; }break; case'd': //右 {cout<<'\a'; if(! MAP[y][x+1]) x++; }break; } system("cls");//刷屏 for(m=0;m { for(n=0;n { if(m==y&&n==x) { system("color6"); cout<<"◎";//现实老鼠所在位置 } else { if(MAP[m][n]) cout<<"? ";//打印墙壁 else { if(m==9&&n==8) cout<<"? ";//显示粮仓 else cout<<"? ";//显示可行路径 } } if(x==8&&y==9) { finish=clock();//停止计时 duration=(double)(finish-start)/CLOCKS_PER_SEC;//computethetime cout< "< if(duration>killtime)//lose { cout<<"你输了,完蛋了,小老鼠要饿死了囧rz! ! "< } else//win { cout< (^o^)? 小老鼠总算找到粮仓了,谢谢啊~"< 这是你赢得的金币◎,小老鼠奉上: "< cout<<""; for(inti=0;i<20-duration;i++) cout<<"◎"; cout< } exit(0); } } cout< } } } } } Mazepath()模块: voidMazePath(intmaze[][w],intx,inty)//找到全部路径的函数 { inti; SElemTypedata; if(x==h-2&&y==w-2)//到达出口 { print(S); return; } for(i=0;i<4;i++)//进行四个方向的判断 { data.seat.r=x; data.seat.c=y; data.d=i; maze[x][y]=-1; x=x+move[i].r;//对下一个方向处理 y=y+move[i].c; if(maze[x][y]==0)//如果下一方向可通,把此元素入栈 { Push(S,data); MazePath(maze,x,y);//求下一元素为开始的路径 Pop(S); } x=x-move[i].r;//若下一方向不通,回到此坐标 y=y-move[i].c; maze[x][y]=0; } } 三、详细设计 1.定义程序中所有用到的数据及其数据结构,及其基本操作的实现 typedefstruct { intr,c; }PosType;//坐标r表示行,c表示列 typedefstruct { PosTypeseat; intd; }SElemType;//seat表示当前坐标,d表示当前要转的方向序号 typedefstruct { SElemTypedata[1000]; inttop; }SqStack;//栈元素类型,含有一个三元组,top表示该数组的元素个数 SqStack*S; PosTypemove[4]={{0,1},{1,0},{0,-1},{-1,0}};//move表示移动,分别是右、下、左、 上 intcount=1;//用来统计路径条数 2(主函数和其他函数的伪码算法 voidMazePath(intmaze[][w],intx,inty)//找到全部路径的函数{ inti; SElemTypedata;//定义三元组类型变量 if(x==h-2&&y==w-2)//到达出口 打印路径; for(i=0;i<4;i++)//进行四个方向的判断 { 把x,y赋给data data.d=i;//方向记录 maze[x][y]=-1; 对下一个方向进行探索; if(maze[x][y]==0)//如果下一方向可通 { 把此元素入栈 MazePath(maze,x,y);//求下一元素为开始的路径 Pop(S); } 若下一方向不通,返回到此坐标; maze[x][y]=0; } } voidprint(SqStack*s)//显示一条路径 { //freopen("THEMAP.txt","a",stdout); intmap[h][w]={//给出迷宫的矩阵} for(i=0;i<=s->top;i++) { 输出每一个坐标位置和探索的方向 map[s->data[i].seat.r][s->data[i].seat.c]=2;//把坐标位置重新标记 } count++;//路径记录加一 输出字符模式的地图; } voidgame(intmap1[h][w])//游戏函数 { #definekilltime15 clock_tstart,finish; doubleduration; intx=1,y=1,m=0,n=0,M,N,MAP[100][100];//x->colomy->row charcCtrl='\0'; 初始化地图(赋值);{ { start=clock();//开始计时 while((cCtrl=getch())! ='q'){ switch(cCtrl) { case'w': //向上{if(y>0&&! MAP[y-1][x])y--;}break; case's': //下{if(! MAP[y+1][x])y++;}break; case'a': //左{if(x>0&&! MAP[y][x-1])x--;}break; case'd': //右{if(! MAP[y][x+1])x++;}break; } system("cls");//刷屏 打印出老鼠,墙壁,粮仓; if(x==8&&y==9) {finish=clock();//停止计时 duration=(double)(finish-start)/CLOCKS_PER_SEC;//computethetime 胜利和失败的处理; exit(0); } } cout< } } } } } voidsavemap(intmap[h][w])//保存地图 { 以追加的方式打开一个文件; 将地图以字符形式写入文件; 将地图以数组形式写入文件; } voidchange(intmap[h][w])//墙变路,路变墙 { 先以字符形式显示地图; 输入你想改变的坐标; 路变墙,墙变路; 显示改变后的地图 选择保存与否; 继续游戏; } voidedit(intgame[]){ inta[100000]; FILE*fp; fp=fopen("ok.txt","r");//打开地图数组文件intt=0; while(fscanf(fp
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计 迷宫 游戏