Algorithm 独立于邻域确定单元的程序迷宫算法

Algorithm 独立于邻域确定单元的程序迷宫算法,algorithm,infinite,maze,chunks,Algorithm,Infinite,Maze,Chunks,最近我在考虑迷宫算法(主要是因为我在做一个游戏,但我觉得这是一个比游戏开发相关的更一般的问题)。简单地说,我想知道是否有一种迷宫算法可以生成(可能是无限数量的)细胞,而不需要任何关于细胞邻居的信息。我想,如果这样的事情是可能的,它将严重依赖于噪声函数,如柏林函数或单纯形函数 每个单元都有四面墙,这些墙在实际渲染迷宫时使用,因此走廊和墙的厚度不同 比方说,我想要一个位于(32,15)的单元格来生成它的墙 我知道像Ellers这样的算法(需要有限数量的列,但无限行)和虚拟分形迷宫算法(需要知道以前的

最近我在考虑迷宫算法(主要是因为我在做一个游戏,但我觉得这是一个比游戏开发相关的更一般的问题)。简单地说,我想知道是否有一种迷宫算法可以生成(可能是无限数量的)细胞,而不需要任何关于细胞邻居的信息。我想,如果这样的事情是可能的,它将严重依赖于噪声函数,如柏林函数或单纯形函数

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

比方说,我想要一个位于(32,15)的单元格来生成它的墙

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

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

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


提前谢谢你。

请参阅。我的前妻是秘密的。但是,是的,我能理解这种挫折感,所以我会把这个扔给你。如果你没有我那么懒,请随时更新PCG维基:3

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

  • 问你真正想要什么
  • 向后设计。反向播放。结果是向前
  • 看看你的目标的随机抽样,试着看看整体模式
但是回到问题上来,有两种简单的方法,它们都是从问你真正想要什么开始的。我先给你

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

第二种方法是使用函数的属性。只要你的随机函数足够平滑,你就可以选择渐变并给它指定一个平铺。分配瓷砖的方式改变了迷宫结构,但可以通过为每个渐变巧妙地选择瓷砖来保证连接性(b/c类似或相反的渐变在平滑渐变函数上更可能彼此接近)。从这里你的平滑随机可以是任何形式的柏林噪声,等等。再次询问你想要什么技术

不幸的是,你有一个NP问题(我不确定它是难的、完整的,还是我研究这个问题已经有一段时间了……)。所以,你可以生成一个迷宫路径下的随机距离图。然后从那里产生实际的障碍。。。这真的不可取。即使是小迷宫,在不同的情况下也会有大量的考虑

 012
 123
 234
这很简单。在0的右下角有一根柱子,中间的2有一个|形的墙

042
123
234
这一条没有什么意义。您仍然需要在所有未更改的正方形上具有与以前相同的基本墙。。。但是你不能有那4个。它必须位于至少一个邻居的1范围内。(我的意思是,你可以有一个+3的成本为广场有一个传送带之类的东西,但我们走出了迷宫的问题)好吧,所以

032
123
234
更有道理,但角落里的2又是胡说八道。将其从谷底翻转到峰值将产生更大的影响

034
123
234
这是有道理的。无论如何。如果你能做到这一点,那么看看当地的邻居会给你墙,如果它是+/-1,那么没有墙。否则,墙。还要注意的是,您可以以一致的方式打破距离贴图的规则,并创建一个迷宫。(例如,不允许柱拾取墙并将其抛出。这只是在这一点上进行循环拆分,应该是安全的)

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


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

Aldous Broder算法:@yacc这是我以前看过的一个,它的效率非常低