写在前面:随机不等于内容多
个人开发者做 Roguelite 或生存游戏时,很容易想用程序生成解决内容问题。
地图随机。
敌人随机。
道具随机。
事件随机。
看起来只要生成器写得好,内容就能无限增长。
但现实通常更冷静。
随机生成可以提高变化,但不能自动产生好关卡。
如果规则不受控制,玩家得到的不是惊喜,而是混乱和不公平。
夏闻做过一款地下邮局题材的 Roguelite。
玩家在废弃地铁隧道里投递包裹,每一层要在有限灯油中找到邮箱、避开巡逻怪物、收集路线图。
他最初想做完全随机地图。
后来改成“手工房间模板加种子组合”的方案。
这让游戏仍然有变化,但关卡质量可控,调试也现实得多。
一、纯随机原型的问题
最早版本使用网格随机生成。
生成器会:
- 随机挖房间
- 随机连接走廊
- 随机放敌人
- 随机放邮箱
- 随机放灯油和钥匙
技术上能跑。
但试玩很快暴露问题:
- 有些地图开局就离目标太远
- 有些走廊过长,玩家只是赶路
- 有些邮箱旁边敌人太多
- 有些钥匙在锁门后面
- 有些路线没有有趣选择
- 有些地图资源过多,完全没压力
每个问题都能加规则修。
但规则越加越多,生成器越来越难懂。
夏闻发现,他不是在生成好关卡,而是在不断阻止坏关卡出现。
二、手工关卡也不现实
完全手工关卡的质量最高。
他可以设计每个转角、每个灯油点、每个敌人路线。
但游戏需要重复游玩。
如果只有 20 张手工地图,玩家很快会背板。
而他一个人做内容,不可能手工设计上百张高质量地图。
所以纯手工也不合适。
问题不是“随机还是手工”。
而是哪些部分需要手工保证质量,哪些部分可以交给组合产生变化。
三、最终方案:房间模板加种子组合
夏闻把地图拆成房间模板。
每个房间模板由他手工设计:
- 房间形状
- 入口和出口
- 可能的敌人巡逻点
- 资源点候选位置
- 目标点候选位置
- 难度标签
- 房间用途标签
例如:
safe_roomambush_corridormail_sorting_hallfuel_risk_roomshortcut_roomlocked_reward_room
生成器不再从空白网格开始。
它根据种子选择房间模板,再按规则连接。
这样每个房间内部质量可控,整体路线又有变化。
四、标签系统让生成器更好控制
每个房间模板都有标签。
比如:
tags = ["medium", "combat", "two_exits"]
minDepth = 2
maxDepth = 5
requires = ["lantern"]
forbidNear = ["safe_room"]
这些标签决定房间什么时候能出现。
安全房不会连续出现。
高难伏击房不会出现在第一层开局。
需要灯笼升级的房间不会在玩家拿到升级前出现。
这比纯随机后再修补更稳。
生成器不是随便抽房间,而是在设计约束内组合。
五、种子让问题可以复现
程序生成最怕玩家说:
“我遇到一张根本过不了的地图。”
如果没有种子,开发者很难复现。
夏闻让每局都有生成种子。
玩家反馈时,可以复制种子码。
生成器使用固定随机源。
同样版本、同样种子、同样角色状态,会生成同一张地图。
这让调试变得现实。
他还在日志里记录:
- 种子
- 房间模板序列
- 关键资源位置
- 目标路径长度
- 难度评分
遇到坏图时,不需要猜。
六、可通关检查是底线
房间组合后,生成器会跑检查。
至少包括:
- 起点能到终点
- 关键钥匙在锁门前可达
- 最短路径长度在范围内
- 必需资源数量不低于下限
- 强敌不会堵死唯一通道
- 出口附近有最小安全空间
如果检查失败,就重新生成。
但夏闻设置了重试上限。
如果连续失败,说明模板或规则有问题,而不是让生成器无限尝试。
个人项目里,生成失败也要可见。
不能用无限重试掩盖设计错误。
七、难度曲线如何控制
纯随机地图很难控制难度。
夏闻用层数和预算控制。
每层有一个难度预算。
房间、敌人、资源都消耗或补偿预算。
例如:
- 伏击房消耗 3 点
- 长走廊消耗 1 点
- 安全房返还 2 点
- 灯油补给返还 1 点
- 精英敌人消耗 4 点
生成器在预算内组合房间。
这不保证每局完全平衡,但能避免第一层过难或后期过空。
八、玩家感受到的是“有设计的随机”
改成房间模板后,玩家反馈变了。
他们仍然觉得地图有变化。
但不再频繁抱怨“这局生成得很离谱”。
更重要的是,房间开始有记忆点。
玩家会说:
“那个三条传送带的分拣大厅又出现了,但这次出口不一样。”
“我知道这个房间有风险,但这局灯油太少,还是得进去。”
这正是手工模板和随机组合的价值。
结语:程序生成应该扩大设计,而不是替代设计
夏闻的最终方案是:
- 手工房间模板
- 标签和约束组合
- 固定种子
- 可通关检查
- 难度预算
- 生成日志
- 坏图可复现
它没有纯随机那么自由。
但更适合个人开发。
程序生成不是让开发者不用设计。
它是让设计过的模块以更多方式出现。
对个人游戏来说,最好的生成系统不是最聪明的系统。
而是能稳定产生可玩内容、能调试、能解释、能让玩家觉得公平的系统。
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。