所有分类
  • 所有分类
  • 实时新闻

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

萧箫 发自 凹非寺

量子位 | 公众号 QbitAI

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

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

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

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

基于马尔科夫算法构造

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

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

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

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

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

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

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

△推箱子游戏

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

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

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

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

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

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

△3D迷宫长这样

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

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

嗯,连电路图都能画……

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

可以说是非常好用了。

还是著名WFC算法的作者

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

△图源:Steam

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

1行代码生成随机迷宫,概率编程语言登GitHub热榜,WFC作者新作

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

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

项目地址:

https://github.com/mxgmn/MarkovJunior

参考链接:

[1]https://twitter.com/ExUtumno[2]https://github.com/mxgmn/WaveFunctionCollapse[3]https://www.youtube.com/watch?v=DOQTr2Xmlz0[4]https://twitter.com/fchollet/status/1532019171038355456

— 完 —

量子位 QbitAI · 头条号签约

原文链接:https://www.w1ym.com/83171/,转载请注明出处~~~
0

评论0

请先

站点公告

【温馨提示】 本站不建议您对本站支付任何费用或开通任何会员本站99%资源为免费资源只提供共享不提供技术支持,本站资源主要以学习开发为主,本站是为个人资源记录学习研究等情况而建立,如特殊原因下载,需在24小时删除相关资源。本站资源均来自互联网收集或网友分享,若有侵权,请联系站长删除,谢谢。立即查看
显示验证码
没有账号?注册  忘记密码?