C++ 最简单的迷宫

C++ 最简单的迷宫,第1张

这里给你提供2个程序

1.用栈实现迷宫问题求解

2.老鼠走迷宫程序实例

1.用栈实现迷宫问题求解

源程序:

//base.h

#include

#include

#include

#define TRUE 1

#define FALSE 0

#define OK 1

#define ERROR 0

#define OVERFLOW -2

typedef int Status

//stack.h

#include "base.h"

#define INIT_SIZE 100 //存储空间初始分配量

#define INCREMENT 10 //存储空间念袭分配增量

typedef struct{ //迷宫中r行c列的位置

int r

int c

}PostType

typedef struct{

int ord //当前位置在路径上的序号

PostType seat//当前坐标

int di //往下一坐标的方向

}SElemType //栈元素类型

typedef struct{

SElemType* base//栈基址,构造前销毁后为空

SElemType* top//栈顶

int stackSize //栈容量

}Stack//栈类型

Status InitStack(Stack &S){ //构造空栈s

S.base=(SElemType*)malloc(INIT_SIZE *sizeof(SElemType))

if(!S.base)

exit(OVERFLOW)//存储分配失败

S.top=S.base

S.stackSize=INIT_SIZE

return OK

}//InitStack

Status StackEmpty(Stack S){

//若s为空返回TRUE,否则返回FALSE

if(S.top==S.base)

return TRUE

return FALSE

}//StackEmpty

Status Push(Stack &S,SElemType e){

//插入元素e为新的栈顶元素

if(S.top-S.base >=S.stackSize){//栈满,加空间

S.base=(SElemType *)realloc(S.base,(S.stackSize+INCREMENT)*sizeof(SElemType))

if(!S.base)

exit(OVERFLOW) //存储分配失败

S.top=S.base+S.stackSize

S.stackSize+=INCREMENT

}

*S.top++=e

return OK

}/敬明/push

Status Pop(Stack &S,SElemType &e){//若栈不空删除栈//顶元素用e返回并返回OK,否则返回ERROR

if(S.top==S.base)

return ERROR

e=*--S.top

return OK

}//Pop

Status DestroyStack(Stack &S){//销毁栈S,

free(S.base)

S.top=S.base

return OK

}//DestroyStack

//maze.cpp

#include "stack.h"

#define MAXLEN 10//迷宫包括外墙仔稿兄最大行列数目

typedef struct{

int r

int c

char adr[MAXLEN][MAXLEN]//可取’ ’’*’ ’@’ ’#’

}MazeType //迷宫类型

Status InitMaze(MazeType &maze){

//初始化迷宫若成功返回TRUE,否则返回FALSE

int m,n,i,j

printf("Enter row and column numbers: ")

scanf("%d%d",&maze.r,&maze.c)//迷宫行和列数

for(i=0i<=maze.c+1i++){//迷宫行外墙

maze.adr[0][i]=’#’

maze.adr[maze.r+1][i]=’#’

}//for

for(i=0i<=maze.r+1i++){//迷宫列外墙

maze.adr[i][0]=’#’

maze.adr[i][maze.c+1]=’#’

}

for(i=1i<=maze.ri++)

for(j=1j<=maze.cj++)

maze.adr[i][j]=’ ’//初始化迷宫

printf("Enter block’s coordinate((-1,-1) to end): ")

scanf("%d%d",&m,&n)//接收障碍的坐标

while(m!=-1){

if(m>maze.r || n>maze.c)//越界

exit(ERROR)

maze.adr[m][n]=’#’//迷宫障碍用’#’标记

printf("Enter block’s coordinate((-1,-1) to end): ")

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

}//while

return OK

}//InitMaze

Status Pass(MazeType maze,PostType curpos){

//当前位置可通则返回TURE,否则返回FALSE

if(maze.adr[curpos.r][curpos.c]==’ ’)//可通

return TRUE

else

return FALSE

}//Pass

Status FootPrint(MazeType &maze,PostType curpos){

//若走过并且可通返回TRUE,否则返回FALSE

//在返回之前销毁栈S

maze.adr[curpos.r][curpos.c]=’*’//"*"表示可通

return OK

}//FootPrint

PostType NextPos(PostType &curpos,int i){

//指示并返回下一位置的坐标

PostType cpos

cpos=curpos

switch(i){//1.2.3.4分别表示东,南,西,北方向

case 1 : cpos.c+=1break

case 2 : cpos.r+=1break

case 3 : cpos.c-=1break

case 4 : cpos.r-=1break

default: exit(ERROR)

}

return cpos

}//Nextpos

Status MarkPrint(MazeType &maze,PostType curpos){

//曾走过但不是通路标记并返回OK

maze.adr[curpos.r][curpos.c]=’@’//"@"表示曾走过但不通

return OK

}//MarkPrint

Status MazePath(MazeType &maze,PostType start,PostType end){

//若迷宫maze存在从入口start到end的通道则求得一条存放在栈中

//并返回TRUE,否则返回FALSE

Stack S

PostType curpos

int curstep//当前序号,1.2.3.4分别表示东,南,西,北方向

SElemType e

InitStack(S)

curpos=start//设置"当前位置"为"入口位置"

curstep=1 //探索第一步

do{

if(Pass(maze,curpos)){//当前位置可以通过,

//即是未曾走到过的通道

FootPrint(maze,curpos)//留下足迹

e.ord=curstep

e.seat=curpos

e.di=1

Push(S,e) //加入路径

if(curpos.r==end.r&&curpos.c==end.c)

if(!DestroyStack(S))//销毁失败

exit(OVERFLOW)

else

return 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)

//留下不能通过的标记,并退一步

}//while

if(e.di <4){

e.di++//换下一个方向探索

Push(S,e)

curpos=NextPos(e.seat,e.di)//设定当前位置是该

//新方向上的相邻

}//if

}//if

}//else

}while(!StackEmpty(S))

if(!DestroyStack(S))//销毁失败

exit(OVERFLOW)

else

return FALSE

}//MazePath

void PrintMaze(MazeType &maze){

//将标记路径信息的迷宫输出到终端(包括外墙)

int i,j

printf("\nShow maze path(*---pathway):\n\n")

printf(" ")

for(i=0i<=maze.r+1i++)//打印列数名

printf("%4d",i)

printf("\n\n")

for(i=0i<=maze.r+1i++){

printf("%2d",i)//打印行名

for(j=0j<=maze.c+1j++)

printf("%4c",maze.adr[i][j])//输出迷宫//当前位置的标记

printf("\n\n")

}

}//PrintMaze

void main(){ //主函数

MazeType maze

PostType start,end

char cmd

do{

printf("-------FOUND A MAZEPATH--------\n")

if(!InitMaze(maze)){ //初始化并创建迷宫

printf("\nInitialization errors!!!\n")

exit(OVERFLOW)//初始化错误

}

do{ //输入迷宫入口坐标

printf("\nEnter entrance coordinate of the maze: ")

scanf("%d%d",&start.r,&start.c)

if(start.r>maze.r || start.c>maze.c){

printf("\nBeyond the maze!!!\n")

continue

}

}while(start.r>maze.r || start.c>maze.c)

do{ //输入迷宫出口坐标

printf("\nEnter exit coordinate of the maze: ")

scanf("%d%d",&end.r,&end.c)

if(end.r>maze.r || end.c>maze.c){

printf("\nBeyond the maze!!!\n")

continue

}

}while(end.r>maze.r || end.c>maze.c)

if(!MazePath(maze,start,end))//迷宫求解

printf("\nNo path from entrance to exit!\n")

else

PrintMaze(maze)//打印路径

printf("\nContinue?(y/n): ")

scanf("%s",&cmd)

}while(cmd==’y’ || cmd==’Y’)

}//main

2.老鼠走迷宫程序实例

#include "stdafx.h"

#include "iostream.h"

#include "string.h"

#include "stdio.h"

double dMeans=0,dWalkLen=10000//dMeans表示走出迷宫的方法,dWalkLen表示当前走出迷宫最少步数

char Maze[10][52]={

{"###################################################"},

{"% ## #### ### ### # ####"},

{"# ## # ### ### ###### ### ############ # ##"},

{"# ## ## ### ## ## # # ## # # ####"},

{"# ## ## ## ### # # ######### # # # ##"},

{"# # # # ## ########## #### ## ##"},

{"# ## ### ## ## ### #### ##### # ######### #"},

{"# # # ## ## # ## #### # # ######"},

{"#### ## ########## # ### ####@"},

{"###################################################"},

} //迷宫

int MazeFlag[10][51] //迷宫的标志:0表示未走过,i(i=1,2,3,4)表示已经走过了,i表示方向。

int MazeMin[10][51] //路径最小的迷宫的标志

void Walk(int nx,int ny)//走迷宫的函数,nx是列,ny是行

void PrintOut()//打印路径及迷宫的函数,同时比较获取路径较短的行走方法

int Judge(int nx,int ny,int i)//判断在第nx列ny行向第i个方向走是否可以,可以返回1否则返回0。

//i=1表示向右,2表示向下,3表示向左,4表示向上

/*---------------------------------------------------------------------------------------------

//行走迷宫函数: void Walk (int nx,int ny)

//功能:判断是否已经走出迷宫,如果走出则打印路径,如果没有则开始逐个方向判断是否可以行走,

// 如果都不能行走,或已经返回。则退出该位置,即将该位置的标志写为0表明未走过。

//无返回值,形参nx为当前位置的列,ny为当前位置的行。

---------------------------------------------------------------------------------------------*/

void Walk(int nx,int ny)

{

if (Maze[nx][ny]=='@')//判断是否走出迷宫,@是迷宫出口标志

PrintOut() //走出则打印出迷宫及行走路径

else //未走出迷宫

{

for (int i=1i<=4i++)//四个方向逐个行走,i=1向右 2向下 3向左 4向上

{

if (Judge(nx,ny,i)) //如果列为nx行为ny的位置向i方向是否可以行走

{

MazeFlag[nx][ny]=i//将标志位置i表明该位置向i方向可行走

if (i==1) //分散处理,根据不同的i来确定下一步的位置,以便行走。

Walk(nx,ny+1)

else if (i==2)

Walk(nx+1,ny)

else if (i==3)

Walk(nx,ny-1)

else if (i==4)

Walk(nx-1,ny)

}

}

MazeFlag[nx][ny]=0//如果4个方向都走不通,或者回朔则清空该点标志位,置为0表明未走过。

}

}

/*---------------------------------------------------------------------------------------------

//打印函数:void PrintOut()

//功能:打印第dMeans种方法的在迷宫中的行走路径,以及通过比较找出目前行走步数最少的行走方法。

//无返回值,无形参。dMeans表示当前行走方法的种类。dCount是用来计算此种方法用了多少步。

---------------------------------------------------------------------------------------------*/

void PrintOut()

{

int nx,ny

double dCount=0

dMeans++

cout<<"The "<<dMeans<<" ways is: "<<endl

for (nx=0nx<10nx++)

{

for (ny=0ny<51ny++)

{

if (Maze[nx][ny]=='#')//#表示墙

cout<<"#"

else if (MazeFlag[nx][ny]==0)//不是墙但未走过的地方用空格表示

cout<<" "

else //不是墙且走过的地方用*表示

{

cout<<"."

dCount++ //走一步总步数加1

}

}

cout<<endl

}

cout<<"This way used "<<dCount<<" steps"<<endl

if (dCount<dWalkLen)//如果此种方法的步数比以前方法中最少步数还要少,

{ //则将此种方法列为当前最少行走步数

for (nx=0nx<10nx++)

for(ny=0ny<51ny++)

MazeMin[nx][ny]=MazeFlag[nx][ny]

dWalkLen=dCount

}

}

/*--------------------------------------------------------------------------------------------

//判断函数:int Judge(int nx,int ny,int i)

//功能:判断当前位置(nx为列ny为行)向第i方向行走是否可以

//返回值int型 返回1表明可以,0表示不可以

--------------------------------------------------------------------------------------------*/

int Judge(int nx,int ny,int i)

{

if (i==1)//判断向右可否行走

{

if (ny<50&&(Maze[nx][ny+1]==' '||Maze[nx][ny+1]=='@')&&MazeFlag[nx][ny+1]==0)

return 1

else

return 0

}

else if (i==2)//判断向下可否行走

{

if (nx<9&&(Maze[nx+1][ny]==' '||Maze[nx+1][ny]=='@')&&MazeFlag[nx+1][ny]==0)

return 1

else

return 0

}

else if (i==3)//判断向左可否行走

{

if (ny>0&&(Maze[nx][ny-1]==' '||Maze[nx][ny-1]=='@')&&MazeFlag[nx][ny-1]==0)

return 1

else

return 0

}

else if (i==4)//判断向上可否行走

{

if (nx>0&&(Maze[nx-1][ny]==' '||Maze[nx-1][ny]=='@')&&MazeFlag[nx-1][ny]==0)

return 1

else

return 0

}

else

return 0

}

int main(int argc, char* argv[])

{

int nx,ny,ni,nj

cout<<"迷宫游戏: "<<endl

for (ni=0ni<10ni++)//输出迷宫形状,并且找到迷宫的入口,同时将迷宫标志初始化

{

for(nj=0nj<51nj++)

{

cout<<Maze[ni][nj]

MazeFlag[ni][nj]=0//将迷宫标志初始化为0表示未走过

if (Maze[ni][nj]=='%')

{

nx=ni//迷宫入口列坐标

ny=nj//迷宫入口行坐标

}

}

cout<<endl

}

cout<<endl<<"入口坐标:"<<endl<<"nx= "<<nx<<" "<<"ny= "<<ny<<endl

Walk(nx,ny)//调用行走迷宫函数,从入口处开始行走

cout<<endl<<"The MinLen way is: "<<endl

for (nx=0nx<10nx++)//输出最短路径

{

for (ny=0ny<51ny++)

{

if (Maze[nx][ny]=='#')

cout<<"#"

else if (MazeMin[nx][ny]==0)

cout<<" "

else

{

cout<<"."

}

}

cout<<endl

}

cout<<"This Way used "<<dWalkLen<<" steps"<<endl//输出最短路径总行走步数

return 0

}

在微信里。

打开微信,点开发现,点击游戏,在上方搜索“不思议迷宫营地”打开即圆陪可。

《不思议迷宫》一款将Roguelike类策略玩法与RPG养斗铅成相结合的手游。玩家可以选择不同的冈布奥来平衡收益和损耗,灵活运用物理攻击和魔法卷轴斩杀嗜血怪物,挑战橘销蠢强大的Boss,解锁和搜集风格各异的冈布奥。

很简单的。悄兆第一步,打开你女神异闻录的游戏小程序,第二步,点4quest迷宫,进入小程序设置,第迅运扰三步,选择游戏攻略走出迷宫方法,选择按照步骤就解决了。女神异闻录是现亩旦在很流行的。


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8253916.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-14
下一篇2023-04-14

发表评论

登录后才能评论

评论列表(0条)

    保存