具有独立于邻居的单元确定的程序迷宫算法

时间:2017-10-20 19:30:06

标签: algorithm infinite maze chunks

我最近在考虑迷宫算法(主要是因为我正在开发游戏,但我觉得这是一个比游戏开发相关的更普遍的问题)。简单来说,我想知道是否有一种迷宫算法可以生成(可能无限数量)的单元格,而没有任何关于单元格邻居的信息。我想,如果这样的事情是可能的,它将严重依赖于Perlin或Simplex等噪声函数。

每个单元格有四个墙,这些墙在实际渲染迷宫时使用,因此走廊和墙壁的厚度不同。

让我们说,例如,我想在(32,15)的一个单元格中生成它的墙。

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

有没有人知道我可以针对此特定请求查看的任何算法?如果没有,是否有任何算法适合你知道的基于块的迷宫?

(注意:我确实通过StackOverflow搜索了一下,看看是否有任何与我的类似请求有任何问题,但我没有遇到任何问题。如果您碰巧知道一个,那么链接将非常感激:d)

提前谢谢。

1 个答案:

答案 0 :(得分:0)

Seeeeeecreeeets。我的preeeecioouss分泌物。但是,是的,我可以理解挫败感,所以我将把这个丢给您OP / SO。如果您不像我这样懒惰,请随时更新PCG Wiki:3

实际上有很多 方式可以做到这一点。 procgen的一些最佳技术是:

  • 询问您真正想要的东西。
  • 向后设计。反向播放。结果是转发。
  • 查看目标目标的随机样本,并尝试查看整体模式。

但是要回到问题上,有两种简单方式,它们都从询问您真正想要什么开始。我先给那些。

首先是创建2层。两者都是随机噪声。您连接顶部和底部,使它们完全连接。没有孤立的部分。这是在问您真正想要的是哪个连接性。然后在本地清理步骤中保证它。 (tbh我忘记了应用到第2层的保证连接性的函数。我找不到代码atm。...但是我记得它是一个非常简单的局部函数... XOR,Curl或类似的东西。也许您可以在解决此问题之前弄清楚它。)

第二种方法是使用函数的属性。只要您的随机函数足够平滑,就可以采用渐变并为其分配一个图块。分配图块的方式会更改迷宫结构,但可以通过为每个渐变明智地选择图块来保证连通性(在平滑渐变函数上,b / c相似或相反的渐变更可能彼此靠近)。从这里开始,您的平滑随机可以是任何形式的Perlin Noise等。再次询问您想要什么技术。

不幸的是,对于后退用户,您会遇到NP问题(我不确定这是困难,完整还是自从我从事此工作以来已经有一段时间了……)。因此,当您可以生成沿迷宫路径的随机距离图。然后从那里产生实际的障碍...这不是真正可取的。即使是小的迷宫,在不同情况下也需要大量考虑...

 012
 123
 234

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

042
123
234

这没有什么意义。在所有未更改的正方形上,仍然需要您具有与以前相同的基本墙...但是您不能拥有4。它必须在至少一个邻居的1个范围内。 (我的意思是,如果有一条像传送带之类的东西,您可能需要为那个广场增加+3的成本,但是那样我们就不会迷宫了。)好的。...

032
123
234

更有意义,但角落里的2再无意义。将其从谷底翻转到顶峰会产生作用。

034
123
234

有道理。好歹。如果可以做到这一点,那么查看本地邻居将为您提供墙壁,如果它为+/- 1,则没有墙壁。否则围墙。另外请注意,您可以以一致的方式打破距离图的规则,并使迷宫变得很好。 (就像不让圆柱挑墙扔掉一样。这只是循环拆分,应该是安全的)

对于随机抽样,这是我要看的最后一个...极限中的某些迷宫生成算法具有一些有趣的属性,无论是作为平均配置还是经过数百万步之后。有些形成沃罗诺伊地区。其中一些与任意翻转的壁形成同心圆,以允许回路之间的连接。等等,循环是一个很好的例子。创建一组循环。在每个循环上翻转随机墙。一个将删除一堵墙,该墙将创建对下一个循环的访问。一个人会分开一条路,并提供一条死路和延续。为了使随机翻转失败,必须有一个开口和一个彼此相邻的分隔(除非您允许对角线,否则我们很好)。因此,使循环。每个循环产生随机噪声。异或。如果不允许使用对角线,请使用固定路径替换本地故障。

那么,如何在每个循环中获得随机噪声?或者我们如何获得比正方形更好的循环?只要采取随机函数。分开发散,现在您有了一个回路图。如果您有源随机函数的微分方程,则每个循环可以选择一个随机数。一种更简单的方法可能是生成同心圆壁并在每个半径处选择一个随机点进行翻转。然后扭曲最终结果。不过,您必须注意,失真在这一点上不会违反任何与路径相关的条件。