程序生成的核心是可控随机
程序生成很适合个人游戏:少量手工内容可以组合出更多变化,Roguelite、探索、解谜、战斗房间都能受益。但程序生成也很容易制造坏体验:出口不可达,关键道具不生成,敌人刷在墙里,奖励过于极端,玩家反馈某张图有 bug 时开发者无法复现。
程序生成的核心不是随机,而是可控随机。每次生成都应该有种子,规则应该能校验,坏图应该能重新生成或兜底,日志应该能记录关键结果。
种子要进入日志和存档
每局生成时记录 seed:
run_start seed=84019327 biome=factory difficulty=normal build=2021.06.17
存档也要保存 seed 和生成版本。玩家反馈“这一局第二层没有钥匙”时,你可以用相同 seed 复现。没有 seed,程序生成 bug 很难查。
生成版本也重要。补丁改了生成规则后,同一个 seed 可能生成不同地图。日志里同时记录 generator_version,便于区分。
生成规则先写清楚
程序生成前先写规则:
| 规则 | 示例 |
|---|---|
| 可达性 | 起点到出口必须连通 |
| 关键道具 | 每层至少一个钥匙 |
| 奖励密度 | 普通房间 3 到 5 个奖励点 |
| 敌人强度 | 前 3 个房间不生成精英组合 |
| 房间主题 | 工厂层至少 60% 工厂房间 |
| 特殊房间 | 商店不出现在起点旁 |
规则写出来后,生成器才能校验。不要只靠肉眼跑几局觉得差不多。
房间拼接
很多个人项目适合使用手工房间加随机拼接。每个房间有入口、出口、标签、难度、大小和必要资源:
| 字段 | 说明 |
|---|---|
room_id | 稳定 ID |
doors | 可连接方向 |
tags | 战斗、商店、奖励、事件 |
difficulty | 房间强度 |
required_unlock | 是否需要某能力 |
weight | 出现权重 |
手工房间能稳定局部质量,随机拼接提供变化。比完全随机地形更适合个人团队。
可达性校验
生成后要自动检查起点、出口、关键道具、商店、Boss 房是否可达。可以用简单图搜索。校验失败时不要把坏图交给玩家,应该重试生成或使用备用地图。
校验内容:
- 起点到出口连通。
- 钥匙在锁门前可获得。
- 玩家当前能力能通过路径。
- 房间数量在范围内。
- 没有孤立房间。
- Boss 房前有检查点或补给策略。
可达性校验是程序生成的底线。
随机奖励和极端情况
随机奖励要避免极端。连续不给恢复、连续给同类武器、第一层出现高难诅咒,都可能破坏体验。可以使用保底或权重调整:
- 若连续两个房间没有恢复,下个奖励提高恢复权重。
- 已获得某类武器后,降低重复权重。
- 前期屏蔽过强或过复杂物品。
- Boss 前提供一次可控补给。
这不是让随机失去变化,而是避免随机伤害体验。
坏图兜底
生成失败怎么办?不要无限重试。设置最大重试次数,超过后使用预制安全地图,并写日志。
| 情况 | 处理 |
|---|---|
| 校验失败 1 次 | 换 seed 重试 |
| 连续失败 | 降低复杂规则或用安全模板 |
| 资源缺失 | 禁用对应房间并重试 |
| 存档读取旧生成 | 使用旧版本生成器或保存布局 |
玩家不需要知道生成器失败,只需要得到可玩的地图。但开发者需要日志。
存档策略
生成地图是否保存完整布局,取决于游戏。短局 Roguelite 可以保存 seed 和当前状态;复杂地图或补丁可能改变生成规则,保存完整布局更稳。至少中途存档要能恢复玩家已经探索的房间、奖励领取状态、敌人状态。
如果补丁改变生成规则,旧存档最好继续使用已保存布局,不要重新生成一张不同地图。
测试工具
程序生成需要批量测试工具。内部工具可以连续生成 1000 个 seed,统计失败率、平均房间数、奖励分布、敌人强度。个人项目也可以做简单按钮或命令行,不需要复杂平台。
测试输出:
| 指标 | 用途 |
|---|---|
| 生成失败率 | 判断规则冲突 |
| 平均路径长度 | 判断节奏 |
| 奖励分布 | 判断经济 |
| 房间重复率 | 判断新鲜感 |
| 极端难度组合 | 判断前期体验 |
Steam Demo 的种子选择
Demo 如果使用程序生成,要避免第一批玩家大量遇到坏图。可以给 Demo 使用经过验证的 seed 池,或者让前几局生成规则更保守。玩家第一次体验应先理解核心玩法,再接受随机变化。
同时保留 seed 显示或日志,方便玩家反馈。
最终检查清单
- 每局生成记录 seed 和生成器版本。
- 生成规则先文档化,再实现校验。
- 房间模板有标签、难度和连接信息。
- 生成后做可达性检查。
- 随机奖励有保底和极端控制。
- 生成失败有重试上限和安全模板。
- 存档能恢复已生成布局或稳定 seed。
- 内部工具批量生成并统计结果。
程序生成的价值在于变化,但 Steam 玩家需要的是可玩的变化。个人项目把 seed、规则和校验做好,随机内容才会成为优势,而不是风险。
生成内容的人工审查
批量校验能发现不可达和规则错误,但不能判断节奏是否有趣。建议每周抽样若干 seed 人工试玩,记录路径长度、战斗密度、奖励节奏和视觉重复。程序生成需要数据检查,也需要体验检查。
抽样表:
| seed | 问题 | 处理 |
|---|---|---|
| 812344 | 前 3 房间都是空房 | 调整房间标签权重 |
| 998120 | Boss 前无补给 | 增加安全规则 |
| 104455 | 连续两间相同布局 | 降低重复权重 |
这种记录能把“随机不好玩”变成可修改规则。
生成器版本迁移
补丁后生成器变了,旧存档怎么办?如果存档保存完整布局,就继续使用旧布局;如果只保存 seed,就需要保留旧生成器逻辑或迁移到安全点。个人项目可以在大版本更新时要求当前 run 结束后再使用新规则,但要避免中途存档损坏。
生成器版本应进入存档和日志。没有版本号,很难判断问题来自旧规则还是新规则。
防止内容提前剧透
程序生成仍要控制内容解锁。不要让后期敌人、剧情房间或高级道具在 Demo 或第一层随机出现。房间和奖励都应有解锁条件。这样既保护节奏,也避免商店页承诺之外的内容泄露。
调试命令
内部构建可以提供“输入 seed 进入地图”的功能。玩家反馈 seed 后,开发者直接进入对应地图。这个工具对程序生成项目非常重要,且不应出现在正式玩家菜单中。
难度曲线和生成器
程序生成不代表难度可以完全随机。每一层、每一区域都应有难度预算。敌人组合、陷阱数量、奖励质量和房间复杂度都消耗预算。预算超出时,生成器要换组合,而不是把所有高压元素堆在一起。
| 元素 | 难度成本 |
|---|---|
| 普通敌人 | 低 |
| 精英敌人 | 中 |
| 陷阱地形 | 中 |
| 限时门 | 中 |
| Boss 前无补给 | 高 |
预算化能让随机更可控。
生成结果的可视化
内部工具可以把生成地图画成简图,显示起点、出口、商店、奖励、Boss、锁门和钥匙。看到图后,开发者能快速判断路径是否绕、奖励是否集中、特殊房间是否太早出现。
不需要复杂美术,一张调试网格就足够。程序生成的问题往往看图比读日志更快。
玩家分享 seed
如果游戏允许玩家分享 seed,要考虑版本问题。同一个 seed 在不同版本可能不同。分享界面可以显示游戏版本和生成器版本。这样社区分享不会因为补丁后地图变化造成困惑。
生成器和成就
程序生成游戏常有成就,比如无伤通关某层、找到隐藏房间、完成高难 seed。成就条件要避免被坏 seed 或极端随机破坏。比如隐藏房间成就应确认该局确实生成了隐藏房间;限时成就要考虑地图长度差异。
如果某成就依赖随机内容,最好在条件中加入生成结果判断,而不是只看玩家最终状态。
Demo 中的随机边界
Demo 可以展示随机性,但要限制内容池。过多随机会让不同玩家体验差距太大,影响反馈判断。Demo 阶段更重要的是验证核心循环,所以可以使用较小但经过审查的房间池。等核心反馈稳定后,再扩大生成空间。
这种做法不是削弱随机,而是控制首次公开测试风险。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。