現在的很多遊戲中的地圖一般採用格仔的方式,雖然在表面地圖上無法看到實際的格仔,但是在地圖的結構中專門有乙個邏輯層,這個層和地圖大小相等,劃出很多小的格仔,然後在可以通過的地方使用0表示,在有障礙的且不能通過的地方用1或者其他數字表示(如圖所示)。有了這個邏輯層之後,實際上自動尋路就轉換成了如何在乙個二維陣列中找出一條從邏輯值為0的地點移動到目標的路徑。在尋路之前,我們首先要隨機生成這些地圖。
遊戲中地圖 二維陣列邏輯層
本質上,地圖的障礙邏輯層是由乙個二維陣列儲存的。障礙標記在二維陣列中的資料值以0或者1表示,我們首先需要做的就是隨機產生這樣的二維陣列。當然,最簡單的辦法就是迴圈這個二維陣列,然後在每乙個位置隨機地產生0或者1,但是這種演算法產生的圖形比較難看,並且不一定保證圖中的任意兩點可以相連通。
在隨機生成的迷宮中要求任意兩點,都可以找到一條路徑相通,所以在圖論中可以認為迷宮就是乙個連通圖。產生連通圖的常見方法有克魯斯卡爾和普利姆演算法,這裡我們以普利姆演算法為例實現一下,使用普利姆演算法產生的迷宮比較自然和隨機。
(1)如上圖所示為乙個6x6的迷宮,先假設迷宮中所有的通路都是完全封閉的,黃色的格仔表示可以通過,黑色的格仔表示牆壁或者障礙不能通過。
(2)隨機選擇乙個黃色的格仔作為當前正在訪問的格仔,同時把該格仔放入乙個已經訪問的列表中。
(3)迴圈以下操作,直到所有的格仔都被訪問到。
1.得到當前訪問格仔的四周(上下左右)的格仔,在這些格仔中隨機選擇乙個沒有在訪問列表中的格仔,如果找到,則把該格仔和當前訪問的格仔中間的牆打通(置為0),把該格仔作為當前訪問的格仔,並放入訪問列表。
2.如果周圍所有的格仔都已經訪問過,則從已訪問的列表中,隨機選取乙個作為當前訪問的格仔。
通過以上的迷宮生成演算法,可以生成乙個自然隨機的迷宮、
下面使用**實現乙個r行n列大小的隨機迷宮,r行表示的是剛開始空白格仔的行數,而格仔之間還有牆壁和障礙物,所以最終產生的二維陣列大小實際為2r+1 * 2n+1
1利用上面的演算法我們就可以實現乙個類似於下面的隨機迷宮了。//產生隨機迷宮
2primmaze:function(r,c)315
//中間格仔為0
16for(var i=0;i)
17for(var j=0;j)
1821
return
a;22}23
//處理陣列,產生最終的陣列
24function process(arr)
2531
//定義空單元上下左右偏移
32var offs=[-c,c,-1,1],offr=[-1,1,0,0],offc=[0,0,-1,1
];
33//
隨機從noacc取出乙個位置
34var pos =mathutil.randint(count);
35 noacc[pos]=1;36
acc.push(pos);
37while(acc.length
38
51}
52if(offpos<0)53
57else
58 67}
68}69var a =init(r,c);
70process(a);
71return
a;72 }
AI 隨機迷宮 迷宮求解
本文記錄了,人工智慧中簡單的搜尋策略中的路徑搜尋策略中的a 演算法,來實現迷宮尋路的問題.這只是一次本人的課外作業 完整的程式原始碼已經傳送到我的git.這裡只記錄了我的思路和感想以及收穫.產生隨機迷宮 迷宮求解沒有迷宮怎麼可以呢.而本人是個懶人,每次都要手動輸入迷宮,重複性的工作讓我很不爽.你可以...
隨機生成迷宮
首先初始地圖所有位置均設為障礙牆,然後任意插入乙個牆體進牆佇列 再判斷此時牆體是否可以設定為路 判斷依據 上下左右四個位置是否只有乙個位置是路 若設定為路,則將該位置四周所有的牆插入佇列 若無法設定為路,直接從牆佇列中刪去當前結點所在的節點,若牆佇列不為空,則從佇列中隨機選取一處障礙重新執行,重複以...
Prim迷宮演算法 隨機迷宮生成
最近在學android開發,老師讓我們自己做個應用,我就想做個簡單的roguelike rpg小遊戲。由於要用到迷宮,所以在網上學習了一下prim迷宮演算法,先用c 手擼了乙個簡單的模板。隨機選擇乙個白色格仔 i,j 實際位置為i 2 1,j 2 1 作為當前正在訪問的格仔,同時把該格仔放入乙個已經...