3 隨機迷宮生成演示程式

2021-09-09 09:11:49 字數 2059 閱讀 7590

假期寫了個基於隨機迷宮的遊戲,學習了相關隨機迷宮的生成演算法。

其他演算法都好理解,也很容易寫出來。但就是隨機prim,怎麼都寫不對,生成的迷宮亂七八糟的,急死人了

沒辦法只好看別人的,但是又死活看不明白注釋,除錯又不太直觀,只好魔改程式,讓程式顯示構造迷宮過程中各個格仔的狀態。才弄懂明白,原來是隨機廣度優先啊。。。

於是機制的我覺得水上一波

貼上演示程式**

/****************************************

隨機迷宮

演算法:隨機普利姆

1.讓迷宮全是牆.

2.選乙個單元格作為迷宮的通路,然後把它的鄰牆放入列表

3.當列表裡還有牆時

1.從列表裡隨機選乙個牆,如果這面牆分隔的兩個單元格只有乙個單元格被訪問過

1.那就從列表裡移除這面牆,即把牆打通,讓未訪問的單元格成為迷宮的通路

2.把這個格仔的牆加入列表

2.如果牆兩面的單元格都已經被訪問過,那就從列表裡移除這面牆

****************************************/

#include #include #include #include #include#include#include #include using namespace std;

#define m 21// 調節橫距

#define n 31// 調節縱距

#define speed 500//調節演示速度

#define show 1//0表示不顯示過程,1表示顯示過程

vector row;

vector column;

vector direct;

typedef struct point point;

point start,end;

int x_num=1;

int y_num=1;

int a[n+2][m+2];

void gotoxy(int x, int y)//游標控制模組

void color(int b)//顏色控制模組

void init() //wall

} }

void push(int x,int y,int dir)

int ch[4]=;

gotoxy(x*2,y);

printf("%c",ch[dir-1]);

} void addgrid()

if(x_num+1<=m) //down

if(y_num+1<=n) //right

if(x_num-1>=1) //up

if(y_num-1>=1) //left

color(7);

} void showmap() else

gotoxy((j+m)*2+10,i);

if(a[i][j]==2) else

} printf("\n");

} }int main(),,,};

int ch[4]=;

time_t seed;

srand(time(&seed));

while(row.size())

if(j==ran)

printf("%c",ch[direct[j]-1]);

color(7);

}} //sleep(time);

//目標塊座標

x_num=row[ran]+dir[d][0];

y_num=column[ran]+dir[d][1];

//本格仔只能往乙個方向(上,下,左,右選乙個)探索乙個,這個探索的格仔即目標塊

if(a[y_num][x_num]==1)

row.erase(row.begin()+ran);

column.erase(column.begin()+ran);

direct.erase(direct.begin()+ran);

} showmap();

gotoxy(0,n+4);

return 0;

}

對遞迴回溯生成隨機迷宮的演示

回顧 python實現 遞迴回溯 深度優先 構造隨機迷宮 迷茫狗子的秘密基地 csdn部落格 在上次的基礎上稍加改動,可以更加直觀地欣賞整個過程 美中不足的是我想不停地原地輸出並重新整理,可惜找了很多文章都沒能達到理想的效果,希望有大佬有實現過類似的情況可以指點一二 hhh 全部初始化成牆體 sel...

隨機生成迷宮

首先初始地圖所有位置均設為障礙牆,然後任意插入乙個牆體進牆佇列 再判斷此時牆體是否可以設定為路 判斷依據 上下左右四個位置是否只有乙個位置是路 若設定為路,則將該位置四周所有的牆插入佇列 若無法設定為路,直接從牆佇列中刪去當前結點所在的節點,若牆佇列不為空,則從佇列中隨機選取一處障礙重新執行,重複以...

演算法 隨機生成迷宮

演算法原理 從起點開始,隨機選擇乙個方向移動,一直移動到終點,則移動的路徑便是迷宮的路徑。移動過程中要保證路徑不要相交,不要超出邊界,生成效果 public partial class mainform form void btncreateclick object sender,eventargs...