细胞独立于邻居确定的程序迷宫算法



我最近在考虑迷宫算法(主要是因为我正在开发一款游戏,但我觉得这是一个比游戏开发更普遍的问题)。简单地说,我想知道是否有一种迷宫算法可以在没有任何关于细胞邻居的信息的情况下生成(可能是无限数量的)细胞。我想,如果这样的事情是可能的,它将在很大程度上依赖于诸如Perlin或Simplex之类的噪声函数。

每个单元有四堵墙,这些墙在实际渲染迷宫时使用,这样走廊和墙的厚度就不一样了。

比方说,我想要一个(32,15)处的细胞生成它的壁。

我知道像Ellers这样的算法(需要有限的列,但需要无限的行)和虚拟分形迷宫算法(需要知道以前的单元,以便在x和y方向上无限地构建它们)。

有人知道我可以为这个特定的请求研究什么算法吗?如果没有,你知道有什么算法适合基于区块的迷宫吗?

(注意:我确实在StackOverflow上搜索了一下,看看是否有任何问题与我的请求类似,但我没有遇到任何问题。如果你碰巧知道,请提供一个链接:D)

提前谢谢。

查看eeeecreeeets。我的前任很隐秘。但是的,我能理解这种沮丧,所以我会把这个扔给你。如果你不像我那样懒惰,请随时更新PCG Wiki:3

实际上有很多方法可以做到这一点。促性腺激素的一些最佳技术是:

  • 询问您真正想要什么
  • 向后设计。反向播放。结果是向前
  • 看看你的目标目标的随机抽样,试着看看整体模式

但回到问题上来,有两种简单的方法,它们都是从问你真正想要什么开始的。我先给你。

第一个是创建2个层。两者都是随机噪声。连接顶部和底部,使它们完全连接。无隔离部分。这是在问你真正想要的是什么,即连通性。然后在当地的清理步骤中保证。(tbh我忘记了应用于第2层的保证连通性的函数。我找不到代码atm……但我记得这是一个非常简单的本地函数…XOR、Curl或类似的函数。也许你可以在我修复之前弄清楚)。

第二种方法是使用函数的属性。只要你的随机函数足够平滑,你就可以获得梯度并为其分配一个瓦片。分配瓦片的方式会改变迷宫结构,但你可以通过巧妙地为每个梯度选择瓦片来保证连通性(在平滑梯度函数中,类似或相反的梯度更有可能彼此靠近)。从这里开始,你的平滑随机可以是任何形式的佩林噪声,等等。再次询问你想要什么技术。

不幸的是,对于反向反转,你有一个NP问题(我不确定它是否很难、完整,或者我已经研究了一段时间了…)。因此,当你可以生成一个迷宫路径下距离的随机图。然后从那里产生实际的障碍。。。这真的不可取。即使是小迷宫,也要考虑很多不同的情况。。。

012
123
234

很简单。在0的右下角有一个列,中间的2有一个_ |形状的墙。

042
123
234

这个没什么意义。你仍然需要在所有不变的正方形上有和以前一样的基本墙。。。但你不能有那4个。它需要在至少一个邻居的1以内。(我的意思是,你可以用传送带之类的东西来支付+3的费用,但这样我们就摆脱了迷宫般的问题)好吧……

032
123
234

更有道理,但角落里的2又是胡说八道。把它从低谷翻转到顶峰就可以了。

034
123
234

这很有道理。无论如何。如果你能做到这一点,那么看看当地的邻居就会发现墙,如果是+/-1,那么就没有墙了。否则就是墙。还要注意,你可以以一致的方式打破距离图的规则,让迷宫变得很好。(就像不允许一列捡起一堵墙并把它扔起来。这只是在这一点上的循环分裂,应该是安全的)

随机采样是我要研究的最后一个……某些极限迷宫生成算法具有一些有趣的特性,无论是作为平均配置还是经过数百万步。一些形成沃罗诺伊地区。有些形成了带有随机翻转墙壁的同心圆,以允许回路之间的连接。循环一是一个很好的例子。创建一组循环。在每个环上随机翻转一面墙。其中一个将删除一堵墙,该墙将创建对下一个循环的访问权限。一个人将开辟一条道路,并提供一个死胡同和一个延续。要想让随机翻转失败,就必须有一个开口和一个紧挨着的裂缝(除非你允许对角线,否则我们就很好)。所以做循环。每个循环生成随机噪声。X或在一起。如果不允许对角线,则用固定路径替换局部故障。

那么,我们如何获得每个循环的随机噪声呢?或者,我们如何获得比正方形更好的循环?只需取一个随机函数。分离分歧,现在你有了一个循环图。如果你有源随机函数的微分方程,你可以在每个循环中选择一个随机。一种更简单的方法可能是生成同心圆墙,并在每个半径处选择一个随机点进行翻转。然后扭曲最终结果。你必须小心,你的扭曲不会违反任何路径连通性条件。

最新更新