5

一行代码生成随机迷宫,概率编程语言登 GitHub 热榜,作者曾开发著名 WFC 算法

 1 year ago
source link: https://www.51cto.com/article/710939.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

一行代码生成随机迷宫,概率编程语言登 GitHub 热榜,作者曾开发著名 WFC 算法-51CTO.COM

d695c28155a2e206438dce10d160a13b.jpg
一行代码生成随机迷宫,概率编程语言登 GitHub 热榜,作者曾开发著名 WFC 算法
作者:萧箫 2022-06-07 10:49:32
利用马尔科夫算法,随机生成批量迷宫,没有一个是重复的,你永远也不知道玩到的下一个迷宫长什么样子。

本文经AI新媒体量子位(公众号ID:QbitAI)授权转载,转载请联系出处。

探索游戏中的迷宫很有趣,然而玩多了就没啥“新鲜感”了?

没错,如果游戏迷宫差别不大,时间一久就容易熟悉地图,降低了探索的乐趣。

现在,一个“横空出现”的概率编程语言 MarkovJunior 解决了这一问题:

利用马尔科夫算法, 随机生成批量迷宫 ,没有一个是重复的,你永远也不知道玩到的下一个迷宫长什么样子:

a31d326811884517eef059edd170c91475c9e3.gif

不仅是 2D 迷宫,就连需要搭建好几层地图的 3D 迷宫,也能随机生成:

c7f6887503d4e7ec940665c24da9ccac66de4c.gif

这个项目一出,立刻上了 GitHub 热榜, 不到一周就已经收获 2.6k Star 。

a39589c354bb6ab3c247440633b717f64ec52d.png

有网友感叹,用这个编程语言就能直接给 RPG 游戏或动作游戏生成建筑了。

514e17043087be31004283a006de5652766eb0.png

Keras 的作者也对这个概率编程语言挺感兴趣:

7977d1e136abc3e875e279677313185a8d1700.png

来看看它的原理究竟是什么、又是如何随机生成各种迷宫的。

基于马尔科夫算法构造

据作者介绍,这套概率编程语言借鉴了 马尔科夫算法 (Markov algorithms)。

(MarkovJunior 这个名字,也是以提出马尔科夫算法的数学家 Andrey Markov 命名)

具体来说,这套概率编程语言由一系列特定规则(Rewrite Rules,重写规则)组成,是一个有序列表。

它在生成一个(迷宫)模型的过程中,会利用马尔科夫算法实现“ 随机生成 ”,再通过制定一系列特定规则,决定生成模型的类别,例如是迷宫、地形图,还是电路图等。

马尔科夫链具有“无记忆”性质,即下一状态的概率分布只能由当前状态决定,在时间序列中它前面的事件均与之无关。

所以,这些特定规则究竟长啥样?

例如,一个最简单的规则,就是将“黑色”色块重写为“白色”色块,直到最终填满整个模型:

521d6e163598ce1e1e24899292acb954223062.gif

又例如,执行将“白-黑”色块重写为“白-白”色块的规则,结合马尔科夫算法,就能得到一个概率生成模型:

b98956e068f9e3ef4a16964e8efc58a40e0a4e.gif

再例如,基于“推箱子游戏”的规则,

781fd2833df4d5e29df653b02f0fc1fb54595a.gif

△ 推箱子游戏

就能用这批小红点随机将白色方块“搬运”到指定地点:

e3c9493198a9a4412d753083a4b2cc16c088a9.gif

像这样的特定规则还有很多,都包含在 MarkovJunior 中。

那么,我们究竟要怎么利用这些规则,来生成一个随机(迷宫、电路图等)模型呢?

2D / 3D 迷宫、地形图和电路图都能画

先以随机生成一个 2D 迷宫为例:

d1f9a8162811821ca6c461b945aade9eedde93.gif

从图片中来看,这个迷宫算法会自动生成一个“起始点”红点,在一块黑色地图中随机探索并重写路径,最终填满整个地图,完成一个有始有终、也有分岔口的“迷宫”。

这样的随机迷宫,MarkovJunior 随手就能做出一大把,只需要基于两个规则:

第一个规则 ,将“红-黑-黑”色块随机重写为“绿-绿-红”色块。

d80cc0096e0917165d94030dfcf3314cb3e2de.png

第二个规则 ,在第一个规则被“卡住”,也就是没有符合条件的可选项时,自动执行将“红-绿-绿”色块随机重写为“白-白-红”色块。

d4bb86e25c4856faf0f821781a3c4b5ae040db.png

这样一来,算法就能通过第一个规则生成随机路径,并通过第二个规则回溯还没有经过的路径、生成岔路口,最终遍历整个黑色地图,生成一套“2D 迷宫”。

还有更简单的思路,将所有“白-黑-黑”替换成“白-A-白”,其中 A 是一个中间态,不作为起点,在迷宫生成完成后被替换为白色。

47178aa301741e5fb72770c77ad911beb2256d.gif

据作者表示,利用这个规则, 1 行代码 就能随机生成 2D 或 3D 迷宫。

84dfbaa98fc323e40cd8811896324c225de60e.png

▲ 3D 迷宫长这样

基于这样的思路,换套规则组合方法,还能生成随机 地形图 。

例如,试图生成一块河流地形图,就只需要利用上面的生成模型方法,再添加一些其他的重写规则,就能搞出一个随机河流图来:

f9971d5164e7099ed32811208e861526f23444.gif

除了地形图、简单的 2D / 3D 迷宫,更复杂的 3D 建筑 也能搞定,只需要在两层 2D“迷宫”之间的随机位置生成一批“楼梯”:

a45f9ea07a8faeb537891916d30b4e65062f6b.gif

嗯,连 电路图 都能画……

e12eee0562d639414bd1306f2691ee93fca1e1.gif

据作者介绍,只要灵活运用这些规则,就能用 MarkovJunior 随机生成各种各样的建筑和图画。

720022306509687d5e1989b33a0120c31efd5b.png

可以说是非常好用了。

还是著名 WFC 算法的作者

这个概率编程语言的作者 Maxim Gumin,是一名独立游戏开发者。

b716d4c13c124ff464830899a564f8cde924fb.png

他搞过最有名的项目,应该是一套叫做“ 波函数坍缩算法 ”(WaveFunctionCollapse,WFC)的东西,目前在 GitHub 上已经有 18.7k Stars 。

08f150922882a0e3b7a942c83425509a9c7e13.png

这套 WFC 算法是他受量子力学中“波函数坍缩”概念的启发自创出来的,目前已经被应用到一些游戏中,如《城镇叠叠乐》(Townscaper)等。

259f60d43cf7d0e36a63463a2f1a20ee982b85.png

Maxim Gumin 并未透露更多自己的信息,但我们能在他的主页上看到,这位老哥自称“概率模型之王,程序化生成の弥赛亚,驯服马尔科夫链的人……”(手动狗头)

342cf35755636102e74883abbe3e50e83215b4.png

从 GitHub 来看,这些年他一直专注于将各种数学算法应用于程序化生成中,做出各种有意思的模型。

说不定你玩过的游戏中,有一些已经用过他开发的算法了。

项目地址:

https://github.com/mxgmn/MarkovJunior

b987abc3606b715623d0638504d82523ffa2f0.jpg


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK