就給大家看看反正也沒法用的隨機地圖生成器

題圖這張我是跑出了……一條飛龍?

聽說隨機地圖最近在知乎上很火。

一套隨機地圖的生成方案

簡單粗暴的地圖生成

我還遠沒有能耐和以上諸位比,甚至我造的只能說樣子像地圖,但只是一幅png,沒有可通行路徑等任何附加功能。

就當買了一盒1000塊(精確地說是36*28=1008)拼圖在家玩吧。

工具:PS(造單元用),Pygame,Numpy庫的矩陣。

一、地牢。

工作原理:

①地圖板分成內圈和外圈,給定起始有效格範圍(限制在內圈裡),給定步數(比如256)。

②每一步,上下左右任選一方向移動1,把該空白格變成有效格(對矩陣元素的操作)。對於已經是有效格的位置那就重複塗抹了。向任一方向移動的概率都是0.25,所以整條路徑往往是在地圖板內打轉轉。如果跑偏太厲害到了邊界,終止整個生成過程。

③檢測每個格的四連通,把相鄰的有效格連起來。

例子:

沒有更複雜的了……

核心代碼:

def crt(i,j):

a=b=15 #矩陣行列範圍是從0到30,15就讓起始位置是正中心

for e in range(i,j):

f=randint(0,3)

if f==0:

b=b-1

if f==1:

a=a+1

if f==2:

b=b+1

if f==3:

a=a-1

if a<1 or a>29: #地圖板31*31

break

if b<1 or b>29:

break

screen.blit(m0,(16+a*32,16+b*32))

d1[a,b]=1

這種用單字母順序命名變數的方式是《Python和Pygame遊戲開發指南》作者Al Sweigart所深惡痛絕、點名批評的,這套代碼搞得比較早我懶得改,現在扳正了。這種習慣等於給未來埋雷,各位也不要學習。

二、小島。

預先做好的單元有16種,

仿照的是War3地圖貼圖,詳見

魔獸爭霸3的自動拼接地形渲染方式 - 斯芬克斯 - 博客園

魔獸爭霸自動地圖元件的繪製原理 - gouki04的專欄 - CSDN博客

工作原理:

①用了其實是62*62的矩陣,每個格2行2列(後來才曉得四元數組可破,甚至普通31階矩陣就可……)。

②關鍵是對於任何一格,將左上格的右下賦予本格左上,左格的右下賦予本格左下,上格的右下賦予本格右上……讓所有交界處的相鄰數據相等。(真的是笨辦法,明明直接調用就好了)

③直接生成的將是均勻的雜點,所以要耍點手段:1.令以中心為圓心、設定值為半徑的圓以外的陸地生成幾率大跌(比如80%幾率,任一陸地的0變成海洋的1)。2. 按設定比例抹除單格孤島和水坑。只要外面一圈數值都相等(0或1),裡面就也變成一樣的。

④再讓部分0變成草地的2,造出比陸地部分更小塊的草地。

例子:

三、黑白世界地圖。

先放單元給大家看,不是所有的都用上了。

可以發現每個格都對應一個八元數組,吸取前次教訓,使用四元數組(下左、下右、右上、右下)足夠了。

這回0是空白,1是有效,我攏共要干這麼幾件事兒:

①放心地隨機生成吧。

②填湖削島,原理和上面不太一樣,如果檢測到了符合條件的格,那麼有一個高几率將四連通統一成陸/海,一個低幾率將再外邊一圈也給統一掉。

③去邊,切四角。讓這八條直線外區間的數值都歸零。

④苦也,這是工作量的大頭!我得讓數值和單元形狀對應上,八元數組可是共有256種可能。我可不會這麼跟自己過不去,乾脆簡併了很多,代價是有些邊界看起來十分超自然。但大體能夠糊弄交差了~

例子:

奇了葩了對吧,捂臉( / ω )

推薦閱讀:

現代地圖方位是上北下南左西右東,而為什麼伏羲八卦方點陣圖剛好相反,他是上南下北左東右西?
如何在ppt中巧用地圖展現數據
中國為什麼還堅持把以前被割讓的領土標上中文名?

TAG:地图 | 游戏 | 编程 |