程序生成瓦片集的瓦片房间

Procedurally generating tile rooms of a tileset

我目前正在尝试开发一款用 OpenGL 而不是任何流行游戏引擎编写的游戏。这个游戏 围绕程序生成 展开,其中我需要使用玩家定义的(或随机的)种子从程序生成的瓷砖(房间)中生成随机地板(瓷砖集),这会每次使用时提供相同的结果图块集。

我发现很难生成这样的随机图块。

让我们将此图像视为这样一个房间的布局,其中黑色代表房间的表面,白色代表免费 space(超出玩家可访问区域):

tile image

我玩过的 Perlin 噪声不一定会生成具有 奇异 墨水斑点 的图像,该图像至少会触及一侧图像的一部分,这是我生成一个图块集所需要的(要求所有图块的大小统一并且至少有一个入口)。

如果您能告诉我如何处理这个特殊问题,我将不胜感激。

绝对没有一种正确的方法来处理这个问题。在处理随机生成时,您总是需要根据生成的房间如何与之交互以及它应该是什么样子来发挥一点创意。在某些时候您可能想问自己一些问题:

  1. 你的房间一定要是凸的吗?你能处理中间有洞的房间吗?也许他们甚至是想要的? 由于找不到更好的词,我将在这里宽松地使用术语“凸”来描述每个点都在“外部”的形状

  2. 一个房间应该有多少个出口? 1-4?这个数字应该取决于种子,还是由生成关卡布局的任何算法提供?

  3. 出口总是在各自一侧的中央吗?例如。顶部居中,底部居中?

您上面提供的图像很特别,因为它是完全凸出的,并且在相对的两侧恰好有 2 个潜在出口。这一代相对容易复制:将其想象成一堆不同宽度和高度的块。您所要做的就是生成正确数量的随机块并将它们随机放置在彼此之上。只要确保你的方块足够重叠,这样从下到上仍然有一条路径。

连接 2 条边很简​​单:只需将积木从下到上堆叠起来,您就已经有 2 个可能的出口了。

可以通过从各自的一侧向中心垂直放置瓷砖直到它们接触房间来连接其他两侧,或者,我发现一个更有趣的想法:叠加相同算法的第二次迭代旋转90 度。不过,此解决方案可能会生成 holes/pillars,这可能不是您想要的。