第 001 期 · 2026 年 5 月 · 文章技术 · 2026 年 5 月 14 日
技术 · 2026 年 5 月 14 日

小画布上的程序化生成

带约束的随机 vs 带验证的生成。内容背后的两种算法、为什么塞进 50 行、难度曲线问题。

Hage Game 25 款游戏里有 9 款用程序化生成内容,而不是从预制数据加载。一笔画生成保证可解的迷宫;密码破解生成秘密密码;像素镜像生成图案;听音配对生成音色集;等等。程序化生成是让这些游戏无限可重玩、而不需要储存无限内容的原因。这篇文章是关于它实际怎么运作 —— 以及它做不到什么。

两种程序化生成

程序化生成有两种真正不同的方法,正确的取决于你需要什么。

第一种是带约束的随机。游戏在规则内挑选随机值,接受结果。听音配对用这个:从音阶里挑八个随机频率,分配给方块,完成。约束(音阶音符、对数)确保结果总是可玩;随机性确保它总是不同。

第二种是带验证的生成。游戏生成一个候选,检查它是否满足更严格的标准,不满足就重试。一笔画用这个:用回溯 DFS 生成一条随机哈密顿路径,得到的棋盘保证可解,因为我们从一个解构造它。落子配色的起始棋盘用了类似的东西 —— 预测试棋盘的"有趣"连锁潜力,再发给玩家。

第一种便宜,对任何输出都好的对称问题管用。第二种更贵,但对某些随机输出不可玩的问题必要。选择主要是关于合法输出空间是密集的(用随机)还是稀疏的(用验证)。

为什么我们的生成器很小

一个常见假设是程序化生成需要复杂算法。在浏览器规模游戏的实践里,它不需要。我们多数生成器塞进 50 行 JavaScript。一笔画保证可解的迷宫生成器是较长的之一 —— 它也不到 80 行,包括回溯。听音配对的音色生成器接近 20 行,从数组里挑频率,分配到打乱的位置数组,把它们配对。

短来自有限范围。我们不生成开放世界、有主题连贯性的地下城或任务线。我们生成单一会话的单一棋盘。我们需要覆盖的组合空间小到简单算法能穷尽它;复杂技术会浪费。

难度曲线问题

纯随机生成有一个持续问题:结果的难度本身是随机的。某些听音配对棋盘比其他的难,因为某些随机音色集在感知上比其他的相距更远;某些一笔画棋盘更容易,因为随机的哈密顿路径恰好沿明显路径走。我们在多数游戏里容忍这一点,因为方差小到不破坏玩家体验。

无法容忍的地方,我们加了难度参数。旋转迷宫通过增加墙密度在更高关卡生成更难的迷宫。节奏回声确定性地增长序列长度。一笔画按关卡增长网格大小。这些不是生成创新;它们是对生成器参数的简单单调调整。它们够了。

程序化生成做不到什么

程序化生成的根本限制是,它无法产生有意内容。一个手工关卡可以有一个设计师为某个原因放在那里的时刻 —— 一个惊喜、一个回调、一个转折。一个程序化关卡没有这种时刻,只有结构规律。这对靠掌握一个机制取胜的游戏没问题;对靠被设计师惊讶取胜的游戏是致命的。

我们的游戏全在第一类,按设计。我们选择奖励掌握而不是惊喜的机制,部分因为我们是小团队,部分因为机制以手工内容做不到的方式跨无限游玩会话扩展。一个有不同目标的不同团队会做不同选择。我们选择生成是因为它符合我们想建的东西。


发布 · 2026 年 5 月 14 日 · 撰写并署名:Bill


发布 · 2026 年 5 月 14 日 · 撰写并署名:Bill