c++迷宫游戏实验报告材料
- 格式:doc
- 大小:225.00 KB
- 文档页数:15
课程设计报告书题目C语言的图形编程应用—迷宫游戏系别计算机工程系专业计算机科学与技术班级姓名指导教师下达日期2011 年12 月14 日设计时间自2011年12月19日至2011年12月30日指导教师评语课程设计任务书目录Ⅰ.程序设计目的 (3)Ⅱ.运行环境 (3)Ⅲ.程序功能 (3)Ⅳ.程序设计内容 (3)Ⅳ.1设计界面 (3)Ⅳ.2设计思路 (3)Ⅳ.3流程图 (4)Ⅳ.4主要功能模块 (4)Ⅴ.小结与启发 (10)Ⅵ.参考文献 (11)Ⅰ.程序设计目的通过典型实例―——迷宫问题,加深对递归算法的理解和编制,掌握数组的运用。
Ⅱ.运行环境主要在Windows 2000/XP操作系统TC下运行。
Ⅲ.程序功能迷宫是深受大家喜爱的游戏之一,一般设计迷宫为二维平面图,将迷宫的左上角做入口,右下角做出口,求出从入口点到出口点的一条通路,作为线性结构的典型应用,大多是用非递归方法实现,输出用0代表通路,1代表墙壁。
而本程序生成一个美观逼真的迷宫图,它是随机生成的且迷宫大小可以改变,迷宫的大小为N*N,N预定义为常数,修改N的值可以改变迷宫的大小(只要不超过屏幕显示范围),而程序不必做修改。
程序采用了两种运行方式:一种系统自动运行探索,用递归方法实现;一种是由人工操作探索通路,这利用了手动操作8个代表不同的方向的键位来实现。
用白色表示可走的路,棕色表示墙壁不可以通过。
Ⅳ.程序设计内容Ⅳ.1设计界面系统运行首先出现提示字符串“Please select hand(1)else auto”,询问是选择人工探索还是系统自动探索,当用户输入字符1按回车键后出现一个迷宫图,红色矩形块(表示探索物)出现在左上角,这是可以代表8个方向的字符选择通路,遇到墙壁不能通行,按回车键结束探索,如果这时探索物移动到右下角出口,则显示找到通路信息,否则显示没找到通路信息。
如图1为人工探索通路的界面。
在提示信息后,如果输入的字符不是1,则系统自动查找通路,如果没有找到通路,则显示没有找到通路信息。
《数据结构与算法》实验报告评分依据及结果一、需求分析1.问题描述:以一个m*n的长方阵表示迷宫,空格和感叹号分别表示迷宫中的通路和障碍。
设计一个程序,对随机产生的迷宫,求一条从入口到出口的通路,或得出没有通路的结论。
2.基本要求首先实现一个以链表为存储结构的栈类型,然后编写一个求解迷宫的非递归程序。
求得的通路以三元组(i,j,d)的形式输出。
其中(i,j)表示迷宫的一个坐标,d表示走到下一座标的方向。
3.程序的执行命令有:1)输入迷宫的列数2)输入迷宫的行数二、概要设计为实现上述功能,需要以一个链表为存储结构的栈类型1.栈的顺序存储表示typedef struct{int x; /*列*/int y; /*行*/}PosType; //坐标位置类型typedef struct{int ord; //通道块在路径上的"序号"PosType seat; //通道块在迷宫中的"坐标位置"int di; //从此通道块走向下一通道块的"方向"}SElemType; //栈的元素类型typedef struct{SElemType *base;SElemType *top;int stacksize; //当前已分配的存储空间,以元素为单位}SqStack;//迷宫程序typedef struct{int lie; /*列数*/int hang; /*行数*/char a[999][999];}MazeType; /*迷宫类型*/2.基本操作int InitStack(SqStack *S)//分配空间int GetTop(SqStack *S,SElemType *e) //若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORint Push(SqStack *S,SElemType *e)//插入元素e作为新的栈顶元素int Pop(SqStack *S,SElemType *e) //若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORint generatemaze( MazeType *maze)// 随机生成迷宫int Pass(MazeType *maze, PosType curpos ) //判断当前位置可否通过int FootPrint(MazeType *maze,PosType curpos) //留下足迹int MarkPrint(MazeType *maze,PosType curpos) //留下不能通过的标记PosType NextPos(PosType curpos,int di) //返回当前位置的下一位置int MazePath(MazeType *maze,PosType start,PosType end) //若迷宫有解,则求得一条存放在栈中(从栈底到栈顶),并返回OK,否则返回ERROR void PrintMaze(MazeType *maze) //打印迷宫三、详细设计//程序的头文件#include <stdio.h>#include <malloc.h>#include <stdlib.h>#include <string.h>#include <time.h>//函数的返回值#define OK 1#define ERROR 0#define NULL 0#define OVERFLOW -2#define STACK_INIT_SIZE 100#define STACKINCREMENT 10//栈的顺序存储表示typedef struct{int x; /*列*/int y; /*行*/}PosType; //坐标位置类型typedef struct{int ord; //通道块在路径上的"序号"PosType seat; //通道块在迷宫中的"坐标位置"int di; //从此通道块走向下一通道块的"方向"}SElemType; //栈的元素类型typedef struct{SElemType *base;SElemType *top;int stacksize; //当前已分配的存储空间,以元素为单位}SqStack;//基本操作int InitStack(SqStack *S){S->base=(SElemType *)malloc(STACK_INIT_SIZE * sizeof(SElemType));if(!S->base)exit(OVERFLOW);S->top=S->base;S->stacksize=STACK_INIT_SIZE;return OK;}//若栈不空,则用e返回S的栈顶元素,并返回OK;否则返回ERRORint GetTop(SqStack *S,SElemType *e){if(S->top==S->base)return ERROR;*e=*(S->top-1);return OK;}int Push(SqStack *S,SElemType *e)//插入元素e作为新的栈顶元素{if(S->top-S->base>=S->stacksize)/*栈满,追加存储空间*/{S->base=(SElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(SElemType));if(!S->base)exit(OVERFLOW);S->top=S->base+S->stacksize;S->stacksize+=STACKINCREMENT;}*S->top++=*e;return OK;}//若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERRORint Pop(SqStack *S,SElemType *e){if(S->top==S->base)return ERROR;*e=*--S->top;return OK;}int StackEmpty(SqStack *S){return(S->top==S->base);}//迷宫程序typedef struct{int lie; /*列数*/int hang; /*行数*/char a[999][999];}MazeType; /*迷宫类型*//*随机生成迷宫*/int generatemaze( MazeType *maze){int i,j;maze->a[0][0]=2;maze->a[++maze->hang][++maze->lie]=3; /*设置外墙*/maze->a[0][maze->lie]='!';maze->a[maze->hang][0]='!';for(j=1;j<maze->lie;j++){maze->a[0][j]='!';maze->a[maze->hang][j]='!';}for(i=1;i<maze->hang;i++){maze->a[i][0]='!';maze->a[i][maze->lie]='!';}srand((unsigned)time( NULL ));rand();for(i=1; i <maze->hang; i++)for(j=1;j<maze->lie;j++){if (rand()>=RAND_MAX/4) maze->a[i][j] =' '; //' ' 暗示出路else maze->a[i][j] ='!'; //'!'暗示无出路}return OK;}int Pass(MazeType *maze, PosType curpos ) //判断当前位置可否通过{if ((curpos.x < 1) || (curpos.x >= maze->lie))return ERROR;if ((curpos.y < 1) || (curpos.y >= maze->hang))return ERROR;if (maze->a[curpos.y][curpos.x]==' ')return OK;else return ERROR;}int FootPrint(MazeType *maze,PosType curpos) //留下足迹{maze->a[curpos.y][curpos.x]='*';return OK;}int MarkPrint(MazeType *maze,PosType curpos) //留下不能通过的标记{maze->a[curpos.y][curpos.x]='@';return OK;}PosType NextPos(PosType curpos,int di)//返回当前位置的下一位置{PosType pos=curpos;switch(di){case 1: //右东pos.x++;break;case 2: //下南pos.y++;break;case 3: //左西pos.x--;break;case 4: //上北pos.y--;break;}return pos;}//若迷宫有解,则求得一条存放在栈中(从栈底到栈顶),并返回OK,否则返回ERROR int MazePath(MazeType *maze,PosType start,PosType end){PosType curpos;SqStack *S=(SqStack *)malloc(sizeof(SqStack));InitStack(S);SElemType *e;e=(SElemType *)malloc(sizeof(SElemType));curpos=start; //设定当前位置为入口位置int curstep = 1; //探索第一步do {if(Pass(maze,curpos)) //当前位置可通过{FootPrint(maze,curpos);e->ord=curstep;e->seat=curpos;e->di=1;Push(S,e);if(curpos.x==end.x&&curpos.y==end.y)return (OK);curpos=NextPos(curpos,1);curstep++;}else{if(!StackEmpty(S)){Pop(S,e);while(e->di==4&&!StackEmpty(S)) //栈不空但栈顶位置四周均不通{MarkPrint(maze,e->seat);Pop(S,e);}if(e->di<4) //栈不空且栈顶位置四周有其他位置未探索{e->di++;Push(S,e);curpos=e->seat;curpos=NextPos(curpos,e->di);}}}}while(!StackEmpty(S));return ERROR;}void PrintMaze(MazeType *maze) //打印迷宫{int i,j,k,n;int c[999],d[999];for(i=0,k=0;i<=maze->hang;i++){for(j=0;j<=maze->lie;j++){printf("%c ",maze->a[i][j]);if(maze->a[i][j]=='*'){c[k]=i;d[k]=j;k++;}}printf("\n");}n=k;for(k=0;k<n;k++)printf("<%d,%d>",c[k],d[k]);printf("\n");printf("\n");}int main(){int zmg;char ch;printf(" 数据结构课程设计--迷宫问题求解\n\n");printf(" |----------------------------------------|\n");printf(" | |\n");printf(" | |\n");printf(" | |\n");printf(" | |\n");printf(" | XXXX XXXXXXXXXXXXXX |\n");printf(" | XXXXXXX |\n");printf(" |----------------------------------------|\n");getchar();do{system("cls");fflush(stdin);MazeType *maze=(MazeType *)malloc(sizeof(MazeType)); //设置迷宫的长宽不含外墙printf("请输入迷宫的列数(不含外墙时):");scanf("%d",&maze->lie);printf("请输入迷宫的行数(不含外墙时):");scanf("%d",&maze->hang);generatemaze(maze);printf("随机创建迷宫\n");PrintMaze(maze);getchar();getchar();PosType start,end;start.x=1;start.y=1;end.x=maze->lie-1;end.y=maze->hang-1;zmg=MazePath(maze,start,end);if(zmg){printf("此迷宫通路为\n");PrintMaze(maze);}elseprintf("此迷宫无通路\n"); //getchar();printf("再次尝试?(Y/N)?");scanf("%c",&ch);}while(ch=='Y'||ch=='y');return 0;}四、调试分析1.本程序界面设计合理,以空格为通路,感叹号!为障碍,笑脸为起始点,*为行走路线,心形为出口设计精巧,便于用户使用。
迷宫问题实验报告篇一:迷宫问题实验报告武汉纺织大学数学与计算机学院数据结构课程设计报告迷宫问题求解学生姓名:学号:班级:指导老师:报告日期:一、问题描述以一个m x n的长方矩阵表示迷宫,1和0分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出从入口到出口的通路,或者没有通路的结论。
二、需求分析 1、以二维数组maze[10][10]表示迷宫,数组中以元素1表示通路,0表示障碍,迷宫的大小理论上可以不限制,但现在只提供10*10大小迷宫。
2、迷宫的入口和出口需由用户自行设置。
3、以长方形矩阵的形式将迷宫及其通路输出,输出中“#”表示迷宫通路,“1”表示障碍。
4、本程序只求出一条成功的通路。
但是只要对函数进行小量的修改,就可以求出其他全部的路径。
5、程序执行命令为:(1)输入迷宫;(2)、求解迷宫;(3)、输出迷宫。
三、概要设计1、设定栈的抽象数据类型定义:ADT zhan{ 基本操作:InitStack(SqStack &S)操作结果:构造一个空栈 push(*s,*e)初始条件:栈已经存在操作结果:将e所指向的数据加入到栈s中 pop(*s,*e)初始条件:栈已经存在操作结果:若栈不为空,用e返回栈顶元素,并删除栈顶元素 getpop(*s,*e)初始条件:栈已经存在操作结果:若栈不为空,用e返回栈顶元素stackempty(*s)初始条件:栈已经存在操作结果:判断栈是否为空。
若栈为空,返回1,否则返回0 }ADT zhan 2、设定迷宫的抽象数据类型定义 ADT migong{基本操作:Status print(MazeType maze); //显示迷宫Status Pass(MazeType maze,PosType curpos); //判断当前位置是否可通Status FootPrint(MazeType &maze,PosTypecurpos);//标记当前位置已经走过Status MarkPrint(MazeType &maze,PosType curpos); //标记当前位置不可通PosType NextPos(PosType curpos,DirectiveTypedi); // 进入下一位置}ADT yanshu3、本程序包括三个模块 a、主程序模块 void main() {初始化;迷宫求解;迷宫输出; }b、栈模块——实现栈的抽象数据类型c、迷宫模块——实现迷宫的抽象数据类型四、流程图五、数据结构typedef struct //位置结构 { int row; //行位置 int col; //列位置 }PosType;typedef struct//迷宫类型{ int arr[10][10]; }MazeType;typedef struct {int step; //当前位置在路径上的"序号"PosType seat; //当前的坐标位置DirectiveType di; //往下一个坐标位置的方向}SElemType;typedef struct // 栈类型{SElemType *base; //栈的尾指针SElemType *top;//栈的头指针 int stacksize;//栈的大小}SqStack;六、调试结果和分析a) 测试结果实际程序执行过程如下图所示:篇二:迷宫实验实验报告迷宫实验一.摘要迷宫实验主要是要探讨研究一个人只靠自己的动觉,触觉和记忆获得信息的情况下,如何学会在空间中定向。
数据结构(迷宫求解实验报告)一、【实验构思(Conceive)】(10%)(本部分应包括:描述实验实现的基本思路,包括所用到的离散数学、工程数学、程序设计、算法等相关知识)实验实现基本思路:若当前位置可通,则纳入当前路径,并继续朝下一个位置探索,即切换下一位置为当前位置,如此重复直至到达出口;若当前位置不可通,则应顺着来向退回到前一通道块,然后朝着除来向之外的其他方向继续探索;若该通道块的四周4个方块均不可通,则应从当前路径上删除该通道块。
设以栈记录当前路径,则栈顶中存放的是当前路径上最后一个通道块。
由此,纳入路径的操作即为当前位置入栈;从当前路径上删除前一通道块的才操作即为出栈。
二、【实验设计(Design)】(20%)(本部分应包括:抽象数据类型的功能规格说明、主程序模块、各子程序模块的伪码说明,主程序模块与各子程序模块间的调用关系)抽象数据类型:typedef struct{int x; //当前位置的横坐标int y; //当前位置的纵坐标char type; //当前位置的属性:墙壁或通道(0/1)bool isfoot; //判断当位置是否已走过, true代表已走过}Position; //当前位置信息typedef struct{int order; //脚步在地图上的序号Position seat; //行走的当前位置int aspect; //下一步的方向}Block; //脚步typedef struct{int width; //地图的长度int height; //地图的宽度Position* site; //地图内的各个位置}Maze; //地图typedef struct{Block* base;Block* top;int length;int stacksize;}Stack;主程序模块:int main(int argc, _TCHAR* argv[]){Position start,end;Block blk;Stack S;int width,height;printf("输入迷宫比例X*Y\n");printf("输入X:");scanf("%d",&width);printf("输入Y:");scanf("%d",&height);Maze* maze=GreatMaze(width,height);PrintMaze(maze);printf("\n");printf("请输入入口坐标X:");scanf(" %d",&start.x);printf("请输入入口坐标Y:");scanf(" %d",&start.y);printf("请输入出后坐标X:");scanf(" %d",&end.x);printf("请输入出口坐标Y:");scanf(" %d",&end.y);MazePath(maze,start,end,S);printf("走完所需路径长度为:%d",S.length);printf("\n");Stack Sa;InitStack(Sa);while(S.length!=0){Pop(S,blk);Push(Sa,blk);}while(Sa.length!=0){Pop(Sa,blk);if(Sa.length!=0)printf("[%d,%d]->",blk.seat.x,blk.seat.y); //打印足迹elseprintf("[%d,%d]",blk.seat.x,blk.seat.y); //打印最后一步}}各子程序函数:Maze* GreatMaze(int width,int height) //创建地图void PrintMaze(Maze* maze) //打印地图int PositionComparison(Position maze,Position pos) //判断当前位置是否合法int Pass(Maze* maze,Position curpos)//判断当前位置是否可以前进或者是否走过void FootSet(Maze* maze,Position site) //留下足迹Position NextPos(Position &cur,int aspect)//判断方向Int MazePath(Maze* maze,Position start,Position end,Stack &S)//搜索从入口到出口的路径三、【实现描述(Implement)】(30%)(本部分应包括:抽象数据类型具体实现的函数原型说明、关键操作实现的伪码算法、函数设计、函数间的调用关系,关键的程序流程图等,给出关键算法的时间复杂度分析。
c 课程设计报告迷宫一、教学目标本课程的教学目标是让学生掌握迷宫问题的基本概念、算法和编程技巧。
通过本课程的学习,学生应能理解迷宫问题的数学模型,掌握常用的迷宫算法,并能够运用编程语言实现迷宫的求解。
此外,学生还应培养解决问题的能力和创新思维,提高对计算机科学和编程的兴趣。
具体来说,知识目标包括:1.了解迷宫问题的背景和应用场景。
2.掌握迷宫问题的数学模型和基本概念。
3.熟悉常用的迷宫算法及其特点。
4.理解编程语言在解决迷宫问题中的应用。
技能目标包括:1.能够运用迷宫算法求解简单迷宫问题。
2.能够运用编程语言实现迷宫算法的求解。
3.能够对迷宫算法进行优化和改进。
情感态度价值观目标包括:1.培养学生对计算机科学和编程的兴趣。
2.培养学生解决问题的能力和创新思维。
3.培养学生的团队合作意识和沟通能力。
二、教学内容本课程的教学内容主要包括迷宫问题的基本概念、算法和编程技巧。
具体内容包括:1.迷宫问题的背景和应用场景。
2.迷宫问题的数学模型和基本概念。
3.常用的迷宫算法及其特点。
4.编程语言在解决迷宫问题中的应用。
教学大纲安排如下:第一课时:介绍迷宫问题的背景和应用场景,引入迷宫问题的数学模型和基本概念。
第二课时:介绍常用的迷宫算法及其特点,引导学生理解编程语言在解决迷宫问题中的应用。
第三课时:通过案例分析,让学生运用迷宫算法求解简单迷宫问题,培养学生的编程能力。
第四课时:引导学生对迷宫算法进行优化和改进,提高学生的解决问题的能力。
第五课时:进行课程总结和回顾,让学生展示自己的迷宫求解成果,进行交流和评价。
三、教学方法本课程的教学方法采用讲授法、讨论法和实验法相结合的方式。
通过讲授法,向学生传授迷宫问题的基本概念、算法和编程技巧;通过讨论法,引导学生进行思考和交流,培养学生的创新思维;通过实验法,让学生动手实践,培养学生的编程能力和解决问题的能力。
在教学过程中,教师应根据学生的实际情况,灵活运用不同的教学方法,以激发学生的学习兴趣和主动性。
数据结构集中上机
试验报告
学院:计算机科学与技术专业:计算机科学与技术
学号:00000000 班级:(6)姓名:
20010.10.27
题目:编制一个求解迷宫通路的程序
以一个M*N的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
实验要求:实现一个以链表作存储结构的栈类型。
然后编写一个求解迷宫的
非递归程序。
求得的通路以三元组(i , j , d)的形式输出,其中(i , j )指示迷宫中的一个坐标,d表示走到下一坐标的方向。
实验过程:
1.基本算法以及分析:
本程序主要是以链表构造栈的形式,寻找迷宫路径,根据创立的结点,输入结点里的一些数据,如下
struct Stack 序源代码:
迷宫问题
#include<iostream>
#include<iomanip>
using namespace std;
struct Stack 行结果
一·起点(1 ,1)
二·起点(4 , 1)
4 心得体会:
开始对栈的构造不清楚,且定义的出栈函数繁琐,定义的各个函数均有逻辑上的小错误。
此程序采用直接定义的二维数组迷宫,不符合题目要求,程序各个算法有待改进。
迷宫问题实验报告级班年月日姓名学号_1.实验题目以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
2.需求分析本程序使用VC编写,实现设定迷宫或自动生成迷宫长方阵表的功能,并且求出一条从指定入口到指定出口的通路,或得出没有通路的结论。
①输入的形式和输入值的范围:A.输入指定的数字,以此选择迷宫的创建方式,分为手动创建迷宫和自动创建迷宫B. 输入迷宫阵表的行数和列数,行数和列数不超过40行C. 手动创建迷宫时,需要输入迷宫结点的通畅和障碍情况,0和1分别表示迷宫中的通路和障碍。
②输出的形式:输出没有通路的结论,或者输出一个长方阵表,其中路径的每个结点都输出→、↓、←、↑之一,表示从当前结点到下一个结点的方向。
③程序所能达到的功能:实现设定迷宫或自动生成迷宫长方阵表的功能,并且求出一条从指定入口到指定出口的通路(迷宫的入口指定为坐标为(1,1)的结点,迷宫的出口指定为坐标为(迷宫最大行,迷宫最大列)的结点),或得出没有通路的结论。
④测试数据:输入数据:A.出现选择生成迷宫方式的菜单时,输入1(即手动输入数据,生成迷宫);B.输入迷宫的行数和列数,行数输入3,列数输入3;C.输入每个迷宫结点的信息:0 0 11 0 01 0 0输出结果:→↓ 11 →↓1 0 03.概要设计1)为了实现上述程序功能,需要定义迷宫的抽象数据类型:typedef struct//定义迷宫结构体{int maze_array[maxsize][maxsize];//二维数组存放迷宫每个点是通畅或阻隔的信息int max_x,max_y; //迷宫的行数和和列数}2)定义迷宫中点的指针的结构体typedef struct point{int vex_x,vex_y; //结点的横纵坐标(横坐标为行号,纵坐标为列号)struct point *ahead;//在链栈中,指向前一个结点的指针int direction; //从当前结点走至下一个结点的方向};基本操作:A. Maze creat_manual()初始条件:无操作结果:手动创建一个迷宫。
一、实验内容3、迷宫问题。
假设迷宫由m行n列构成,有一个出口和一个入口,入口坐标为(1,1),出口坐标为(m,n),试设计并验证以下算法:找出一条从入口通往出口的路径,或报告一个“无法通过”的信息。
(1)用C语言实现顺序存储队列上的基本操作,然后利用该队列的基本操作找出迷宫的一条最短路径。
(2)设计一个二维数组MAZE[m+2][n+2]表示迷宫,数组元素为0表示该位置可以通过,数组元素为1表示该位置不可以通行。
MAZE[1][1]、MAZE[m][n]分别为迷宫的入口和出口。
(3)输入迷宫的大小m行和n列,动态生成二维数组;由随机数产生0或1,建立迷宫,注意m*n的迷宫需要进行扩展,扩展部分的元素设置为1,相当于在迷宫周围布上一圈不准通过的墙。
(4)要求输出模拟迷宫的二维数组;若存在最短路径,则有出口回溯到入口(出队列并利用栈实现),再打印从入口到出口的这条路径,例如(1,1),......,(i,j),......,(m,n);若没有路径,则打印“No path”。
(5)迷宫的任一位置(i,j)上均有八个可移动的方向,用二维数组Direction存放八个方向的位置偏移量。
Direction[8][2]={{0,1},{1,1},{0,-1},{-1,-1},{1,-1},{1,0},{-1,0},{-1,1}};(6)为避免出现原地踏步的情况需要标志已经通过的位置,采用一个标志数组MARK[m+2][n+2],初值均为0,在寻找路径的过程中,若通过了位置(i,j),则将MARK[i][j]置为1。
(7)为了记录查找过程中到达位置(i,j)及首次到达(i,j)的前一位置(i_pre,j_pre),需要记住前一位置(i_pre,j_pre)在队列中的序号pre,即队列中数据元素应该是一个三元组(i,j,pre)。
(8)搜索过程简单下:将入口MAZE[1][1]作为第一个出发点,依次在八个方向上搜索可通行的位置,将可通行位置(i,j,pre)入队,形成第一层新的出发点,然后依次出队,即对第一层中各个位置分别搜索它所在八个方向上的可通行位置,形成第二层新的出发点,...,如此进行下去,直至达到出口MAZE[m][n]或者迷宫所有位置都搜索完毕为止。
1、问题描述程序开始运行时显示一个迷宫地图,迷宫中央有一只老鼠,迷宫的右下方有一个粮仓。
游戏的任务是使用键盘上的方向健操纵老鼠在规定的时间内走到粮仓处。
基本要求:(1)老鼠形象可以辨认,可用键盘操纵老鼠上下左右移动;(2)迷宫的墙足够结实,老鼠不能穿墙而过;(3)正确检测结果,若老鼠在规定时间内走到粮仓处,提示成功,并给出一条路径,否则提示失败。
提高要求:(1)添加编辑迷宫功能,可修改当前迷宫,修改内容:墙变路、路变墙;(2)增加闯关和计分功能;(3)找出走出迷宫的所有路径,以及最短路径。
2.需求分析软件的基本功能:通过键盘控制光标移动实现老鼠在迷宫中的行走、全部路径和最短路径的显示、自定义地图(墙变路,路变墙)。
在老鼠闯关只能在地图显示是路的地方行走,不能穿墙,有计时功能,当时间结束时若没有到达指定地点,显示game over,查看排行榜,游戏结束,若成功到达指定位置,进去下一关,直到所有关结束,程序结束;。
输入/输出形式:用户可以通过控制台,根据输入提示。
输入形式:①方向键、空格键、enter键输出形式:①输出地图菜单。
②输出地图③输出是否成功信息、输出排行榜3.概要设计(1)主程序流程图1:主程序流程图(3)模块调用关系:本程序中函数包括:main函数,menu函数,menu2函数,mouse类内函数,path 类内函数,change函数,函数调用关系如下:图2:函数调用关系4.详细设计(1)实现概要设计的数据类型:Mouse类class mouse{private:int m_x;int m_y;time_t begin ,stop;public:int move_up(int map[x][y],int end);//向上移动int move_down(int map[x][y],int end);//向下移动int move_left(int map[x][y],int end);//左int move_right(int map[x][y],int end);//右void initialize(int map[x][y],int end){ m_x=S;m_y=S;map[end][end]=9;} void print(int map[x][y],int end);//打印地图void operate(int map[x][y],int end,char name[30]);//操作void success();void charts(char Name[30]);//排行榜};Path类class Path{public:Path(){pa=1000;}void path(int i,int j,int map[x][y],int &t,int end);int check(int i, int j, int d, int map[x][y],int end);void Print2(int map[x][y], int &t,int end);//打印每条路径void allpath(int s,int e,int map[x][y],int &t,int end);private:int pa;};(2)主程序以及其它模块的算法描述:主函数具体代码:int main(){menu();file(1);v: if(menu2(1,11)==1)//1,返回当前关卡菜单,0,进入下一关卡goto v;v2: file(2);if(menu2(2,12)==1)goto v2;v3: file(3);if(menu2(3,13)==1)goto v3;v4: file(4);if(menu2(4,15)==1)goto v4;v5: file(5);if(menu2(5,18)==1)goto v5;final();return 0;}Menu2 函数具体代码int menu2(int t,int e){mouse mickey;Path path;int p=0;system("cls");Loc1(15,3);cout<<"Welcome"<<Name;Loc1(15,5);cout<<"△▼△▼第"<<t<<"关▼△▼△"<<endl;cout<<endl;a();//菜单初始状态char k;int sel=1;//选中第一项while(1){k=getch();//移动上下方向键switch(k){case 72://上移if(sel>1){sel--;if(sel==1)a();else if(sel==2)b();else if(sel==3)c();else if(sel==4)d();else if(sel==5)menue();}break;case 80: //下移if(sel<6){sel++;if(sel==1)a();else if(sel==2)b();else if(sel==3)c();else if(sel==4)d();else if(sel==5)menue();}break;case 13://回车确定选择if(sel==1)//开始闯关{mickey.operate(MAP,e,Name);return 0;}else if(sel==2)//查看所有路径和最短路径{system("cls");path.allpath(9,9,MAP,p,e);return 1;}else if(sel==3)//更改地图{change(2*(18-e),18-e,e);return 1;}else if(sel==4)//查看排名{mickey.charts(Name);return 1;}else if(sel==5)//退出{exit(0);}}}}这个函数主要调用了各实现功能函数。
其步骤为:用户进入菜单选项,方向键控制选中选项移动,enter进入选中选项。
(3)其它模块的算法描述控制老鼠移动函数功能:方向键移动老鼠。
(上方向键进入Move_up函数)if(map[m_x-1][m_y]==1)return 0;else if(map[m_x-1][m_y]==9){map[m_x][m_y]=0;m_x--;map[m_x][m_y]=3;return -1;}else{map[m_x][m_y]=0;Y=-1;X=0;Loc(2*m_y,m_x);cout<<" ";Loc(2*m_y+X,m_x+Y);cout<<"♂";m_x--;map[m_x][m_y]=3;求全部路径功能:输出迷宫所有路径int dir[4][2]={{-1,0},{1,0},{0,-1},{0, 1}};//上下左右int d,tx,ty,p;for(d=0;d<4;d++){if(check(i,j,d,map,end)==1)//检查是否可以走{tx=i+dir[d][0];ty=j+dir[d][1];p=map[tx][ty];//记录状态map[tx][ty]=4;//标记路径map[end][end]=0;if(tx==end&&ty==end)//终点{t++ ;//路径条数加一Print2(map,t,end);//终点}else{path(tx,ty,map,t,end);map[tx][ty]=p;}}更改地图功能char key;Loc2(sx,sy);while(1){key=getch();switch(key){case 72:Loc2(sx,--sy);break;case 80:Loc2(sx,sy++);break;case 75:Loc2(sx-=2,sy);break;case 77:Loc2(sx+=2,sy);break;case 32:if(MAP[sy][sx/2]==1){MAP[sy][sx/2]=0;Loc1(sx,sy);cout<<" ";Loc1(sx,sy);}else if(MAP[sy][sx/2]==0){MAP[sy][sx/2]=1;Loc1(sx,sy);cout<<"■";Loc1(sx,sy);}break;case 13:return ;default:break;5、编码与调试分析1.编码与调试过程中遇到的问题及解决办法:【问题一】通过清屏打印地图实现老鼠移动,屏幕闪烁严重解决办法:分析得知,通过移动光标打印老鼠位置,可以解决屏闪问题解决此问题的核心代码:COORD pos = {a,b};HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);SetConsoleCursorPosition(hOut, pos);2.待解决问题:①时间不能实现连续变化3、使用说明进入菜单,根据提示进行选择:方向键选择,enter键进入4、测试结果(1)进入页面(2)菜单页面(3)闯关(4)打印路径(5)自定义地图(6)查看排行榜8、自学知识在课程设计过程中,特别是在代码编写和调试的过程中,自学了很多新的知识。
例如Loc()函数,包含于表头文件 #include <window.h> 。
其功能是: 移动光标位置,更改控制台输出颜色。
还有一个知识点是清屏函数,它也是包含于<stdlib.h>头文件中的,使用形式为system("CLS")。
主要功能就是清空屏幕。
9、课程设计心得体会课程设计是一次可以让我们所学的理论与实际相结合的机会。
我们选择了迷宫游戏这一题目。
我这次的程序准确来说还算不上一个游戏,刚开始想要自学MFC因为时间原因没有实现,这是一个遗憾。
但学习不会随着课设的结束而结束,课程也给我指明了未来努力的方向。
课程中最大的困难还是一些难以查出的错误,编译时查不出的错误,其被发现时很可能只是位置的错误,仅隔数行,这些微小的信息却极大地影响了整体的效果。
这不仅存在于一个程序之中,因而我对于生活中的细节也有了改观,对于整体和局部的观念也有了更多的见解。
参考书:[1]《c++面向对象程序设计》清华大学出版社谭浩强著[2]《数据结构(C++版)》清华大学出版社王红梅、胡明、王涛著。