
开发者解析《The Witness》随机谜题生成机制
来源标题:Procedural Puzzle Generation in the Witness
《The Witness》结尾的限时挑战关卡采用简单的“生成-测试”方式随机生成谜题:随机放置元素后检测是否有解,无解则重试。Jonathan Blow 去年在直播中公开了该部分关键代码,开发者据此分析了其原理。生成器几乎不控制难度,只要谜题可解即可。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
上个月我终于抽空玩了《The Witness》,大部分内容都让我非常享受。绝大多数谜题都是由 Jonathan Blow 和他的团队手工设计的,但在接近结尾处有一个臭名昭著的段落:The Challenge。这是游戏中唯一一个限时段落。为了防止玩家单纯背下谜题答案,这个段落中的所有谜题都是随机生成的。
节奏和风格的变化,加上紧张的音乐,再掺进几个出其不意的转折,让它成为游戏中最令人难忘的段落之一。
我自然对这种生成机制极为好奇,幸运的是 Blow 去年在直播中分享了这个段落的全部关键代码。于是我自然一头扎了进去。
答案是:它们全都简单得令人难以置信。它们依赖的是「生成并测试」。也就是说,一个相对粗糙的随机生成器随机放置谜题元素,然后检查结果是否有解。如果没有解,就不断重试,直到得到一个好的。生成器几乎不会尝试让谜题变得太简单或太难,只要可解就行。我在玩这个段落时确实发现,很容易碰到一道过难的谜题,或者一道很快就能解开的谜题,但整个序列只有六分半钟,重试几次也不算太折磨人。
让我们逐个看看每道谜题,以及它具体做了什么。每道谜题都以 lotus_ 命名,因为这是这个段落的代号。
生成一个 4×4 的网格(即 9 个方格组成的网格,有 12 条横边和 12 条竖边)。随机切掉 9 条边(允许重复)。
生成一个 8×8 的网格,随机切掉 57 条边(允许重复)。
生成一个 5×5 的网格,随机放置 7 个白色和 4 个黑色圆角矩形(允许重复)。
生成一个 6×6 的网格。随机切掉 25 条边(允许重复)。在随机的边上添加两个六边形点(代码中称为 touch_me,因为你必须触碰它们)。这些点永远不会放在起点或终点旁边,因为那会让后面的门段落太简单。
生成一个 5×5 的网格。选取两个曼哈顿距离 ≥ 3 的位置,并在其中添加两个星星装饰。再在另外两个空格中添加两个随机的多联骨牌。随机切 8 刀。
这道谜题最初只放置随机切口和多联骨牌,但注释表明那样太无聊了,而如果有 3 个形状又太难。
生成一个 5×5 的网格,随机切掉 10 条边,不包括终点。随机添加 4 个绿色星星,不允许重复。随机在顶点上添加 4 个六边形点,不允许重复。
生成一个 7×7 的网格,起点具有 180 度对称。随机切掉 6 条边。随机添加 2 个橙色、2 个青色和 2 个黑色六边形点,不允许重复。
生成一个 8×8 的网格。随机切掉 57 条边,不包括终点。
生成一个 5×5 的网格,随机放置 6 个白色和 6 个黑色圆角矩形(允许重复)。这三道谜题中总有两道是无解的,实现方式是在「生成并测试」的最后反转条件。
生成一个 5×5 的网格,随机放置 5 个白色、2 个紫色和 2 个绿色圆角矩形(允许重复)。游戏会查找一些明显无解的模式并拒绝它们,即使在生成无解谜题时也是如此。
生成一个 5×5 的网格,并用 6 或 8 个三角形装饰填充它。每个装饰是单个三角形的概率为 50%,两个三角形的概率为 35%,其余情况为 3 个三角形。如果随机选择的空间发生重叠,可能会得到更少的装饰。
生成一个 6×7 的圆柱面(即水平环绕的网格,有 30 个方格、35 条横线和 36 条竖线)。始终有 2 条路径,彼此偏移 180 度。随机选取布尔值 vflip(两条路径都从底部开始向上走,还是只有一条如此)。随机选取布尔值 hflip(两条路径一起顺时针移动,还是反向旋转)。随机在边上添加 8 个点(横边和竖边各占 50%)。
生成一个 6×7 的圆柱面,vflip 和 hflip 同上。放置 3 个白色和 3 个黑色圆角矩形。
就是这样。恐怕有些魔力现在已经消失了。事实是,这些谜题并不如游戏其余部分的平均水平——你只是太匆忙了,没注意到而已。我打算自己研究一下程序化生成谜题,但据我所见,要获得高质量的「啊哈」时刻仍然是一个未解决的问题。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。