少量高权重决策
一局只让玩家做二十次左右真正影响结局的决定,其余时间在执行。决策太多,等于没有决策。
系统原型 · Unity 2022.3 · v0.2
本文记录《小塔》的数值体系与构建思路。所有关键数值都从一条统一基准线推导而来, 并经过 3000 局自动对战的验证。文中也保留了若干通过数据才暴露出的设计问题。
「不要一小时的塔,要二十分钟的塔。」
玩家扮演持灯者,在 21 层的塔中向上推进。每层选择一次行动(战斗 / 获取奖励 / 休整), 每回合用 3 点能量打出 0 至数张手牌。敌人下一回合的行动意图始终公开显示, 因此任何一次失败都能定位到具体的决策失误,而非归因于随机性。
| 层级 | 时长 | 玩家在做什么 | 决策密度 |
|---|---|---|---|
| 单回合 | 20–40 秒 | 3 能量怎么分配:全打出去还是留能量买甲;先上脆弱还是先打输出 | 高(每回合 3–5 次微决策) |
| 单场战斗 | 3–6 回合 | 要不要为了长期收益吃这一下伤害;多怪时先杀谁 | 中 |
| 单局 | 18–28 分钟 | 走精英拿好牌还是走安全路线;卡组要不要变厚;篝火回血还是升级还是删牌 | 低,但权重最高 |
三层结构并非平均用力。决定最终结果的实际上是第三层(路径选择),但玩家在前两层投入的时间最多, 因此前两层必须低门槛、可逆,才能使后层的决策显得有意义。
五条支柱是功能取舍的判据。每当考虑新增系统,先确认它服务于哪一条支柱;若无法对应,则不加入。
一局只让玩家做二十次左右真正影响结局的决定,其余时间在执行。决策太多,等于没有决策。
任何一套连招都要能被一句话说清。说不清的组合,玩家下一局没法复用,也就不会觉得自己「懂了」。
意图明牌。输了必须能指出「我第几回合打错了」。做不到这一条,难度就只是折磨。
时长是硬约束不是期望值。它反过来决定了层数、战斗密度和卡组厚度。
没有为了凑数的牌。一张在任何情况下都不该拿的牌,应该被删掉而不是被调数值。
核心假设(Fun Hypothesis):玩家发现「两张普通牌连用的收益高于分别使用」时,会形成一次可复述的理解。
这一假设直接约束了数值结构:若每张牌都线性且独立收益,就不会出现「组合更划算」的情况。 因此卡牌中必须保留乘法型增益位(力量、脆弱、连击),并且这些增益位要便宜到「用两张牌换取一次放大」在数值上成立。
数值膨胀通常源于孤立的局部调整(例如「这张牌偏弱,加 2 点」)。为避免这种情况, 需要建立一条所有卡牌共同参照的基准线,作为每次微调的依据。
「打击」是全场唯一不参与平衡讨论的锚点。其余攻击牌均相对其偏移: 2 费 14 伤为溢价(每费 7 点,代价是节奏变慢、容易卡手), 0 费 5 伤为折价(每费收益更低,价值在于填补第 3 点能量的空档)。 任何偏离基准线的设计都必须有明确理由,否则只是无序的数值噪声。
3 能量 × 6 伤 ≈ 18,实际 ≈ 17
3 点能量中总有一部分必须用于获取护甲。因此计算敌人血量时应按约 17 点计,而非 18 点;这一点的差异在 6 回合中足以造成一次空打。
75 + 4 × 26 = 179
75 点初始生命,加上 4 次篝火回复(约 26 点)。这是玩家整局的血量预算,而非每场可重置的血条。
17 × 6 ≈ 100 → 上限 88–96
精英按「玩家 6 回合可解」设定上限,同时其 5 回合内的输出不能超过玩家的承受力。原值 118–145 在数学上不可解,而非单纯偏难。
单次意图 ≤ 最大生命 × 50%
超过该阈值后防御牌失去意义,玩家只能硬承伤害,P2「组合可读」便不成立。多怪同回合时会错开重击时机,避免集体爆发。
| 项 | 值 | 为什么是这个数 |
|---|---|---|
| 最大生命 | 75 | 能被 3 整除;一场普通战吃 2 次意图后仍有喘息余地 |
| 每回合能量 | 3 | 刚好打出 2–3 张牌 —— 既能组合,又不会让手牌全部作废 |
| 每回合抽牌 | 5 | 手牌 5 张、能量 3 点:必然有取舍,但不至于完全没得选 |
| 手牌上限 | 10 | 防止「抽牌流」把屏幕塞满,也保护布局 |
| 总层数 | 21 | 13 场战斗 × 5.6 回合 ≈ 20–30 分钟,落在 P4 内 |
| 篝火回血 | 30% | 唯一标过 [PLACEHOLDER] 的数,也是唯一能整体调难度的旋钮 |
| 卡组下限 | 5 | 「遗忘」删到 5 张就锁住 —— 循环牌必须留出抽牌堆余量 |
1 费占一半以上:3 点能量的回合里,玩家天然能打 3 张牌,组合的可能性最多。 3 费只有 4 张 —— 它们的作用是「占满一整回合」,属于节奏牌,不能多。
起始卡组由 5 张打击、4 张防御和 1 张涌泉组成,共 10 张。整局大约获得 15 张新牌,并通过「遗忘」删去若干。 因此真正的构筑空间在于「加什么」与「删什么」,而非堆满牌库。
敌人头顶显示的数值并非数据表中的基础值,而是已计入力量、弱化、脆弱等状态后的最终值。 这一点很关键:若显示基础值,玩家需在脑中复算,P3「失败可归因」便无法成立。
AI 只有三种模式:Loop(固定循环,可以背下来)、Weighted(权重随机,不可完全预测)、
Phase(生命降到阈值切阶段,换一套意图)。多怪同回合会软错开,避免一次集体重击直接结束游戏。
| 分级 | 数量 | 血量区间 | 设计约束 |
|---|---|---|---|
| 普通 | 11 | 26 – 50 | 3 回合内可击杀(26 HP 的史莱姆是第 1 层的固定教学遭遇) |
| 精英 | 4 | 88 – 96 | 6 回合可解;单次意图不超过玩家最大生命的 50% |
| Boss | 1 | 152 | 生命 50% 转二阶段,换一套意图 —— 后半场是另一道题 |
普通怪 11 种、遭遇 25 组,按 Early(7)/ Mid(7)/ Late(6)/ 精英(4)/ Boss(1)分带,按层数加权抽取。 按层数换带,是为了让第 18 层的杂兵和第 3 层的不一样 —— 否则后期只剩血量在涨。
三张手工模板各含 21 层、47 个节点。单节点层为强制战斗,三节点层为分支选择,两者交替出现以控制节奏。 以下为「裂隙之径」的实际排布:
改版前,243 局未通关样本中有 53% 死于 Boss,而玩家在第 20 层无任何恢复手段—— 即胜负在进入第 20 层时已由此前累积的伤害决定。
这违反 P3:玩家失败却无法指出「本可以怎么做」。因此第 20 层由宝藏改为篝火, 确保 Boss 前必然存在一次准备决策(回血 / 升级 / 删牌)。
| 地图 | 战斗 | 宝箱 | 篝火 | 精英 | Boss | 节点 |
|---|---|---|---|---|---|---|
| 裂隙之径 | 15 | 11 | 12 | 8 | 1 | 47 |
| 苔沼回廊 | 14 | 13 | 11 | 8 | 1 | 47 |
| 六面阶梯 | 16 | 12 | 10 | 8 | 1 | 47 |
三张图节点数完全相同,仅分布不同 —— 这样「按图拆分通关率」才有可比性。 若节点数也不同,通关率差异便无法区分是结构问题还是内容量问题。
设计文档设定了两个量化目标:无脑打法通关率不超过 5%,新手打法通关率在 40–60% 之间。 在缺乏批量模拟手段时,这类目标只能依赖人工试玩,而人工试玩 200 局并不可行。 因此先实现模拟器,使该约束首次可被实际检验。
| 打法 | 规则 | 通关率 | 平均到达层 | 单局回合 | 平均拿牌 |
|---|---|---|---|---|---|
| 无脑 · 打最痛 | 盲走,闭眼拿奖励 | 0.0% | 10.7 | 25.6 | 7.9 |
| 新手 · 攻防取舍 | 看血量选路,按稀有度拿奖励 | 56.9% | 19.6 | 59.7 | 14.8 |
| 随机 | 看血量选路,随机拿奖励 | 2.6% | 13.9 | 49.3 | 10.3 |
无脑打法 0% 并非「过难」,而是证明仅靠打出高数值牌无法获胜—— 护甲、能量、抽牌等不直接产生伤害的动作必须被合理使用。这正是 P1 与 P2 期望的结果。 随机打法 2.6% 作为下界参照:完全随机决策仅能推进至约第 14 层。
Boss 占 27.4%、三个精英合计 33.2% —— 死亡集中在被设计为「墙」的节点,而非散落在普通战斗中。 这是分布形态上的通过条件:若普通战斗也开始大量致死,说明中间层的血量预算失衡,而非 Boss 偏难。
| 改动 | 真实原因 |
|---|---|
| 精英 HP 118–145 → 88–96 | 硬账算不过来:玩家每回合实际输出约 17,130 HP 要打 8 回合,而精英 5 回合的输出就超过 75 点生命的承受力。这是数学上打不过。 |
| 战斗密度 16 场 → 13 场 | 血量预算算不平:可支配血量约 179,摊到 16 场平均每场只剩 11 点,而精英一场就要吃 25 以上。这直接表现为第 16–19 层扎堆阵亡。 |
| Boss 260 → 152 | 260 血按每回合 17 输出要打 15 回合,而玩家的血量只够撑 6–8 回合。分四次降,每次降完重跑一遍。 |
| 第 20 层宝藏 → 篝火 | 53% 的失败死在 Boss,而进 Boss 前没有任何恢复手段 —— 胜负在踏进 20 层时就定了,违反 P3。 |
| 篝火回血 30% → 35% → 30% | 第一次上调是因为 30% 时通关率 39.4%、阵亡均匀散布在 11/17/18/19/21 层 —— 这是全局血量偏紧的特征,篝火是唯一的全局杠杆。后来加「遗忘」把通关率推到 64.7%,又把它回调到 30% 对冲。 |
第一版废牌探测仅统计「每张卡被选取次数」,垫底名单为 pwr_avatar(5 次)、
skl_fortify(4 次)……初看可直接删牌。但该统计存在三个缺陷:
pwr_avatar 的出现选中率是 100%(太稀有),真正的低分是 skl_fortify 的 2.7%。同一份数据换一个分母,结论从「删这张」变成「删那张」。atk_strike 被提供 240 次、选中 0 次 —— 概率上不可能。隔离探针测出它的真实选中率是 11.9%,和防御牌同档。把局数提到 3000 才稳定下来。pick_rate 测的是稀有度,不是卡牌质量 —— 跨稀有度排名,等于把 26 张普通牌全判成废牌。现有判据为同稀有度带内的相对指数(1.0 = 该带平均): 普通 1.9×、罕见 1.3×、稀有 1.1× 的极差范围内无离群卡。 经验:比值型指标必须同时报告分母;离散比值在大样本前不能用于排名;若指标在分组后出现干净的断层,断层通常来自评价机制本身。
这三张牌在数据表中均表现正常,单凭代码审查也难以发现问题—— 需将内容生成器与模拟器串联运行后才会暴露。
它的效果是「造成伤害并降低敌人 1 点力量」,升级增量写成了 [9, 1] ——
数字没写错,符号错了。
怎么发现的:批量模拟里这张牌的升级版本表现反常(拿了升级反而更容易死)。核对发现升级后是「+1 力量」,等于给敌人加攻。
修法:改成 [9, -1],并在内容自检里加一条「减益类增量的符号必须为负」。
基础效果是「获得 1 点能量」,升级增量也是 [1] —— 数值和基础值相同。
所以它可以被升级,但升级没有任何效果,而卡面还会显示「已升级」。
怎么发现的:检查「每张牌升级后的期望收益」时,有一项差值恒为 0。全表扫一遍,只有它一个是 0。
修法:升级增量改为 2,并在编译期的合同检查里加一条「升级增量不得与基础值完全相等」。
卡面写着「护甲不再每回合清零」,代码里 KeepBlockAcrossTurns 这个字段
只有读、没有任何写入点 —— 也就是说这个效果从来没有被执行过。
后果是它成为一张严格劣势卡:同为稀有、2 费,「完璧」提供 22 点护甲,它仅提供 8 点。 在任何场合都无法为其辩护。
怎么发现的:不是模拟器发现的,是「每张牌为什么存在」的核对(P5)问出来的 —— 如果它只有 8 点甲,凭什么和 22 点的牌同价?顺着这个问题去查字段,发现没人写它。
以下内容并非「后续补充」,而是本版本主动舍弃的设计:
各项单独看均合理,但叠加后会把单局时长从 20 分钟拉向 1 小时。单局时长是 P4 约束,本版本不允许对此让步。
在加入任何新系统前,先确认它创造了何种新的玩家决策;若无法回答,则不加入。