聊聊用演算法生成《率土之濱》的世界地圖
作者:王鑫然
首發知乎https://zhuanlan.zhihu.com/p/260771031
之前做戰爭策略遊戲的時候,有過讓大地圖透過演算法隨機生成的想法,但由於各種原因,想法終沒實現。現在剛好有空想想這個問題,做做思路積累。也藉著這篇文章,講講演算法方面的東西。
在傳統的SLG戰爭策略類手遊中,玩家要不斷地探索大地圖,向外擴張領土,擊殺野怪和其他玩家,大世界地圖上哪個地方是草,哪個地方是山,哪個地方是河流,都是手動一個區域一個區域的調出來的, 在《率土之濱》中同樣如此,大地圖的佈局固定,每個伺服器都一樣,導致每個伺服器大地圖上的戰略戰術也一樣。但如果希望每個伺服器的大地圖戰略戰術都不同,用演算法該怎麼去實現這個東西?
演算法要實現的東西
固定的位置模組
在《率土之濱》的初始地圖中,有10多個區域,這些區域之間存在邊界,屬於固定區域。區域間透過固定位置的橋樑或關隘進行連線。區域內部有固定座標的城市、要塞爭奪點。再算發生的大地圖的過程中,要把這些有固定位置設計需求的元素考慮進去。
區域邊緣
如果整張地圖用演算法進行連續運算,生成地貌,那麼在區域的邊界處,可能會出現一座面積龐大且連續的、不可通行的大山,而實際上在區域的邊界處,我們僅僅需要一條細細的河流來分割區域.
地圖模組種類的均衡
《率土之濱》中主要包含兩種地圖模組,一種是資源型地貌模組,一種是不可通行地貌模組,等級越高的資源模組,其分佈越稀疏,數量越少。同等級的幾種資源模組之間的數量需要保持地區分佈均衡。
玩家獲得資源的平衡
如果分佈在不同玩家周圍的資源數量不同,則會拉開前期發展速度的差距,讓一部分玩家輸在了起跑線上,所以演算法應該保證玩家城市生成座標附近,同等級的初始資源上的均衡,這包含數量上的均衡,以及距離上的均衡。
玩家的地區密度
一個地區如果玩家的密度過大,勢必導致遊戲前期,在這個地區內發生的PVP頻率過高,玩家在前期沒有安全穩定發展的公平環境,導致玩家密度高的地區,在遊戲前期的流失率遠高於玩家密度低的地區。
地圖的生成
地圖演算法層
地圖演算法層分為成像層和承載層,成像層用於生成地圖的地貌引數,承載層用於生成玩家真實在遊戲裡看到的地表上的各種物體,承載層內包含有地格層,地表基色層,資源和不可通行層、怪物層等多個演算法層。
基本輪廓生成
地圖輪廓的生成,用到perlin噪聲,perlin噪聲的兩個重要引數是“振幅”和“頻率”,將多個perlin噪聲函式疊加起來後,就可以生成一個連續且更加自然的函式影像。
應用在空間直角座標系後的影像大概是這樣。
在一些戰爭策略類遊戲中,大地圖可能被設計成整片的海洋,陸地則被設計成孤島,這個時候可以利用“種子生長”,從一點開始向外展開陸地。
山脈、河流、草地的定義和生成
在《率土之濱》裡,地形塊以格為單位,分為資源地塊(平原)、山脈地塊、河流地塊,這三種基本地塊(其他地塊型別自行腦補),透過高度的定義,我們可以將perlin噪聲所生成的影像下的地塊,定義為這3種型別,如在空間直角座標系中,我們將Z≥2的稱為山脈,0<Z<2稱為資源地塊,將Z≤0的稱為河流地塊。以此定於地塊。
遊戲裡為了讓玩家對不同地塊有更加清晰的認知,通常會用形狀相同的素材來表示一類東西,比如山脈的形狀都一樣,頂多分幾個不同的素材來表示山脈,所以真實遊戲裡生成的大概是這樣。
區域的劃分
在2維座標中,在X軸上劃定一個區域,就可以規定一個函式影像的範圍,在空間直角座標系中,用一個矩形就可以劃定一個區域,無數個形狀不同的矩形疊加在一起,則可以劃定一個形狀不規則的區域,函式的影像則在這個區域內生成
區域邊緣的處理
規定區域的邊緣為山脈地形塊或河流地形塊,並從這個地形塊開始向外隨機延伸地形塊,延伸的地形塊數值為0到3,對每一個隨機值設定一個權重,如果想讓地圖邊界附近有更多的山脈包圍,則可以讓3的權重更大,如果想讓地圖邊界附近有更多的可通行區域,可以讓0的權重更大。數值代表向邊界外延伸多少個不可通行的地形塊。地形塊的型別以邊界上的地形為基準進行對映,比如邊界是河流的,則附近延伸的地形對應為山脈。
固定點的處理
《率土之濱》裡的城市、要塞,屬於固定點,這些點周圍的區域要保持為可通行的資源地塊狀態,所以perlin噪聲所生成的高低起伏的影像,不應該影響到這裡的地形。在空間直角座標系中,如果要形成一個高低起伏的地形,則先要給矩形網格中的點,隨機生成一個單位圓梯度,再用方向向量與網格點的梯度向量做點積,最後對單個矩形四個點進行加權,得到該計算點的數值,使得數值在區域內平緩過渡,從而繪製出噪聲圖譜,如果不希望一個區域有高低起伏,可以直接控制這個區域內網格點向量的角度。
“回”型區域的識別
在中間是可通行區域,周圍是不可通行區域的地形稱為“回”字型區域,回字型區域可以偶爾出現,但數量一多,就說明生成的地圖是有問題的,回字型區域的數學特點是——中間地塊沒有路徑通向到所有的關鍵點(關鍵點可以取關隘),用“廣度優先搜尋”演算法可以表示出路徑可通行狀態和路徑長度。
“桶”型區域的識別
這種地形的數學特點是——中間的點與其相鄰的“筒壁”上的點,距離關鍵點的距離差很大,用“廣度優先搜尋”演算法計算出每一個點距離每一個關隘的距離,根據連續多個點的距離差的大小,可以識別這種地形。
資源地塊的分佈
如果資源地塊的距離過近,就會在某個地方形成資源田的聚集,導致這個區域的PVP壓力增大,《率土之濱》的外圍州,屬於初始區域,這個區域中,玩家要進行前期的發展,需要更加和平穩定的資源採集環境,所以要均衡這些地區的資源分佈,可以利用“泊松圓盤”來構建這種分佈。
用“米切爾最佳候選”演算法,可以近似的構建“泊松圓盤”,這種演算法是從一堆候選取樣點中選取一個最佳取樣點。做法是,第一輪先撒一堆點,這個點稱為“已固定取樣點”,之後在取樣區域內隨機生成固定數量的“候選取樣點”。在“已固定取樣點”和“候選取樣點”之間畫一條線,線段長度記為M,最終從“候選取樣點”中選出一個M值最大的點,作為“最佳候選取樣點”。第一輪結束後,“最佳候選取樣點”被標記為“已固定取樣點”,之後繼續下一輪,不斷迴圈,直到充滿整個樣本地圖。
最終選出一堆“已固定取樣點”,作為資源分佈點,不同等級的資源點則在資源分佈點中按照給定比例隨機分佈。
玩家分佈
在《率土之濱》中,玩家的初始城市會佔掉地面3*3的格,所以玩家之間初始城市中心座標的最小地塊直線距離是5格(沒有半格的概念,中間留一格為了美觀)。以任意玩家的城市中心點為中心,直徑為5,畫一個圓,也就是說,在這個圓內不能出現其他玩家的初始城市座標。
同時,需保證每名玩家初始城市周圍的資源數量保持一定範圍內的均衡,在《率土之濱》中,資源地塊的數量遠遠大於玩家的數量,所以可以利用已選出的“資源分佈點”,取樣出所有臨近點之間距離大於等於5的點,作為玩家初始城市座標的生成樣本。
原文:https://zhuanlan.zhihu.com/p/260771031
相關文章
- 【遊戲試玩】率土之濱,啟動。率土之濱,關閉。遊戲
- 從《率土之濱》聊聊遊戲節奏時間管理遊戲
- 從率土之濱到三棋——率土like淺談
- 《率土之濱》的遊戲設計,如何讓玩家產生羈絆遊戲設計
- 《率土之濱》高流水的背後祕訣:商業模式與系統分析模式
- 上線快4年的《率土之濱》,靠什麼實現了逆勢起飛?
- 從總體角度演繹真實戰爭,《率土之濱》重新定義SLG戰爭形態
- 誰敢想,《率土之濱》竟把《三國志》作者“請”到了網易520現場
- SLG賽道首創!《率土之濱》家族系統引領品類展開“社交”新思考
- 戰火重燃,征程再起!網易遊戲學院X《率土之濱》高校原畫大賽正式開啟遊戲
- 拒絕刻板思維綁架內容設計,《率土之濱》開啟“去臉譜化”新思考
- “人均漢語言碩士”的《率土之濱》,這次又想借一個新玩法盤活“內容生態”
- 繪六藝君子,築三國風骨,網易遊戲《率土之濱》高校原畫大賽正式開啟遊戲
- 30張地圖 30個世界《坦克世界》1.0地圖旅遊指南地圖
- 開放世界地圖設計的秘訣:圖示的多維應用地圖
- 聊聊excel生成圖片的幾種方式Excel
- TNW:社交網路世界地圖TNW地圖
- 牛津網際網路研究所:2015年全球網際網路“世界地圖” 中國“領土”最大地圖
- 《塞爾達傳說:荒野之息》的大世界地圖是怎麼製作的?地圖
- DEDECMS之六網站地圖、RSS地圖網站地圖
- 百度地圖之基礎地圖地圖
- JRPG開放世界地圖的標杆,《異度神劍》系列地圖設計的祕訣地圖
- 聊聊缺陷逃逸率
- 【雲圖】一鍵生成連鎖店品牌地圖地圖
- 聊聊人像摳圖背後的演算法技術演算法
- MapSCII:在終端顯示世界地圖地圖
- Python Pygal繪製世界人口地圖Python地圖
- LOOK 直播活動地圖生成器方案地圖
- uniapp 高德地圖 sha 生成方法APP地圖
- 聊聊缺陷收斂率
- 劍氣之爭,聊聊演算法崗位的門戶之見!演算法
- Authagraph世界地圖:讓地球能看得更準確地圖
- 世界先得真實,開放地圖才有意義地圖
- 用HMS Core地圖服務自定義地圖樣式,給你的應用製作專屬個性化地圖地圖
- 演算法與資料結構之帶權圖與圖最小生成樹演算法資料結構
- 《艾爾登法環》如何效率化、自動化地構築宏大的開放世界地圖?地圖
- 數字孿生智慧物流之 Web GIS 地圖應用Web地圖
- 地圖匹配演算法實踐地圖演算法