我怎样才能采用在 2D space 中运行良好的算法并使其适用于 3D 环境?

How can I take an algorithm that works very well in a 2D space and adapt it for 3D environments?

我喜欢用来生成游戏关卡的 technique Spelunky,我想将它改编成 3D space,这样我就可以用它来帮助我在游戏中设计一些东西那个 3D space。我只是不确定如何解决此类问题。我觉得这种特定方法的直接翻译是不可能的,但我仍然希望有一些类似的东西,具有相同的曲折路径。

这是一个有趣的问题,因为当您开始将算法移至更高维度时会出现一些挑战。

问题一:主路径占用体积小

让我们从一个简单的数学观察开始。关卡生成算法通过计算从世界顶行到世界底行的随机路径来工作。在每一步,该路径都可以向左、向右或向下移动,但永远不会回到它的起点。假设这三个选项的可能性相同,则特定级别上的第一步有 2/3 的机会保持在同一级别,而后续的每个步骤最多有 1/2 的机会保持在同一级别。 (这是 50%,忽略墙壁)。这意味着每个级别的预期瓷砖数量最多为

1 × (1/3) + (2/3) × (1 + 2) (since there's 1/3 chance to move down immediately, otherwise (2/3) chance to get one room, plus the number of rooms you get from a random process that halts with 50% probability at each step)

= 2.5

这很重要,因为这意味着如果您的世界是一个 n × n 网格,您预计世界中每个级别只有大约 2.5 "used" 个单元格,总共大约 2.5n "used" 路径上的单元格。鉴于世界是 n × n,这意味着

2.5n / n2 = 2.5 / n

世界中的一部分细胞将位于主路径上,因此 n 必须很小,以使不在主路径上的世界部分不会变得太大。您链接的视频选择 n = 4,给出 2.5 / 4 = 62.5% 的世界的一小部分将在主要路径上。这是 "I'd like to make progress" 和 "I'd like my side quest, please." 的完美结合 请记住,这个数字是 高估 路径单元格与支线任务单元格的数量。

现在,让我们从三个维度进行分析。和以前一样,我们从顶部 "slice," 开始,然后在每一步随机向前、向后、向左、向右或向下移动。这给了我们最多 4/5 的机会在我们的第一步中保持在我们的水平,然后从那一点向前最多有 3/4 的机会保持在我们的水平。 (同样,这是一个高估。)再次计算得出

1 × 1/5 + (4/5) × (1 + 4)

= 1/5 + (4/5) × 5

= 4.2

所以这意味着如果我们高估了,平均每个级别有 4.2 个单元将位于主路径中,总路径长度平均为 4.2n。在 n × n × n 的世界中,这意味着 "on-path" 个站点与 "off-path" 个站点的比例是

4.2n / n3

= 4.2 / n2

这意味着您的世界需要非常小,这样主要路径才不会成为整体 space 的微不足道的一部分。例如,选择 n = 3 意味着您将有不到 50% 的世界远离主要路径并可供探索。选择 n = 4 会让你离开主路 75% 的世界,而选择 n = 5 会让你离开主路超过 80% 的世界。

所有这一切都是说,马上,您需要缩小世界的大小,这样基于主路径的算法就不会让世界几乎空无一物。这不一定是坏事,但需要注意。

问题 2:模板 Space 增加

您 运行 的下一个问题是为房间配置构建 "templates" 库。如果您在 2D space 中,每个单元格有四个可能的入口和出口,并且这四个入口的任何子集(可能除了根本没有入口的单元格之外)可能需要一个模板。这给了你

24 - 1 = 15

可能 entrance/exit 个模板可以使用,这只是为了涵盖所有可能的选项集。

在三个维度中,每个单元格有六个可能的入口和出口,所以有

26 - 1 = 63

要考虑

可能的 entrance/exit 组合,因此您需要大量模板来解决这个问题。您可能可以通过利用旋转对称来减少这种情况,但这是需要牢记的重要一点。

问题 3:卡住

您链接的视频提到二维生成算法的优点是

it creates fun and engaging levels that the player can't easily get stuck in.

在 2D space 中,除了少数例外,大多数单元格都与主路径相邻。在 3D space 中,除了少数例外,大多数单元格 不会 与主路径相邻。此外,在 2D space 中,如果你迷路了,也不难找到回去的路——你能去的方向只有这么多,而且你可以一次看到整个世界。在 3D 中,迷路要容易得多,这既是因为与 2D space 相比,您可以采取一些步骤使您远离主要路径,而且因为如果您真的迷路了,有更多的选择可以考虑回溯。 (另外,您可能无法在 3D 模式下一次看到整个世界 space。)

您可以通过不填充完整的 3D space 单元格来解决这个问题。相反,只允许距离主路径一两步的单元格填充有趣的支线任务,因为这样玩家就不会在杂草中迷路。

总结

这三点表明,要在 3D 中使用此方法,您可能需要执行以下操作。

  1. 保持世界比您认为可能需要的小,否则路径上与路径外单元格的比率会变大。
  2. 或者,考虑只填充与主路径相邻的单元格,让其他单元格无法访问,以便玩家可以快速返回到之前的位置。
  3. 准备好创建大量模板,或者弄清楚如何使用轮换使您的模板适用于更多地方。

祝你好运!