就給大家看看反正也沒法用的隨機地圖生成器
題圖這張我是跑出了……一條飛龍?
聽說隨機地圖最近在知乎上很火。
一套隨機地圖的生成方案
簡單粗暴的地圖生成
我還遠沒有能耐和以上諸位比,甚至我造的只能說樣子像地圖,但只是一幅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+1if 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中巧用地圖展現數據
※中國為什麼還堅持把以前被割讓的領土標上中文名?