假期寫了個基於隨機迷宮的遊戲,學習了相關隨機迷宮的生成演算法。
其他演算法都好理解,也很容易寫出來。但就是隨機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...