返回
玩法拆解 · 代码 · Demo
策略决策成长 / 数值

三选一爬塔:把「选择空间」做成旋钮的策略决策实验室

每回合从攻击/护盾/经济卡中选 1 张,数值累积对抗逐回合增强的拦路怪,撑过 12 回合即胜;可选卡数与敌人成长斜率直接做成滑块,亲手体会「选择空间大小本身就是难度」。

0

玩法拆解

规则骨架
  • 每回合从 N 张卡(2/3/4 可调)中选 1 张:攻击 +X / 护盾 +X / 经济 +X,其余作废
  • 选卡后战斗自动结算:击杀出手数 = ceil(敌HP/你攻),受击伤害 =(出手数−1)× max(1, 敌攻−你防)
  • HP 归零败北;撑过第 12 回合胜利,终局得分 = 300 + 金币 + 剩余 HP
行为循环
  • 读局势(自身三维 + 当前怪与下回合怪预告)→ 发牌(攻 35% / 防 30% / 经济 35%)→ 选 1 张
  • 自动结算 → 击杀赏金 +3 → 休整:每 10 金币自动换 3 HP(缺多少补多少,上限 30)
  • 敌人按斜率逐回合变强(HP ≈ 3 + 回合×斜率×2.2,攻 ≈ 1 + 回合×斜率×0.8),回到读局势
实现要点
  • 基于 AtomCore 原子试玩引擎的纯静态单文件 demo:Canvas 2D 竖屏自适应,零依赖零外部请求
  • 回合仅 choose / resolve 两态;选卡后 550ms 延迟推进,token 防「重开后旧定时器推进新局」竞态
  • 两个滑块(敌人成长斜率 / 每回合卡数)经 game.params 实时生效于发牌与敌人生成

关键代码

战斗自动结算(受击伤害公式)
js· 6 行
玩法行为:本文属于「策略决策」母型在信息与资源限制下做关键抉择;核心是信息呈现与后果可解释。
查看母型详解

Demo

点开始,每回合从攻击/护盾/经济卡中选 1 张(其余作废),数值累积自动与拦路怪结算,撑过 12 回合即胜;侧栏两个滑块可实时调敌人成长斜率与每回合可选卡数。

三选一爬塔:把「选择空间」做成旋钮的策略决策实验室 Demo
游戏加载中…

文章

三选一爬塔:把「选择空间」做成旋钮的策略决策实验室

一句话本质

这是为「策略决策(Choice / Strategy)」母型建造的实验室级最小游戏实例:每回合从攻击/护盾/经济卡中选 1 张,数值累积后自动与逐回合增强的拦路怪结算,撑过 12 回合即胜。它不假装是商业游戏——没有美术包装、没有卡组 meta——而是一台「选择空间实验装置」:把母型的两根设计主轴(每回合可选卡数、敌人成长斜率)直接做成滑块,让你亲手拧一拧,看难度如何随之改变。

行为循环

  1. 读局势:看自己的 HP/攻/防/金,看当前拦路怪的 HP/攻,以及画面直接给出的下回合怪预告。
  2. 发牌:按攻 35% / 防 30% / 经济 35% 的权重发 N 张卡(N = 2/3/4 可调)。
  3. 选 1 张:选中即生效(攻 +X / 防 +X / 金 +X),其余作废——机会成本立刻落地。
  4. 自动结算:击杀出手数 = ceil(敌HP/你攻),受击伤害 =(出手数−1)× max(1, 敌攻−你防),公式就印在手卡上方。
  5. 休整:击杀赏金 +3,随后每 10 金币自动换 3 HP(缺多少补多少,上限 30)——经济是「存起来的血」。
  6. 推进:HP 归零败北;撑过第 12 回合胜利;否则敌人按斜率变强,回到第 1 步。

原语标注

  • Choose(cardId) — 从 N 张卡中选 1 张,其余作废(choose)
  • Compare(卡面收益, 敌方威胁) — 权衡「这张卡现在值多少」与「这回合会挨多少打」(compare)
  • Accumulate(攻/防/金) — 卡牌数值永久累积到玩家面板(accumulate)
  • ResolveCombat() — 按公开公式自动结算,战报逐条可回溯
  • ConvertGold(10金→3HP) — 休整时经济自动折算为续航
  • AdvanceRound() — 敌人按 slope 成长,回合推进,12 回合封顶

参数速查表

| 参数 | 说明 | 默认值 | 范围/公式 | |------|------|--------|-----------| | slope | 敌人成长曲线斜率(滑块) | 1.2 | 0.6 ~ 2.0,步进 0.1 | | cards | 每回合可选卡数(滑块) | 3 | 2 / 3 / 4 | | 敌人 HP | 逐回合增长 | 6(首回合) | round(3 + 回合 × slope × 2.2),默认斜率下末回合 35 | | 敌人攻击 | 逐回合增长 | 2(首回合) | round(1 + 回合 × slope × 0.8),默认斜率下末回合 13 | | 玩家初始面板 | HP / 攻 / 防 / 金 | 24(上限30) / 5 / 1 / 0 | 固定 | | 攻/防卡数值 | 随回合缓慢升值 | — | 2 + ⌊回合/4⌋ + 随机 0~1 | | 经济卡数值 | 随回合明显升值 | — | 5 + ⌊回合×1.2⌋ + 随机 0~3 | | 击杀赏金 | 每杀一怪 | +3 金 | 固定 | | 休整比例 | 金币换血 | 10 金 → 3 HP | 最多补到上限 30 | | 胜利条件 | 撑过回合数 | 12 | 固定;终局分 = 300 + 金 + 剩余 HP |

设计取舍

  1. 两个滑块就是母型的两根主轴。cards 调选择空间大小:卡越少,想要的类型越可能没来,决策从「选最优」退化为「将就」——选择空间本身就是难度。slope 调风险累积速度:斜率越高,只堆攻或只攒钱的单一策略越早被放大惩罚。难度不藏在数值表里,而是暴露给玩家亲手体会。
  2. 公式印在画布上。受击伤害公式直接写进画面,每回合战报逐条可回溯——落实母型交付清单的「后果可解释」:玩家能说出「我输在第几回合的哪一张卡」。
  3. 经济即存起来的血。金币只在休整时按 10:3 换血且缺多少补多少,成为延迟兑现的防御,三条卡型真·此消彼长,而非净收益趋同的伪选择。
  4. 下回合敌人预告。信息全公开,把难点从「猜」压回「权衡」;残余不确定性由卡牌随机供给承担——避免纯猜测,也避免纯算术。
  5. 实验室的诚实。跨局战绩只有两行胜/负计数,数值模型一眼看穿。它刻意只做一件事:让你调滑块,观察「选择空间 × 成长斜率」如何改写「能否撑过 12 回合」的答案。

实现要点

  • 纯静态单文件:基于 AtomCore 原子试玩引擎(Canvas 2D,2:3 竖屏自适应),零依赖、零外部请求,?lang=zh 切换中文。
  • 两态回合机:phase 只有 choose / resolve;选卡后 550ms 延迟推进回合,并用 token 防止「重开后旧定时器推进新局」的竞态。
  • 发牌与结算分离:dealCards 按权重随机发牌,pick 只做「生效 → 结算 → 休整 → 战报」四步;战斗全自动,操作成本为零,决策成本就是全部。
  • 滑块即配置:game.params 实时读入 enemyFor 与 dealCards,改斜率下一回合敌人立刻变强,改卡数下一次发牌立刻变化。
  • 调试钩子:window.__atomGame 暴露只读游戏对象,便于自动化验证与数值回放。