Prim迷宮演算法 隨機迷宮生成

2021-08-20 04:00:05 字數 1651 閱讀 1920

最近在學android開發,老師讓我們自己做個應用,我就想做個簡單的roguelike rpg小遊戲。由於要用到迷宮,所以在網上學習了一下prim迷宮演算法,先用c++手擼了乙個簡單的模板。

隨機選擇乙個白色格仔[i,j] (實際位置為i*2+1,j*2+1)作為當前正在訪問的格仔,同時把該格仔放入乙個已經訪問的列表中。

迴圈以下操作,直到所有的格仔都被訪問到:

1.搜尋當前訪問格仔的四周(上下左右)的格仔,在這些格仔中隨機選擇乙個未訪問的格仔,如果找到,則把該格仔和當前訪問的格仔中間的牆打通(置為1,因為初始化0比較簡單),並把該格仔作為當前訪問的格仔,並放入訪問列表。

2.如果周圍所有的格仔都已經訪問過,則從已訪問的列表中,隨機選取乙個作為當前訪問的格仔。

注意:這種情況可能是死點,為了防止死點,我們可以把它與周圍可相連的牆都打通。為什麼不隨機打通一面牆呢,因為如果打通1面牆可能出現自環的情況,仍然無法完全相連,所以為了謹慎起見,我選擇全打通。

#define size 21 //奇數,代表迷宮總大小,可修改

#define bug puts("hello\n")

using

namespace

std;

struct node

node(int x,int y):x(x),y(y){}

};int maze[size][size];

vector

maze;//用於隨機取點

node move[4]=;//上下左右移動

int rand(int t)

void init()

}}node randnode()

int findway(node a)

temp.push_back(i);

}if(temp.size()==0)

//如果是死點,則生成乙個2*2的房間與周圍相連,為個人優化

for(int i=0;i<=1;i++)} }

return -1;

} else

return temp[rand(temp.size())];

} void erase(node t)

else l=temp;

}node lt=maze[l];

maze.erase(maze.begin()+l);

}void generate()

}}void print()

}int main()

使用prim演算法生成隨機迷宮

三 prim演算法和迷宮生成 1.我們將迷宮定義如下 迷宮由道路和牆組成,且迷宮中道路上的任意兩點應互相可達 2.隨機迷宮生成演算法一般有以下三種,這裡只介紹隨機prim演算法 最小生成樹 在帶權圖g v,e 中 v為點集,e為邊集且每條邊帶有權值 我們希望找到e的乙個無環子集t,使得v中任意兩點可...

演算法 隨機生成迷宮

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

隨機生成迷宮

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