游戲里探索迷宮很好玩,玩多了就沒什么“新”了?
沒錯,如果游戲迷宮差別不大,時間久了就容易熟悉地圖,降低探索的樂趣。
現(xiàn)在,概率編程語言MarkovJunior解決了這個問題:
使用馬爾可夫算法,批量迷宮隨機生成,無一重復。你永遠不知道你玩的下一個迷宮會是什么樣子:
它不僅是一個2D迷宮,還是一個3D迷宮,有幾層地圖,可以隨機生成:
這個項目一出,立刻上了GitHub的熱榜,不到一周就已經收獲了2.6k星。
有網(wǎng)友感嘆,這種編程語言可以直接為RPG游戲或者動作游戲生成建筑。
Keras的作者也對這種概率編程語言相當感興趣:
我們來看看它的原理是什么,如何隨機生成各種迷宮。
基于馬爾可夫算法的構造
據(jù)作者介紹,這套概率編程語言借鑒了馬爾可夫算法。
具體來說,這種概率編程語言由一系列特定的規(guī)則組成,是一個有序列表。
在生成模型的過程中,它會利用馬爾可夫算法實現(xiàn)“隨機生成”,然后制定一系列特定的規(guī)則來確定生成模型的類型,比如迷宮、地形圖或者電路圖。
馬爾可夫鏈具有“無記憶”的性質,即下一個狀態(tài)的概率分布只能由當前狀態(tài)決定,在時間序列中之前的事件與其無關。
那么,這些具體的規(guī)則到底是什么樣子的呢?
例如,最簡單的規(guī)則之一是將“黑色”色塊重寫為“白色”色塊,直到它最終填充整個模型:
例如,通過實現(xiàn)將“白-黑”色塊重寫為“白-白”色塊的規(guī)則,并結合馬爾可夫算法,可以得到一個概率生成模型:
再比如,基于“推箱游戲”的規(guī)則,
推箱子游戲
可以用這批小紅點隨機“運送”白方到指定地點:
像這樣的具體規(guī)則還有很多,都包含在MarkovJunior里面。
那么,我們如何使用這些規(guī)則來生成隨機模型呢?
2D/3D迷宮,可以繪制地形圖和電路圖。
以隨機生成2D迷宮為例:
這樣一個隨機的迷宮,MarkovJunior手邊能做出一把,只基于兩條規(guī)則:
第一個規(guī)則是將“紅-黑-黑”色塊隨機改寫成“綠-綠-紅”色塊。
第二條規(guī)則,當?shù)谝粭l規(guī)則被“卡住”,即沒有符合條件的選項時,自動執(zhí)行,將“紅綠綠”色塊隨機改寫為“白-白-紅”色塊。
這樣,算法可以通過第一條規(guī)則生成隨機路徑,回溯沒有經過的路徑,通過第二條規(guī)則生成分叉,最后遍歷整個黑圖生成一組“2D迷宮”。
有一個更簡單的想法。將所有“白-黑-黑”替換為“白-A-白”,其中A為中間狀態(tài),不作為起點,迷宮生成后替換為白色。
根據(jù)作者的說法,使用這個規(guī)則,一行代碼可以隨機生成2D或3D迷宮。
3D迷宮看起來像這樣
基于這一思想,通過改變規(guī)則組合方法,可以生成隨機地形圖。
比如嘗試生成一個河流地形圖,只需要使用上面的生成模型方法,再加上一些其他的重寫規(guī)則,就可以得出一個隨機的河流圖:
除了地形圖和簡單的2D/三維迷宮,更復雜的三維建筑也可以做。只需要在兩個2D“迷宮”之間的任意位置生成一批“樓梯”:
嗯,連電路圖都能畫出來…
作者認為,只要靈活運用這些規(guī)則,MarkovJunior就可以隨機生成各種建筑和圖片。
可以說非常好用。
著名的WFC算法的作者。
馬克西姆·顧敏,這種概率編程語言的作者,是一個獨立的游戲開發(fā)者。
他做過最著名的項目應該是一套叫“波函數(shù)坍縮算法”的東西。目前,GitHub上有18.7kStars。
這個WFC算法是他受量子力學中“波函數(shù)坍縮”概念的啟發(fā)而創(chuàng)造的,目前已經應用到一些游戲中,比如“小鎮(zhèn)折疊樂”等等。
馬克西姆·顧敏沒有透露更多關于自己的信息,但我們可以在他的主頁上看到,這位大哥自稱“概率模型之王,程序化的一代彌賽亞,馬爾可夫鏈的馴服者……”
從GitHub的角度來看,這些年來,他一直專注于將各種數(shù)學算法應用于程序化生成,做出各種有趣的模型。
可能你玩過的一些游戲已經用上了他開發(fā)的算法。
項目地址:
鄭重聲明:此文內容為本網(wǎng)站轉載企業(yè)宣傳資訊,目的在于傳播更多信息,與本站立場無關。僅供讀者參考,并請自行核實相關內容。