用C語言寫簡單的走迷宮遊戲?

時間 2021-10-25 09:16:56

1樓:啦啦啦小強

1、非遞迴方法

迷宮用陣列M[x]][y]表示,利用鏈棧儲存迷宮的路徑,從起始點開始壓入棧中,設方向為1向下走,令下一位置為當前位置,判斷當前位置是否為終點,若是,則退出返回1;否則,繼續判斷當前位置是否能通過,若能,繼續向下走;否則,令方向加1,在判斷,若方向加為4還是不能通過,則標誌當前位置不能通過,弾棧。(迷宮的得出利用隨機函式srand)

#include

#include

#include

#include

#define MAX 20

using namespace std;

typedef int Maze[MAX][MAX];

typedef struct

int x;//橫座標

int y;//縱座標

}PoseType;

typedef struct

int ord;//序號

PoseType seat;//座標

int di;//方向

}SElemType;

typedef struct SNode

SElemType data;

struct SNode *next;

}SNode,*SqStack;//鏈棧型別

bool InitStack(SqStack &S);

bool StackEmpty(SqStack S);

void Pop(SqStack &S,SElemType &e);

void Push(SqStack &S,SElemType e);

void CreatMaze(Maze &M,int m,int n);

void PrintMaze(Maze M,int m,int n);

bool MazePath(Maze &M,PoseType Start,PoseType End,SqStack &S);

void MarkPrint(Maze &M,PoseType P);

void PopPrint(SqStack S);

void NextPos(PoseType &curpos,int a);

bool Pass(Maze M,PoseType P);

void Creat(Maze &M,PoseType S,PoseType E,int m,int n);

void PrintMaze(Maze M,int m,int n);

bool InitStack(SqStack &S)

S=(SqStack)malloc(sizeof(SNode));

if(!S)exit (1);

S->next=NULL;

return 1;

}//初始化棧

bool StackEmpty(SqStack S)

if(S->next==NULL)return 1;

else return 0;

}//棧是否為空

void Pop(SqStack &S,SElemType &e)//弾棧

if(S->next==NULL)return;

SNode *p=S;

e=S->data;

delete p;

S=S->next;

void Push(SqStack &S,SElemType e)

SqStack q;

q=new SNode;

q->data=e;

q->next=S;

S=q;

}//壓棧

void CreatMaze(Maze &M,int m,int n)

srand((unsigned)time(NULL));

int i,j;

cout<<"輸入0表示無障礙,輸入1表示當前位置有障礙"

i=0;

if(i==0)

for(j=0;jM[i][j]=1;

i=m-1;

if(i==m-1)

for(j=0;jM[i][j]=1;

j=0;

if(j==0)

for(i=0;iM[i][j]=1;

j=m-1;

if(j==m-1)

for(i=0;iM[i][j]=1;

}//建立迷宮

void Creat(Maze &M,PoseType S,PoseType E,int m,int n)

int i=1,j=1;

for(i=1;iwhile(M[i][j]==1)

j++;

if(j==n-1)

M[i][S.y]=0;M[E.x][j-1];}

for(j=1;jwhile(M[i][j]==1)

i++;

if(i==m-1)

M[S.x][j]=0;M[i-1][E.y];}

void PrintMaze(Maze M,int m,int n)

system("color 5F");

//system("clear.exe")

int i=0,j;

for(i=0;ifor(j=0;jcout

void FootPrint(Maze &M,PoseType curpos)

M[curpos.x][curpos.y]=2;

bool MazePath(Maze &M,PoseType Start,PoseType End,SqStack &S)

int curstep,i,j;

SElemType T;

PoseType curpos;

InitStack(S);

curpos=Start;//將起始位置壓棧

curstep=1;

doif(Pass(M,curpos))

FootPrint(M,curpos);

T.ord=curstep;

T.seat=curpos;

T.di=1;

Push(S,T);

if(T.seat.x==End.x&&T.seat.y==End.y)return 1;//到終點則返回

NextPos(curpos,1);//1為向下走

curstep++;

else

if(!StackEmpty(S))

Pop(S,T);

while(T.di==4&&!StackEmpty(S))

MarkPrint(M,T.seat);//標記不能通過

Pop(S,T);

if(T.di<4)

T.di++;//轉變方向

Push(S,T);

curpos=T.seat;

NextPos(curpos,T.di);

}while(!StackEmpty(S));

return 0;

void PopPrint(SqStack S)

while(!StackEmpty(S))

cout<<"("

S=S->next;

void NextPos(PoseType &curpos,int di)//下一步

if(di==1)curpos.x++;//1為向右走

else if(di==2)curpos.y++;//2為向下走

else if(di==3)curpos.x--;//3位向左走

else if(di==4)curpos.y--;//4為向上走

void MarkPrint(Maze &M,PoseType P)

M[P.x][P.y]=1;

}//上下左右都不能通過標誌為1

bool Pass(Maze M,PoseType P)

if(M[P.x][P.y]==0)return 1;

else return 0;

}//是否能通過

int main()

Maze M;

PoseType Start,End;

SqStack S;

int MAX1,MAX2,a;

cout<<"The longth is:";

cin>>MAX1;//迷宮的長

cout<<"The width is:";

cin>>MAX2;//迷宮的寬

CreatMaze(M,MAX1,MAX2);

// PrintMaze(M,MAX1,MAX2);

Start.x=1;Start.y=1;

cout

End.y=MAX2-2;

Creat(M,Start,End,MAX1,MAX2);

M[Start.x][Start.y]=M[End.x][End.y]=0;

PrintMaze(M,MAX1,MAX2);

if(MazePath(M,Start,End,S)==0)cout<<"沒有通路!";

else PopPrint(S);

return 0;

2、遞迴實現方法

迷宮用陣列M[x]][y]表示,將每乙個能通過的陣列都記為步數,設定乙個關於方向的for迴圈,設定當前位置為起始位置,用for迴圈控制指向下一位置,若下一位置可通過且不是終點,則遞迴呼叫這個函式,若下一位置不可通過,則方向加1繼續進行,直到走到終點為止。

#include

#include

#define MAX 20

void PrintPath(int x,int y,int curstep);

typedef int MazeType[MAX][MAX];

struct PosType

int x; // 行值

int y; // 列值

struct PosType end; // 迷宮終點位置

MazeType m; // 迷宮陣列

int x, y; // 迷宮行數,列數

// 定義牆元素值為1,可通過路徑為0,通過路徑為足跡

// 輸出解

void Print(int x,int y)

int i,j;

for(i=0;ifor(j=0;jprintf("%3d",m[i][j]);

printf("\n");

printf("\n");

void PrintPath(int x,int y,int curstep)

int i,j,c=1;

while(c<=curstep)

for(i=1;ifor(j=1;j

if(m[i][j]!=0&&m[i][j]!=1)

printf("(%d,%d,%d)",i,j,curstep);

c++;

// 由當前位置cur、當前步驟curstep試探下一點

void MazePath(struct PosType cur,int curstep,int MAX1,int MAX2)

int i;

struct PosType next; // 下乙個位置

// struct PosType direc[4]=,,,};

// 移動方向,依次為東南西北

for(i=0;i<=3;i++) // 依次試探東南西北四個方向

next.x=cur.x+direc[i].x;

next.y=cur.y+direc[i].y;

if(m[next.x][next.y] == 0) // 是通路

m[next.x][next.y]=++curstep;

if(next.x != end.x || next.y != end.y) // 沒到終點

MazePath(next,curstep,MAX1,MAX2); // 試探下一點(遞迴呼叫)

else

PrintPath(MAX1,MAX2,curstep);

//Print(x,y); // 輸出結果

m[next.x][next.y]=0; // 恢復為通路,試探下一條路

curstep--;

// 0為牆,-1為通道

int main()

struct PosType start; //起點

int i,j,x1,y1;

printf("請輸入迷宮的行數,列數(包括外牆):(空格隔開)");

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

for(i=0;ifor(j=0;jm[i][j]=1;

printf("請輸入迷宮通道個數:");

scanf("%d",&j);

if(j)

printf("請依次輸入迷宮內通道每個單元的行數,列數:(空格隔開)\n");

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

scanf("%d%d",&x1,&y1);

m[x1][y1]=0;

printf("迷宮結構如下:\n");

Print(x,y);

printf("請輸入起點的行數,列數:(空格隔開)");

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

printf("請輸入終點的行數,列數:(空格隔開)");

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

m[start.x][start.y]=1;

MazePath(start,1,x,y);// 由第一步起點試探起

return 0;

C 語言中如何盡量簡單地用 while 語句求 1 到 10 的階乘?

如果你的模數不是質數的話,請先拆成質數的整次冪。然後對於每乙個整次冪,用 exLucas 裡面提到的遞推方法解出在這一整次冪下的階乘結果。隨後只需要用 CRT 合併即可。由於題主沒有貼出模數,所以我沒法寫出更詳細的過程。 靜水流深MXY include intmain return0 墨黎 whil...

為什麼我用c 寫的遊戲那麼簡陋?

亂世 以前我也是這樣的,蹭著現在可以先接觸一下遊戲引擎方面的知識,現在主流的遊戲引擎是unity,適合做手機遊戲,單機遊戲,網路遊戲,指令碼語言為c 優點是學習簡單相對而言,對電腦效能要求低,手遊方面是主流,全平台遊戲都可以做。還有一些比較有名的遊戲引擎UE4,cocos creater。 泰勒柯西...

怎麼用c語言寫乙個檔案標籤系統?有什麼思路嗎?

索特127 如果你需要編寫乙個給檔案分類的軟體的話,這個思路可能會幫到你 我講的是實現乙個在CLI下良好執行的檔案分類軟體,而不是在GUI的檔案管理器上執行 注意,這個思路並不能在沒有完整POSIX支援的Windows上完美實現 你需要實現乙個hash table,通過檔案路徑可以索引到乙個檔案及其...