游戲常用算法-四種迷宮生成算法


 
        

簡介

所謂迷宮生成算法,就是用以生成隨機的迷宮的算法

迷宮生成算法是處於這樣一個場景:

  • 一個row行,col列的網格地圖,一開始默認所有網格四周的牆是封閉的

  • 要求在網格地圖邊緣,也就是網格的邊上打通2面牆

  • 所有網格都至少保證網格周圍至少有一堵牆打通

  • 所有網格都能通過打通的牆能形成一條通路

博主已實現RecursiveBacktracking(遞歸回溯),RecursiveSegmentation(遞歸分割),隨機Prim算法,Kruskal+並查集四種迷宮生成算法,這篇文章主要對這四種算法進行簡要的介紹

基於Unity的迷宮生成算法代碼實現

Github鏈接

遞歸回溯算法

復雜度

  空間:O(n),時間:O(n),n為迷宮節點數row*col

原理

以一個棧作為輔助的數據結構,用以記錄打通區域的順序,用以回溯

一開始隨機在地圖中選擇一個區域,加入棧。

之后在之前選擇的區域周圍隨機選擇一個未打通的區域,將新選擇的區域和之前選擇區域的牆打通,並把新的區域的加入棧

如果四周的區域都打通,就讓棧出棧,將當期所選擇的區域設置棧新的棧頂,表示回退到上一個區域

之后遞歸的按之前的步驟選擇下一個區域直到所有區域都被打通

缺點

這種算法實現思路極為簡單,但通路過於明顯,甚至有可能會出現上圖中的迷宮,很尷!!!

遞歸分割算法

復雜度

  遞歸空間復雜度:O(row * col),最好時間復雜度:O(lgrow + lgcol),最壞時間復雜度O(row * col)

原理

將矩形地圖用十字分成四個小矩陣

在四個小矩形相鄰的四個面上各隨機打通一面牆,使通路導通。

然后對所有小矩形重復之前分割操作

如果矩陣已經無法分割了,也就是行數或列數為一時,就將矩陣內部的牆全部打通

優缺點

生成的迷宮有明顯的矩形成分,不自然,適合簡單如FPS,ACT等游戲

隨機Prim算法

復雜度

  空間:O(row*col),時間:O(牆數=(row-1)*col+row*(col - 1)) 

原理

隨機選擇一個區域作為當前區域

將區域四周未打通的牆加入列表中

while(列表不為空)

  隨機從列表選擇一面牆

如果牆兩邊區域存在一區域未被打通,就打通這面牆,並將這面牆兩邊區域附近未打通的牆加入列表

從列表中移除這面牆

優缺點

自然的迷宮,很難走,適合真正的迷宮游戲

Kruskal+並查集

復雜度

  空間:O(row*col),時間:O(牆數=(row-1)*col+row*(col - 1)) 

原理

這個算法巧妙的使用了並查集,運用並查集判斷整個迷宮的導通問題

 

把所有牆加入牆列表中

while(牆列表不為空)

  隨機從牆列表選擇一堵牆,用並查集判斷牆兩邊區域是否導通

不導通就打通這堵牆

從牆列表中移除這堵牆

參考鏈接

三大迷宮生成算法

隨機迷宮生成算法(並查集+生成樹)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM