標籤:

一套隨機地圖的生成方案

這套方案的雛形來自於Eed Blob Games(Red Blob Games),基礎的完成圖大概是這樣子:

nn

然後,本文介紹的這套方案將會在它的基礎上做一些拓展,目的是生成一塊塊帶有不同地形的地圖,而且每一次生成地圖是有足夠的隨機,同時還會加上一些半島等豐富的變數。

nn

一、方塊生成

nn

首先我們創建一個矩形,這是最基礎的地圖。

nn

然後隨機在矩形內布下若干個點。

nn

從這些點的坐標出發,每個點生成一個多邊形,邊數在3~6之間。

nn

這三步之後,地圖大概是這個樣子:

這一步實際上是隨機把一個大的矩形切割成若干個方塊,接下來的操作則把這些方塊當做是最基礎的元素來進行地圖生成。

二、方塊編號

依照下面的規則來給方塊編號:

最靠近大矩形邊緣的方塊命名為1;

剩下的方塊里,與1相鄰的方塊命名為2;

剩下的方塊里,與2相鄰的方塊命名為3;

……

漸漸把矩形內所有方塊都命名了一個數字,這個數字可以簡單地代表一個方塊距離矩形邊沿有多遠。接下來,會以數字較大的一些方塊作為中心,進行地圖下一步的生成。

三、水域切割

找到數字較大的方塊,假設在第二步里生成了若干個5和6的方塊,那就把所有這些方塊命名為中心方塊。

選擇1個中心方塊,以它作為起點,依次隨機找與它相鄰的、數字編號減一的方塊,如下圖:

如上圖,灰色的就是中心方塊,藍色的就是執行上述步驟後選擇的方塊。

然後隨機取中心方塊作為起點,繼續執行若干次上述的操作:

接著,把所有編號為1的方塊全部命名為水域方塊:

至此,我們就把整個地圖從中心出發,切割出大小不一、方向隨機的水域,同時整個地圖也會被水域包圍,充當地圖邊緣的作用。

四、隨機切割

這一步,我們給地形加一些隨機性。

做法很簡單,隨機在剩餘的非水域方塊里,把1~3個方塊切割出來當做是內陸水域。如果你想整個地圖沒有島嶼,則只需要保證在切割後不會出現一個四周都是水域的方塊即可。切割後如下:

五、地形分布

這時候,我們把整個地圖切割成兩個部分:

一部分是被切割出去當做是水域;

一部分是大陸,而且會被水域分割成多個部分,會有一塊相對中心的區域將它們連接起來。

地形分布一般有兩種做法:

一種是直接按方塊的數字編號來畫等高線,依次分布平原、山丘、高原等地形,這就是文章開頭提到的那兩張示意圖的做法;

另一種則是按照區域來劃分地形,比如把大陸分割成草地、沙漠、森林、雪山等地形。

這裡討論第二種做法。

我們從邊緣出發,在一個隨機區間內取小方塊的數量,這裡假設是[10,12],把每次取得的方塊當成一個集合,稱為一個地形。

依次執行上述的步驟,就可以把整個地圖分割成多個大塊的地形,如圖:

每個顏色就代表一個大的地形塊,這時候就按照地圖的需要來分配具體地形即可。

實際上,如果運算量足夠大,可以把方塊數量顯著提高,可以得到更加平滑的邊緣和多變的大小地形塊。


推薦閱讀:

Ludographics:遊戲機制中的恐怖谷
為什麼RPG網遊很少有在現代世界?
遊戲交互設計做什麼及學習的關鍵性方法,來自網易遊戲交互設計師的圖文分享

TAG:游戏设计 |