英雄無敵3的隨機地圖是如何實現的?


抖不了機靈發不了雞湯的問題,在現在的知乎不怎麼討好,何況這種問題的技術經驗又是介於程序和策劃中間的「兩不管地帶」,程序認為策劃應該設計演算法,策劃認為這是程序哥哥要想的演算法,我只提供想法。好了,不廢話了,這其實是策劃的活,尤其是數值策劃,大多數值策劃都只會推初中算術的公式,遇到這種題目肯定傻眼,我就來告訴你一些演算法好了:

英雄無敵3的隨機地圖演算法,具體也沒公布,根據經驗分析(我10多年前的遊戲設計經驗分析……)是用柏林雜訊做的。柏林雜訊多用於3D地圖生成起伏不平的隨機地形的,但是如果你利用好這個原理,是可以產生出地形的,核心是在於策劃設計的時候把波形的值域進行一個良好的歸納。我自己在2007年準備做JavaScript頁游的時候深入研究過一下這個演算法,然後模擬英雄無敵做了一些隨機地圖的演算法,結果算出來的效果(自我感覺)比英雄無敵3的還好。

其實算中隨機地圖的演算法有很多,不限於柏林一種,我給你看個鏈接(當然不是我做的):

Polygon Map Generation demo

國外興趣愛好者2010年時候整理的。


按照一般的隨機地圖規則,地圖通常包含以下要素

1、關鍵節點(H3中的城鎮)

2、路徑(H3中也有路徑)

3、門(H3中的地下通道出入口,單雙向傳送門)

4、房間(H3中近似的理解為每個城鎮的佔地範圍)

5、牆(H3中近似的理解為山岩,海等阻擋物)

生成的規則一般是這樣:

1、分布關鍵節點(H3中相當於是先鋪好城鎮)

2、用路徑連接節點(H3中生成城鎮之間的路徑)

3、路徑中設置門

4、在關鍵點周圍填充內容(H3中主要做的就是城鎮周圍的木材與煤礦,以及其他的地點)

5、其他空間填充牆(在H3中比較特殊,如果有海的話,那麼就是先創建海域再生成路)

只是整理了隨機生成地圖的基本思路,拋磚引玉。


既然這裡是策劃和程序兩不管的領域,那我這個懂點策劃懂點程序的兔就不自量力的回答一下吧。

.

我的想法如下:

1.設計一個生態與溫度濕度對應的二維圖,其中每個生態在坐標軸上的面積相近。

2.分別生成溫度和濕度的perlin map,查表確定生態範圍。

3.將biome之間的銜接點用對應地形封死,封死的區域的溫度濕度在每個生態坐標軸圖形上的邊緣區域,記錄下這些對應地形,並隨機創造若干biome之間的入口,保持每個biome之間互相連接。

4.隨機取點作為城鎮,如果距離其它城鎮過近,重新取一個,直到城鎮數量達標。

5.地下也這麼做。

6.隨機取點作為地表地下入口,如果對應的地下區域是無法到達的,重新取一個。直到地表地下入口數量達標。

7.在城鎮距離的一定限度內先放置一個木一個石,並放置守衛。

8.放一些傳送門。由於Perlin noise造成的孤島區域也放置傳送門。

9.根據每個城鎮位置做廣度優先,每個點距離最近的城鎮需要多遠就可以確定了。

10.隨機放置資源、寶物和產出點,並放置守衛。守衛難度根據與城鎮距離決定。

.

另外指出一點問題,高票答案裡面提供的生成器,我看過源碼,Radial方式是通過三角函數確定島嶼邊緣,只能做島嶼,而且形狀上面很容易辨認出模式,它的島嶼必然有一個月牙形狀的陷入區域,和若干小的星形探入海的半島,非常不自然,不實用。

Square和Blob就不用說了,娛樂性質。

.

補充:仔細一想,溫度濕度Perlin可能不太好用,不過還是有保底方法的,取隨機點然後做帶隨機的泛洪染色就行了。


做隨機地圖,一是分層,二是分段,三是兩者結合來用。

分段簡單些,常見於一些跑酷遊戲比如神廟逃亡之類,比如每10秒一段,做若干段落,然後根據一定規則隨機選取再鏈接到一起。

分層就複雜些,比如暗黑2,首先是結構層,預先做好了若干結構體,隨機拼在一起。然後是地表層隨機選取,再然後是裝飾層,比如房間內的瓶瓶罐罐,再然後是對象層,比如符文刷新點,開門機關,比如每張地圖我會布100個固定的符文刷新點,然後只隨機選5個刷,這樣就造成了我隨機在某個地方生成了一個符文的感覺,玩家不把地圖玩個幾百遍是看不出來規律的。

英雄無敵的隨機地圖沒具體研究過,但應該逃不出這兩種方法,或者是兩種結合。


推薦閱讀:

有辦法讓魔獸世界重新煥發生機嗎?
是什麼讓你選擇出國讀遊戲專業?
《紀念碑谷》里有哪些難以發現的細節?
聽說中國各大學的動漫遊戲設計專業很坑,真的嗎?
《塞爾達傳說:荒野之息》對於目前開放世界類遊戲的設計與開發有什麼值得參考和借鑒的地方?

TAG:遊戲 | 遊戲設計 | 英雄無敵HeroesofMight |