迷宫问题 有源代码

迷宫问题 有源代码
迷宫问题 有源代码

西安郵電大學

数据结构课程设计报告题目:迷宫问题

院系名称:计算机学院

专业名称:软件工程

班级:1101班

学生姓名:付添

学号(8位):04113035

指导教师:李培

设计起止时间:2012年12月3日~2012年12月14日

一. 设计目的

仅仅认识到队列是一种特殊的线性表是远远不够的,本次实习的目的在于使学生深入了解队列的特征,以便在实际问题背景下灵活运用它,同时还将巩固这种数据结构的构造方法,是同学们栈的运用更得心应手,为以后就业打下很好的基础。

二.设计内容

主要包括哈

1.从键盘输入迷宫。

2.从文件读出迷宫。

3.走迷宫。

4以坐标形式输出迷宫路径。

5.以形象的矩阵输出路径。

三.概要设计

1.功能模块图;

2.各个模块详细的功能描述。

(1)savefile();//从键盘输入迷宫

从键盘输入迷宫1表示墙0表示通路,并把01存入结构体m1中用flag表示通路初始化通路的标志域。

(2)inread();//从文件读出迷宫

事先已将迷宫存入文件中,从文件读出迷宫1表示墙0表示通路,并把01存入结构体m1中用flag表示通路初始化通路的标志域。

(3)zoumigong();//走迷宫

根据m1判断该坐标四周如果为墙并且标志域为0则可走,将该坐标入栈,将其标志域更改为1,更新坐标,继续判断,知道更新坐标等于出口坐标.栈中存放就是通路的逆序坐标。

(4)print1()//以坐标形式输出

将栈中坐标出栈,存入数组中以坐标形式输出。

(5)print2()//以矩阵形式输出

将栈中坐标出栈,存入数组中以矩阵形式输出。

四.详细设计

1.功能函数的调用关系图

2.各功能函数的数据流程图

3.重点设计及编码

typedef struct

{

int mg[200];

int top;

}seqstack;

typedef struct migong

{

int m1;//存放墙

int flag;//标志域

}smaze[20][20];

int empty(seqstack &s)//判栈空

{

if(s.top==-1)

return 0;

else

return 1;

}

void pop(seqstack &s,int &x1)//出栈

{

if(s.top==-1)

return ;

x1=s.mg[s.top];

s.top--;

}

void push(seqstack &s,int y1,int x1)//入栈

{

if(s.top==20)

return ;

s.top++;

s.mg[s.top]=y1;

s.top++;

s.mg[s.top]=x1;

}

void zumigong(seqstack &stack,smaze &maze,int &m,int &n)//走迷宫{

int i,j,cout;

int x1,a,b,y1,x,y,x2,y2;

printf("输入入口的横纵坐标,空格隔开\n");

scanf("%d %d",&x,&y);

printf("输入出口的横纵坐标,空格隔开\n");

scanf("%d %d",&x2,&y2);

for(i=0;i<=m+1;i++)

{

for(j=0;j<=n+1;j++)

{

if(maze[i][j].m1==1)

printf("■");

else

printf("□");

}

printf("\n");

}

x1=x;

y1=y;

if(maze[x1][y1].m1==1)

{

printf("此路不通:\n");

return ;

}

if(maze[x2][y2].m1==1)

printf("入口为墙。请重新输入\n");

else

while(x1!=x2||y1!=y2)

{

if(maze[x1][y1+1].m1==0&&maze[x1][y1+1].flag==0)

cout=0;

else

if(maze[x1+1][y1].m1==0&&maze[x1+1][y1].flag==0)

cout=1;

else

if(maze[x1-1][y1].m1==0&&maze[x1-1][y1].flag==0)

cout=2;

else

if(maze[x1][y1-1].m1==0&&maze[x1][y1-1].flag==0)

cout=3;

else

cout=4;

switch(cout)

{

case 0:

a=x1;

b=y1;

maze[x1][y1].flag=1;

y1=y1+1;

push(stack,b,a);//列先入

break;

case 1:

a=x1;

b=y1;

maze[x1][y1].flag=1;

x1=x1+1;

push(stack,b,a);

break;

case 2:

a=x1;

b=y1;

maze[x1][y1].flag=1;

x1=x1-1;

push(stack,b,a);

break;

case 3:

a=x1;

b=y1;

maze[x1][y1].flag=1;

y1=y1-1;

push(stack,b,a);

break;

case 4:

maze[x1][y1].flag=1;

if(empty(stack)!=0)

{

pop(stack,x1);

pop(stack,y1);

break;

}

else

{

printf("此路没有通路:\n");

return ;

}

}

}

push(stack,y2,x2); }

五.测试数据及运行结果

1.正常测试数据和运行结果

1.测试数据

2,运行结果

1.坐标形式

2.矩阵形式

3文件保存结果

2. 异常测试数据及运行结果

六.调试情况,设计技巧及体会

1.改进方案

设置标志域使访问判断坐标更方便。

2.体会

通过这段时间的课程设计,本人对计算机的应用,数据结构的作用以及C语言的使用都有了更深的了解。尤其是C语言的进步让我深刻的感受到任何所学的知识都需要实践,没有实践就无法真正理解这些知识以及掌握它们,使其成为自己的财富。在理论学习和上机实践的各个环节中,通过自主学习和请教老师,我收获了不少。当然也遇到不少的问题,也正是因为这些问题引发的思考给我带了收获。从当初不喜欢上机写程序到现在能主动写程序,从当初拿着程序不只如何下手到现在知道如何分析问题,如何用专业知识解决实际问题的转变,我发现无论是专业知识还是动手能力,自己都有很大程度的提高。在这段时间里,我对for、while等的循环函数用法更加熟悉,逐渐形成了较好的编程习惯。在老师

的指导帮助下,同学们课余时间的讨论中,这些问题都一一得到了解决。在程序的调试能力上,无形中得到了许多的提高。例如:头文件的使用,变量和数组的范围问题,定义变量时出现的问题等等。

在实际的上机操作过程中,不仅是让我们了解数据结构的理论知识,更重要的是培养解决实际问题的能力,所以相信通过此次实习可以提高我们分析设计能力和编程能力,为后续课程的学习及实践打下良好的基础。

在这次短短的课程实践里,我们得到了李培老师的关心和帮助。她给了我们很多的信息,与我们一起探讨问题,询问我们遇到了哪些问题并耐心给予指导。当我们遇到技术上难以解决的问题时,她就会指导我们解决问题

七.参考文献

《数据结构——C语言描述》耿国华主编,高等教育社出版。

#include

#include

typedef struct

{

int mg[200];

int top;

}seqstack;

typedef struct migong

{

int m1;

int flag;

}smaze[20][20];

void inista(seqstack &s)

{

s.top=-1;

}

int empty(seqstack &s)

{

if(s.top==-1)

return 0;

else

return 1;

}

void pop(seqstack &s,int &x1)

{

if(s.top==-1)

return ;

x1=s.mg[s.top];

s.top--;

}

void push(seqstack &s,int y1,int x1)

{

if(s.top==20)

return ;

s.top++;

s.mg[s.top]=y1;

s.top++;

s.mg[s.top]=x1;

}

void inread(smaze &maze,int m,int n)

{

char name[20];

int i,j;

printf("输入存放迷宫的文件名\n");

scanf("%s",name);

FILE *fp=fopen(name,"rt");

if(fp==NULL)

{

printf("\n打开文件%s失败\n");

exit(1);

}

for(i=1;i

for(j=1;j

{

fscanf(fp,"%d ",&maze[i][j].m1);

if(maze[i][j].m1==0)

maze[i][j].flag=0;

else

maze[i][j].flag=1;

}

fclose(fp);

for(i=0;i<=m+1;i++)

{

maze[i][0].m1=1;

maze[i][0].flag=1;//加两堵列墙

maze[i][n+1].m1=1;

maze[i][n+1].flag=1;

}

for(j=0;j<=n+1;j++) //加两堵行墙

{

maze[0][j].m1=1;

maze[m+1][j].m1=1;

maze[0][j].flag=1;

maze[m+1][j].flag=1;

}

for(i=0;i<=m+1;i++)

{

for(j=0;j<=n+1;j++)

{

if(maze[i][j].m1==1)

printf("■");

else

printf("□");

}

printf("\n");

}

}

void zumigong(seqstack &stack,smaze &maze,int &m,int &n) {

int i,j,cout;

int x1,a,b,y1,x,y,x2,y2;

printf("输入入口的横纵坐标,空格隔开\n");

scanf("%d %d",&x,&y);

printf("输入出口的横纵坐标,空格隔开\n");

scanf("%d %d",&x2,&y2);

for(i=0;i<=m+1;i++)

{

for(j=0;j<=n+1;j++)

{

if(maze[i][j].m1==1)

printf("■");

else

printf("□");

}

printf("\n");

}

x1=x;

y1=y;

if(maze[x1][y1].m1==1)

{

printf("此路不通:\n");

return ;

}

if(maze[x2][y2].m1==1)

printf("入口为墙。请重新输入\n");

else

while(x1!=x2||y1!=y2)

{

if(maze[x1][y1+1].m1==0&&maze[x1][y1+1].flag==0)

cout=0;

else

if(maze[x1+1][y1].m1==0&&maze[x1+1][y1].flag==0)

cout=1;

else

if(maze[x1-1][y1].m1==0&&maze[x1-1][y1].flag==0)

cout=2;

else

if(maze[x1][y1-1].m1==0&&maze[x1][y1-1].flag==0)

cout=3;

else

cout=4;

switch(cout)

{

case 0:

a=x1;

b=y1;

maze[x1][y1].flag=1;

y1=y1+1;

push(stack,b,a);//列先入

break;

case 1:

a=x1;

b=y1;

maze[x1][y1].flag=1;

x1=x1+1;

push(stack,b,a);

break;

case 2:

a=x1;

b=y1;

maze[x1][y1].flag=1;

x1=x1-1;

push(stack,b,a);

break;

case 3:

a=x1;

b=y1;

maze[x1][y1].flag=1;

y1=y1-1;

push(stack,b,a);

break;

case 4:

maze[x1][y1].flag=1;

if(empty(stack)!=0)

{

pop(stack,x1);

pop(stack,y1);

break;

}

else

{

printf("此路没有通路:\n");

return ;

}

}

}

push(stack,y2,x2);

}

void print1(seqstack stack)

{

char name[20];

int s1[20],s2[20],i=0,j=0,n=0;

while(stack.top!=-1)

{

n++;

pop(stack,s1[i]);

pop(stack,s2[i]);

i++;

j++;

}

printf("以坐标形式输出迷宫路径\n");

printf("迷宫路径为:\n");

for(i=n-1;i>=1;i--)

printf("<%d,%d> → ",s1[i],s2[i]);

printf("<%d %d>\n",s1[0],s2[0]);

printf("请输入要保存路径的文件名\n");

scanf("%s",name);

FILE *fp=fopen(name,"wb");

if(fp==NULL)

{

printf("\n打开文件%s失败\n",name);

exit(1);

}

fprintf(fp,"迷宫路径:\n");

for(i=n-1;i>=0;i--)

fprintf(fp,"<%d,%d> ",s1[i],s2[i]);

fclose(fp);

printf("已成功保存于%s文件中",name);

}

void print2(seqstack &stack,smaze &maze,int &m,int &n)

{

int s1[20],s2[20],i=0,j=0,n1,n2;

while(stack.top!=-1)

{

pop(stack,s1[i]);

pop(stack,s2[j]);

n1=s1[i];

n2=s2[j];

maze[n1][n2].flag=2;

i++;

j++;

}

printf("以形象的矩阵形式输出迷宫路径·表示走过的痕迹⊙表示迷宫路径\n");

printf("如下所示\n");

for(i=0;i<=m+1;i++)

{

for(j=0;j<=n+1;j++)

{

if(maze[i][j].m1==1)

printf("■");

if(maze[i][j].m1==0&&maze[i][j].flag==0)

printf("□");

if(maze[i][j].m1==0&&maze[i][j].flag==1)

printf("·");

if(maze[i][j].m1==0&&maze[i][j].flag==2)

printf("⊙");

}

printf("\n");

}

}

void savefile(smaze maze,int &m,int &n) {

int i,j;

char name[20];

printf("输入迷宫:\n");

for(i=1;i<=m;i++)

for(j=1;j<=n;j++)

{

scanf("%d",&maze[i][j].m1);

if(maze[i][j].m1==1)

maze[i][j].flag=1;

else

maze[i][j].flag=0;

}

for(i=0;i<=m+1;i++)

{

maze[i][0].m1=1;

maze[i][0].flag=1;//加两堵列墙

maze[i][n+1].m1=1;

maze[i][n+1].flag=1;

}

for(j=0;j<=n+1;j++) //加两堵行墙

{

maze[0][j].flag=1;

maze[m+1][j].flag=1;

maze[0][j].m1=1;

maze[m+1][j].m1=1;

}

printf("请输入保存的文件名:\n");

scanf("%s",name);

FILE *fp=fopen(name,"wt");

if(fp==NULL)

{

printf("\n打开文件%s失败\n",name);

exit(1);

}

for(i=0;i<=m+1;i++)

{

for(j=0;j<=n+1;j++)

{

if(maze[i][j].m1==1)

printf("■");

else

printf("□");

}

printf("\n");

}

fprintf(fp,"迷宫路径:\n");

for(i=1;i<=m;i++)

{

for(j=1;j<=n;j++)

fprintf(fp,"%d ",maze[i][j].m1);

fputc('\n',fp);

}

fclose(fp);

}

int print()

{

int i;

printf(" · \n");

printf(" · · \n");

printf(" · · \n");

printf(" ·软件1班· \n");

printf(" ·付· \n");

printf(" ·添· \n");

printf(" · · \n");

printf(" · \n");

printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★\n\n");

printf("★欢迎进入迷宫系统★\n\n");

printf("★●①从键盘输入迷宫★\n\n");

printf("★●②从文件读出迷宫★\n\n");

printf("★●③走迷宫★\n\n");

printf("★●④以坐标形式输出迷宫路径★\n\n");

printf("★●⑤以形象的矩阵形式表示路径★\n\n");

printf("★●10退出走迷宫系统★\n\n");

printf("★◆输入你要执行的功能序号★\n\n");

printf("★★★★★★★★★★★★★★★★★★★★★★★★★★★\n");

scanf("%d",&i);

return i;

}

int main()

{

seqstack stack;

inista(stack);

int m,n,f;

smaze maze;

while(f!=10)

{

f=print();

switch(f)

{

case 10:printf("★您已退出系统期待你的下次访问★\n");

break;

case 1:

printf("输入迷宫的行和列:\n");

scanf("%d %d",&m,&n);

savefile(maze,m,n);

break;

case 2:

printf("输入迷宫的行和列:\n");

scanf("%d %d",&m,&n);

inread(maze,m,n);

break;

case 3:

zumigong(stack,maze,m,n/*,s1,s2*/);

break;

case 4:

print1(stack);

break;

case 5:

print2(stack,maze,m,n);

break;

case 6:

迷宫问题源代码

#include #include #include #include #include #define M 50 #define N 50 typedef struct node //堆栈结构 { int row; //行 int col; //列 struct node *next; }Mlink; Mlink *stack;//定义一个栈 int backup[M+2][N+2]; //备份数组 /*********************************建立迷宫矩阵**************************/ void create(int maze[][N+2],int a,int b)//建立迷宫 { int i,j,flag; srand((unsigned)time(NULL)); //以时间产生随机种子 for(i=0;i<=a+1;i++) for(j=0;j<=b+1;j++) maze[i][j]=1;//将四周置为1 for(i=1;i<=a;i++) for(j=1;j<=b;j++) { maze[i][j]=0;//初始化矩阵 backup[i][j]=0;//初始化备份矩阵 } printf("建立迷宫矩阵(选择1或者2):\n1,手动建立\n2,自动建立\n请输入您的选择:\n"); scanf("%d",&flag); if(flag==1)//手动建立迷宫 { printf("手动建立迷宫矩阵(0表示可通1表示障碍):\n"); for(i=1;i<=a;i++) for(j=1;j<=b;j++) scanf("%d",&maze[i][j]); }

java课设走迷宫含代码

目录1.设计目的 1.1课程设计的目的 2.总体设计 2.1设计思路 2.2设计方法 3.关键技术 4.程序流程 5.主要源代码 6. 运行结果及结论 7.参考文献

1.设计目的 1.1课程设计的目的 随着科技进步,时代发展,计算机走进了大家的生活。计算机程序强大的功能为使用者提供服务,编程语言也变得越来越流行。Java语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。 为了进一步巩固课堂上所学到的知识,深刻把握Java语言的重要概念及其面向对象的特性,熟练应用面向对象的思想和设计方法解决实际问题的能力,也是为了增加同学们娱乐游戏选择而开发了一个适合学生的,能提升思考力的迷宫冒险游戏,这既锻炼了动手能力,还能进行消遣娱乐,可谓一举两得。 2.总体设计 2.1设计思路 根据对游戏系统进行的需求分析,本系统将分为6个模块:分别是迷宫主界面模块、记时设计模块、迷宫设计模块、道路和障碍设计模块、动漫冒险者设计模块、出入口设计模块。实现的功能有: (1)迷宫的选择 玩家可以根据自身需求来进行选择简单迷宫、中等迷宫、难度迷宫三类中选择一类迷宫进行游戏。 (2)选择道路和障碍的图像 玩家可以根据个人喜好对迷宫中的道路和障碍的图片进行选择,但是图片的格式有规定,必须是“jpg”或“gif”格式的。 (3)游戏记时 当玩家控制迷宫中的动漫人物进行游戏时,计时器就开始进行记时,直到动漫人物到达出口时,记时结束,并在屏幕上显示游戏用时。 (4)开始游戏 玩家将鼠标移动至迷宫中的动漫冒险者,即可看到“单击我然后按键盘方向键”,单击后,游戏开始。玩家即可通过键盘上的方向键进行游戏。 (5)游戏结束 玩家控制动漫冒险者移动至迷宫地图的出口处时,游戏的计时器停止计时,并弹出信息框“恭喜您通关了”,游戏结束。

迷宫问题求解

课程设计报告 课题名称:迷宫问题的求解及演示姓名: 学号: 专业:计算机与信息学院 班级: 指导教师:

数据结构课程设计任务书针对本课程设计,完成以下课程设计任务书: 1.熟悉系统实现工具和上机环境。 2.根据课程设计任务,查阅相关资料。 3.针对所选课题完成以下工作: (1)需求分析 (2)概要设计 (3)详细设计 (4)编写源程序 (5)静态走查程序和上机调试程序 4.书写上述文档和撰写课程设计报告

目录 第一部分课程设计任务书 (1) 第二部分课程设计报告 (2) 第一章课程设计内容和要求 (4) 2.1 问题描述 (4) 2.2 需求分析 (4) 第二章课程设计总体方案及分析 (4) 3.1 概要设计 (7) 3.2 详细设计 (7) 3.3 调试分析 (10) 3.4 测试结果 (10) 第三章设计总结 (13) 4.1课程设计总结 (13) 4.2参考文献………………………………………………… 4.3 附录(源代码) (14)

第二部分课程设计报告 第一章课程设计内容和要求 2.1问题描述: 迷宫以16*16的矩阵存储在数据文件中(迷宫中的障碍物要占到一定比例),编写非递归的程序,求出一条从入口到出口的路径并显示之(结果若能用C的绘图函数显示更好) 2.2需求分析: 1.要求设计程序输出如下: (1) 建立一个大小为m×n的任意迷宫(迷宫数据可由用户输入或由程序自动生成),并在屏 幕上显示出来; (2)找出一条通路的二元组(i,j)数据序列,(i,j)表示通路上某一点的坐标。 (3)用一种标志(如数字8)在迷宫中标出该条通路; (4)在屏幕上输出迷宫和通路; (5)上述功能可用菜单选择。 2.迷宫的建立: 迷宫中存在通路和障碍,为了方便迷宫的创建,可用0表示通路,用1表示障碍,这样迷宫就可以用0、1矩阵来描述, 3.迷宫的存储: 迷宫是一个矩形区域,可以使用二维数组表示迷宫,这样迷宫的每一个位置都可以用其行列号来唯一指定,但是二维数组不能动态定义其大小,我们可以考虑先定义一个较大的二维数组maze[M+2][N+2],然后用它的前m行n列来存放元素,即可得到一个m×n的二维数组,这样(0,0)表示迷宫入口位置,(m-1,n-1)表示迷宫出口位置。

c++迷宫游戏实验报告

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);//打印地图

栈的应用-迷宫问题-数据结构(C语言版)-源代码(直接运行)

#include #include #include #define STACK_INIT_SIZE 100 #define INCREMENT 10 typedef struct { int r; int c; }zuobiao; typedef struct { int ord; //在当前坐标上的“标号” zuobiao seat; //坐标 int di; //走向下一通道的方向 }lujing; typedef struct { int sz[10][10]; }Maze; typedef struct SqStack { lujing *base; lujing *top; int size; }SqStack; int initStack(SqStack *s) { s->base = (lujing *)malloc(STACK_INIT_SIZE*sizeof(lujing) ); if(!s->base) return -1; s->top = s->base; s->size = STACK_INIT_SIZE; return 0; } int push(SqStack *s, lujing e) {

if(s->top - s->base >= s->size) { s->base = (lujing *)realloc(s->base, (s->size+INCREMENT)*sizeof(lujing)); if(!s->base) return -1; s->top = s->base+s->size; s->size += INCREMENT; } *s->top++ = e; return 0; } int pop(SqStack *s,lujing *e) { if(s->top == s->base) return -1; *e = *(--s->top); return 0; } int isEmpty(SqStack *s) { if(s->base == s->top) return 1; else return 0; } int pass( Maze maze,zuobiao dqzb) { if (maze.sz[dqzb.r][dqzb.c]==1) return 1; // 如果当前位置是可以通过,返回1 else return 0; // 否则返回0 } void footPrint(Maze &maze,zuobiao dqzb) { maze.sz[dqzb.r][dqzb.c]=9; } void markPrint(Maze &maze,zuobiao dqzb) { maze.sz[dqzb.r][dqzb.c]=4; } zuobiao nextPos(zuobiao dqzb, int Dir) {

C语的迷宫小游戏_源代码

C语言编写的迷宫游戏源代码 #include #include #include #include #include #define N 20/*迷宫的大小,可改变*/ int oldmap[N][N];/*递归用的数组,用全局变量节约时间*/ int yes=0;/*yes是判断是否找到路的标志,1找到,0没找到*/ int way[100][2],wayn=0;/*way数组是显示路线用的,wayn是统计走了几个格子*/ void Init(void);/*图形初始化*/ void Close(void);/*图形关闭*/ void DrawPeople(int *x,int *y,int n);/*画人工探索物图*/ void PeopleFind(int (*x)[N]);/*人工探索*/ void WayCopy(int (*x)[N],int (*y)[N]);/*为了8个方向的递归,把旧迷宫图拷贝给新数组*/ int FindWay(int (*x)[N],int i,int j);/*自动探索函数*/ void MapRand(int (*x)[N]);/*随机生成迷宫函数*/ void PrMap(int (*x)[N]);/*输出迷宫图函数*/ void Result(void);/*输出结果处理*/ void Find(void);/*成功处理*/ void NotFind(void);/*失败处理*/ void main(void)/*主函数*/ { int map[N][N]; /*迷宫数组*/ char ch; clrscr(); printf("\n Please select hand(1) else auto\n");/*选择探索方式*/ scanf("%c",&ch); Init(); /*初始化*/ MapRand(map);/*生成迷宫*/ PrMap(map);/*显示迷宫图*/ if(ch=='1') PeopleFind(map);/*人工探索*/ else FindWay(map,1,1);/*系统自动从下标1,1的地方开始探索*/ Result();/*输出结果*/ Close(); } void Init(void)/*图形初始化*/ {

oenglD迷宫 C实现 源代码

o e n g l D迷宫C实现源 代码 集团标准化办公室:[VV986T-J682P28-JP266L8-68PNN]

#include using namespace std; void drawwalls(void); void drawtop(void); void drawball(void); #define IDM_APPLICATION_EXIT (101) #define IDM_APPLICATION_TEXTURE (102) #define IDM_APPLICATION_BANK (103) #define MAZE_HEIGHT (16) #define MAZE_WIDTH (16) #define STARTING_POINT_X ; #define STARTING_POINT_Y ; #define STARTING_HEADING ; float player_x = STARTING_POINT_X ; float player_y = STARTING_POINT_Y ; float player_h = STARTING_HEADING ; // player's heading

float player_s = ; // forward speed of the player float player_m = ; // speed multiplier of the player float player_t = ; // player's turning (change in heading) float player_b = ; // viewpoint bank (roll) static float texcoordX=; int walllist=0; int mazelist=0; int balllist=0; int status=1; bool searchroute=false; bool keystate[4]={false,false,false,false}; char mazedata[MAZE_HEIGHT][MAZE_WIDTH] = { {'H','H','H','H','H','H','H','H','H','H','H','H','H','H','H','H'}, {'H',' ',' ',' ',' ',' ',' ',' ','H',' ',' ',' ',' ',' ',' ','H'}, {'H',' ','H',' ','H','H','H',' ','H',' ','H',' ',' ',' ',' ','H'}, {'H',' ','H','H',' ',' ','H',' ','H','H',' ','H',' ','H',' ','H'},

java课设走迷宫(含代码)

目录1.设计目的 课程设计的目的 2.总体设计 设计思路 设计方法 3.关键技术 4.程序流程 5.主要源代码 6. 运行结果及结论 7. 参考文献

1.设计目的 课程设计的目的 随着科技进步,时代发展,计算机走进了大家的生活。计算机程序强大的功能为使用者提供服务,编程语言也变得越来越流行。 Java 语言是当今流行的网络编程语言,它具有面向对象、跨平台、分布应用等特点。面向对象的开发方法是当今世界最流行的开发方法,它不仅具有更贴近自然的语义,而且有利于软件的维护和继承。 为了进一步巩固课堂上所学到的知识,深刻把握 Java 语言的重要概念及其面向对象的特性,熟练应用面向对象的思想和设计方法解决实际问题的能力,也是为了增加同学们娱乐游戏选择而开发了一个适合学生的,能提升思考力的迷宫冒险游戏,这既锻炼了动手能力,还能进行消遣娱乐,可谓一举两得。 2.总体设计设计思路 根据对游戏系统进行的需求分析,本系统将分为 6 个模块:分别是迷宫 主界面模块、记时设计模块、迷宫设计模块、道路和障碍设计模块、动漫冒险者设计模块、出入口设计模块。实现的功能有:

(1)迷宫的选择 玩家可以根据自身需求来进行选择简单迷宫、中等迷宫、难度迷宫三类中选择一类迷宫进行游戏。 (2)选择道路和障碍的图像 玩家可以根据个人喜好对迷宫中的道路和障碍的图片进行选择,但是图片的格式有规定,必须是“ jpg ”或“ gif ”格式的。 (3)游戏记时 当玩家控制迷宫中的动漫人物进行游戏时,计时器就开始进行记时,直 到动漫人物到达出口时,记时结束,并在屏幕上显示游戏用时。 (4)开始游戏 玩家将鼠标移动至迷宫中的动漫冒险者,即可看到“单击我然后按键盘 方向键”,单击后,游戏开始。玩家即可通过键盘上的方向键进行游戏。 (5)游戏结束 玩家控制动漫冒险者移动至迷宫地图的出口处时,游戏的计时器停止计时,并弹出信息框“恭喜您通关了” ,游戏结束 (6)冒险脚步声 玩家单击动漫冒险者后,便可以用键盘方向键进行控制。动漫冒险者每移动一步便会发出一声“嘟”的响声。

c语言实现迷宫问题

c语言实现迷宫问题集团文件版本号:(M928-T898-M248-WU2669-I2896-DQ586-M1988)

数据结构试验——迷宫问题 (一)基本问题 1.问题描述 这是心理学中的一个经典问题。心理学家把一只老鼠从一个无顶盖的大盒子的入口处放入,让老鼠自行找到出口出来。迷宫中设置很多障碍阻止老鼠前行,迷宫唯一的出口处放有一块奶酪,吸引老鼠找到出口。 简而言之,迷宫问题是解决从布置了许多障碍的通道中寻找出路的问题。本题设置的迷宫如图1所示。 图1 迷宫示意图 迷宫四周设为墙;无填充处,为可通处。设每个点有四个可通方向,分别为东、南、西、北(为了清晰,以下称“上下左右”)。左上角为入口。右下角为出口。迷宫有一个入口,一个出口。设计程序求解迷宫的一条通路。 2.数据结构设计 以一个m×n的数组mg表示迷宫,每个元素表示一个方块状态,数组元素0和1分别表示迷宫中的通路和障碍。迷宫四周为墙,对应的迷宫数组的边界元素均为1。根据题目中的数据,设置一个数组mg如下int mg[M+2][N+2]= { {1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1},

{1,1,0,0,0,1,1,1}, {1,0,0,1,0,0,0,1}, {1,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1} };在算法中用到的栈采用顺序存储结构,将栈定义为 Struct { int i; //当前方块的行号 int j; //当前方块的列号 int di; //di是下一个相邻的可走的方位号 }st[MaxSize];// 定义栈 int top=-1 //初始化栈 3设计运算算法 要寻找一条通过迷宫的路径,就必须进行试探性搜索,只要有路可走就前进一步,无路可进,换一个方向进行尝试;当所有方向均不可走时,则沿原路退回一步(称为回溯),重新选择未走过可走的路,如此继续,直至到达出口或返回入口(没有通路)。在探索前进路径时,需要将搜索的踪迹记录下来,以便走不通时,可沿原路返回到前一个点换一个方向再进行新的探索。后退的尝试路径与前进路径正好相反,因此可以借用一个栈来记录前进路径。 方向:每一个可通点有4个可尝试的方向,向不同的方向前进时,目的地的坐标不同。预先把4个方向上的位移存在一个数组中。如把

闯迷宫游戏代码(VB编程实现)

迷宫游戏源代码 Const row = 22, col = 30 Dim grid(row + 1, col + 1) Private Sub dmg_Click() Picture1.Left = 400 '初始化图片位置 Picture1.Top = 400 Timer1.Enabled = True '启动时钟 End Sub Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) '键盘控制图片移动l = Picture1.Left \ 400 t = Picture1.Top \ 400 Line (l * 400, t * 400)-(400 * (l + 1), 400 * (t + 1)), vbGreen, BF '显示走过的路径Select Case KeyCode '随着键盘的动作来移动 Case vbKeyLeft If Picture1.Left - 400 >= 400 Then If grid(t, l - 1) = 0 Then Picture1.Left = Picture1.Left - 400 Picture1.Top = Picture1.Top End If End If Case vbKeyRight If Picture1.Left + 400 <= 400 * col Then If grid(t, l + 1) = 0 Then Picture1.Left = Picture1.Left + 400 Picture1.Top = Picture1.Top End If End If Case vbKeyDown If Picture1.Top + 400 <= 400 * row Then If grid(t + 1, l) = 0 Then Picture1.Left = Picture1.Left Picture1.Top = Picture1.Top + 400 End If End If Case vbKeyUp If Picture1.Top - 400 >= 400 Then If grid(t - 1, l) = 0 Then Picture1.Left = Picture1.Left Picture1.Top = Picture1.Top - 400 End If End If

数据结构实验-迷宫问题汇总

实验报告 实验课名称:数据结构实验 实验名称:迷宫问题 班级:20130613 学号:16 姓名:施洋时间:2015-5-18 一、问题描述 这是心理学中的一个经典问题。心理学家把一只老鼠从一个无顶盖的大盒子的入口处放入,让老鼠自行找到出口出来。迷宫中设置很多障碍阻止老鼠前行,迷宫唯一的出口处放有一块奶酪,吸引老鼠找到出口。 简而言之,迷宫问题是解决从布置了许多障碍的通道中寻找出路的问题。本题设置的迷宫如图1所示。 入口 出口 图1 迷宫示意图 迷宫四周设为墙;无填充处,为可通处。设每个点有四个可通方向,分别为东、南、西、北。左上角为入口。右下角为出口。迷宫有一个入口,一个出口。设计程序求解迷宫的一条通路。 二、数据结构设计 以一个m×n的数组mg表示迷宫,每个元素表示一个方块状态,数组元素0和1分别表示迷宫中的通路和障碍。迷宫四周为墙,对应的迷宫数组的边界元素均为1。根据题目中的数据,设置一个数组mg如下 int mg[M+2][N+2]= { {1,1,1,1,1,1,1,1}, {1,0,0,1,0,0,0,1}, {1,1,0,0,0,1,1,1}, {1,0,0,1,0,0,0,1}, {1,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1} };在算法中用到的栈采用顺序存储结构,将栈定义为 Struct { int i; //当前方块的行号

int j; //当前方块的列号 int di; //di是下一个相邻的可走的方位号 }st[MaxSize];// 定义栈 int top=-1 //初始化栈 三、算法设计 要寻找一条通过迷宫的路径,就必须进行试探性搜索,只要有路可走就前进一步,无路可进,换一个方向进行尝试;当所有方向均不可走时,则沿原路退回一步(称为回溯),重新选择未走过可走的路,如此继续,直至到达出口或返回入口(没有通路)。在探索前进路径时,需要将搜索的踪迹记录下来,以便走不通时,可沿原路返回到前一个点换一个方向再进行新的探索。后退的尝试路径与前进路径正好相反,因此可以借用一个栈来记录前进路径。 方向:每一个可通点有4个可尝试的方向,向不同的方向前进时,目的地的坐标不同。预先把4个方向上的位移存在一个数组中。如把上、右、下、左(即顺时针方向)依次编号为0、1、2、3.其增量数组move[4]如图3所示。 move[4] x y 0 -1 0 1 0 1 2 1 0 3 0 -1 图2数组move[4] 方位示意图如下: 通路:通路上的每一个点有3个属性:一个横坐标属性i、一个列坐标属性j和一个方向属性di,表示其下一点的位置。如果约定尝试的顺序为上、右、下、左(即顺时针方向),则每尝试一个方向不通时,di值增1,当d增至4时,表示此位置一定不是通路上的点,从栈中去除。在找到出口时,栈中保存的就是一条迷宫通路。

迷宫问题实验报告(c++编写-附源代码)

迷宫问题实验报告 级班年月日姓名学号_ 1.实验题目 以一个mXn的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。 2.需求分析 本程序使用VC编写,实现设定迷宫或自动生成迷宫长方阵表的功能,并且求出一条从指定入口到指定出口的通路,或得出没有通路的结论。 ①输入的形式和输入值的范围: A.输入指定的数字,以此选择迷宫的创建方式,分为手动创建迷宫和自动创建迷宫 B. 输入迷宫阵表的行数和列数,行数和列数不超过40行 C. 手动创建迷宫时,需要输入迷宫结点的通畅和障碍情况,0和1分别表示迷宫中的通路和障碍。 ②输出的形式:输出没有通路的结论,或者输出一个长方阵表,其中路径的每个结点都输出→、↓、←、↑之一,表示从当前结点到下一个结点的方向。 ③程序所能达到的功能:实现设定迷宫或自动生成迷宫长方阵表的功能,并且求出一条从指定入口到指定出口的通路(迷宫的入口指定为坐标为(1,1)的结点,迷宫的出口指定为坐标为(迷宫最大行,迷宫最大列)的结点),或得出没有通路的结论。 ④测试数据: 输入数据: A.出现选择生成迷宫方式的菜单时,输入1(即手动输入数据,生成迷宫); B.输入迷宫的行数和列数,行数输入3,列数输入3; C.输入每个迷宫结点的信息: 0 0 1 1 0 0 1 0 0 输出结果: →↓ 1 1 →↓ 1 0 0 3.概要设计 为了实现上述程序功能,需要定义迷宫的抽象数据类型: typedef struct Maze creat_manual() 初始条件:无 操作结果:手动创建一个迷宫。 B. Maze creat_automatic() 初始条件:无 操作结果:自动创建一个迷宫。

java迷宫小游戏源代码

帮朋友写的迷宫小游戏程序java //作者:LaoCooon import java.awt.Graphics; import javax.swing.ImageIcon; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.event.*; import javax.swing.*; import java.awt.*; class mMaze extends Frame { Color redColor;

Random Random=new Random(); int mapI=Random.getRandom(); MapArray MapArray=new MapArray(); int[] map = MapArray.getMapArray(mapI); static ImageIcon wall= new ImageIcon("wall.jpg"); final ImageIcon tortoise= new ImageIcon("tortoise.gif"); int xl=0,yl=1,speed=30; int x=0,y=1; public mMaze(){addKeyListener(new KeyAdapter(){ public void keyPressed(KeyEvent e){ if(e.getKeyCode()== KeyEvent.VK_UP){ System.out.println("\n Go Up"); if(map[(yl-1)*29+xl]!=1) yl-=1; } else if(e.getKeyCode()== KeyEvent.VK_DOWN){ System.out.println("\n Go Down"); if(map[(yl+1)*29+xl]!=1) yl+=1; } else if(e.getKeyCode()== KeyEvent.VK_LEFT){ System.out.println("\n Go Left"); if(map[yl*29+(xl-1)]!=1) xl-=1; } else if(e.getKeyCode()== KeyEvent.VK_RIGHT){ System.out.println("\n Go Right"); if(map[yl*29+(xl+1)]!=1) xl+=1; } else System.out.println(e.getKeyChar()); if(y==27&&x==28) System.out.println("\n You Win~!"); repaint(); } } ); setSize(890,910); setVisible(true); setLocation(400,200); addWindowListener(new WindowAdapter(){ public void windowClosing(WindowEvent e){ dispose(); System.exit(0); } } ); } public void paint(Graphics g){ g.drawImage(tortoise.getImage(), xl*speed+8, yl*speed+30, null); int i=0,j=0; for ( i = 0; i < 29; i++) for(j=0;j<29;j++) if(map[i*29+j]==1) g.drawImage(wall.getImage(), j*30+8, i*30+30, null); } } public class Maze{ public static void main(String[] args){ new mMaze(); }} 回复 ?2楼 ?2013-05-16 10:34

求解迷宫问题(c语言,很详细哦)

求迷宫问题就是求出从入口到出口的路径。在求解时,通常用的是“穷举求解”的方法,即从入口出发,顺某一方向向前试探,若能走通,则继续往前走;否则沿原路退回,换一个方向再继续试探,直至所有可能的通路都试探完为止。为了保证在任何位置上都能沿原路退回(称为回溯),需要用一个后进先出的栈来保存从入口到当前位置的路径。 首先用如图所示的方块图表示迷宫。对于图中的每个方块,用空白表示通道,用阴影表示墙。所求路径必须是简单路径,即在求得的路径上不能重复出现同一通道块。 为了表示迷宫,设置一个数组mg,其中每个元素表示一个方块的状态,为0时表示对应方块是通道,为1时表示对应方块为墙,如图所示的迷宫,对应的迷宫数组mg如下: int mg[M+1][N+1]={ /*M=10,N=10*/ {1,1,1,1,1,1,1,1,1,1},

{1,0,0,1,0,0,0,1,0,1}, {1,0,0,1,0,0,0,1,0,1}, {1,0,0,0,0,1,1,0,0,1}, {1,0,1,1,1,0,0,0,0,1}, {1,0,0,0,1,0,0,0,0,1}, {1,0,1,0,0,0,1,0,0,1}, {1,0,1,1,1,0,1,1,0,1}, {1,1,0,0,0,0,0,0,0,1}, {1,1,1,1,1,1,1,1,1,1} }; 伪代码:

c语言描述如下: void mgpath() /*路径为:(1,1)->(M-2,N-2)*/ { int i,j,di,find,k; top++; /*初始方块进栈*/ Stack[top].i=1; Stack[top].j=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); //判断当前位置是 否可通

Java课程设计走迷宫

Java语言与面向对象技术课程设计报告 ( 2014 -- 2015年度第1 学期) 走迷宫

目录 目录 ...................................................................................................... 错误!未定义书签。 1 概述.................................................................................................. 错误!未定义书签。课程设计目的 ........................................................................... 错误!未定义书签。课程设计内容 ........................................................................... 错误!未定义书签。 2 系统需求分析 .......................................................................................... 错误!未定义书签。系统目标 ................................................................................... 错误!未定义书签。主体功能 ................................................................................... 错误!未定义书签。开发环境 ................................................................................... 错误!未定义书签。 3 系统概要设计 .......................................................................................... 错误!未定义书签。系统的功能模块划分 ............................................................... 错误!未定义书签。系统流程图 ............................................................................... 错误!未定义书签。4系统详细设计 ........................................................................................... 错误!未定义书签。系统的主界面设计 ..................................................................... 错误!未定义书签。 MAZE的设计.................................................................... 错误!未定义书签。 PERSONINMAZE的设计................................................... 错误!未定义书签。 WALLORROAD的设计 ..................................................... 错误!未定义书签。 MAZEPOINT的设计 ......................................................... 错误!未定义书签。 SOUND的设计 ................................................................. 错误!未定义书签。 RECORD的设计................................................................ 错误!未定义书签。 5 测试........................................................................................................... 错误!未定义书签。测试方案 ................................................................................... 错误!未定义书签。测试结果 ................................................................................... 错误!未定义书签。 6 小结........................................................................................................... 错误!未定义书签。参考文献....................................................................................................... 错误!未定义书签。

迷宫游戏C语言代码讲解

/*迷宫游戏by CDQ*/ /* vc++ 6.0 编译成功 本程序参照网上一个特殊算法随机生成迷宫 该算法优点: 效率高,从入口到出口只有唯一路径,入口出口自己设定 该算法缺点: 宽度高度都必须为奇数,只能生成n*m矩阵迷宫 */ #include #include #include #include #define Height 31 //迷宫的高度,必须为奇数 #define Width 25 //迷宫的宽度,必须为奇数 #define Wall 1 #define Road 0 #define Start 2 #define End 3 #define Esc 5 #define Up 1 #define Down 2 #define Left 3 #define Right 4 int map[Height+2][Width+2]; void gotoxy(int x,int y) //移动坐标 { COORD coord; coord.X=x; coord.Y=y; SetConsoleCursorPosition( GetStdHandle( STD_OUTPUT_HANDLE ), coord ); } void hidden()//隐藏光标 { HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO cci; GetConsoleCursorInfo(hOut,&cci); cci.bVisible=0;//赋1为显示,赋0为隐藏 SetConsoleCursorInfo(hOut,&cci); } void create(int x,int y) //随机生成迷宫 { int c[4][2]={0,1,1,0,0,-1,-1,0}; //四个方向 int i,j,t;

相关文档
最新文档