核心结论(金字塔顶端)
要在 Balatro 白注(White Stake)稳定达到 99% 的 Ante 8 通关率,纯端到端的深度强化学习(如 PPO)走不通。可行的路线是「分层架构 + 混合搜索」:
- 战术层(单回合内):把"选牌出牌"建模成组合优化问题,用 MCTS 或精确枚举求近似最优解——但要注意,这层不能脱离战略层独立求解(见 §3.3:积累型 joker 让战术动作带有长期后果)
- 战略层(跨回合 + 商店):这才是 RL 真正该发力的地方——构筑(joker 选择)、资源管理(金币/抽牌/弃牌)、风险控制,并为战术层提供长期价值估计 $V(s’)$
- 奖励塑形:稀疏的"通关"信号必须被稠密化,但又要避免 agent 学到"刷分"而非"通关"
下面分层拆解。先说清楚为什么这个目标既硬核又可行。
一、先校准目标:99% 白注通关率意味着什么?
1.1 难度基准(人类水平)
白注是 Balatro 的最低难度(无任何 stake 修正)。但即便如此,通关 Ante 8 也绝不轻松。根据社区统计 1:
| 玩家层次 | 白注通关率 |
|---|---|
| 普通玩家 | ~20-30% |
| 熟练玩家 | ~50% |
| 顶尖玩家 | ~80%(个别卡组如 Checkered 能更高) |
📌 关键判断:99% 这个目标显著高于人类顶尖水平。它意味着 agent 不能依赖"运气好的构筑",必须系统性地规避死亡风险、最大化每个决策的期望通关概率。这恰恰是 RL 相对人类的天然优势——RL 能优化长期期望,而人类受限于单局的情绪与可见范围。
1.2 分数墙:Ante 8 的硬门槛
白注下 Ante 8 的 Boss Blind 要求分数(以 Red Deck 基准)2:
| Ante | 小盲 | 大盲 | Boss Blind |
|---|---|---|---|
| 1 | 300 | 450 | 600 |
| 4 | 8,000 | 12,000 | 16,000 |
| 8 | ~100,000 | ~150,000 | ~200,000+ |
某些 Boss(如 The Wall)Ante 8 分数墙可达 300,000 3。这意味着:进入 Ante 7-8,agent 必须具备指数级的分数增长能力(xMult joker + 牌型升级)。构筑路径选择在前中期就已经决定了后期能否突破这道墙。
二、把游戏建模成 MDP:状态、动作、奖励
这是所有 RL 工作的根基。Balatro 的难点在于它的决策是混合的、稀疏的、且高度依赖构筑。
2.1 状态空间 $S$
一个完整的状态需要编码:
状态 = (
手牌(花色/点数/增强), # 当前可打出的牌
牌堆/弃牌堆(残差信息), # 推断剩余牌分布
当前 blind 目标分数 + 已得分,
剩余出牌次数 / 弃牌次数, # 资源
金币, # 商店购买力
当前 joker 列表 + 每张效果, # ★ 核心构筑,150+ 种
# ★★ 每张 joker 的运行时累积状态(如 Green Joker 当前 mult、Ride the Bus 计数、Supernova 永久加成)
# 这一项绝不能省——见 §3.3,它是跨回合耦合的根源
牌组(deck)构成, # 已增删/增强的牌
消耗品(塔罗/星球/光谱),
当前 ante / blind 类型 / Boss 效果,
商店内容(若在商店阶段)
)
编码挑战:joker 效果极其异质(有的 +chips,有的 ×mult,有的条件触发,有的重写计分规则如 Burglar / Eternal 类)。不能简单 one-hot,需要用结构化/嵌入编码——这是后续网络设计的重点。更关键的是,每个 joker 还必须带上运行时累积状态(当前 mult/chips 加成、触发计数等),否则模型无法理解"弃牌攒 buff"这类长程投资(详见 §3.3)。
2.2 动作空间 $A$(这里有个大坑)
Balatro 的动作是分阶段、异构的:
| 阶段 | 动作 | 动作数 |
|---|---|---|
| 出牌 | 选 1~5 张牌并打出 | $\binom{8}{1..5} + \text{排序变体}$,但实际只关心牌型组合,约 $10^2$ 量级 |
| 弃牌 | 选 1~5 张弃掉 | 同上 |
| 商店 | 买 joker / 消耗品 / 重置商店 / 卖 joker / 跳过 | ~20-30 |
| 排序 | 重新排列手牌 | 影响部分 joker(如 从左到右触发) |
⚠️ 关键洞察:出牌动作的"组合爆炸"是伪命题。8 张手牌选 1~5 张,组合数 $\sum_{k=1}^{5}\binom{8}{k} = 218$,再排除非法牌型后实际有效出牌往往只有 几十种。这个子问题用枚举+精确计分就能解,不需要 RL!
2.3 奖励 $R$:最需要小心的设计
直接的奖励是"通关 = +1,失败 = 0"。但这个信号太稀疏——一局 15~40 分钟、上百个决策,只有一个终局信号,信用分配几乎不可能。
参考 OpenAI Five 在 Dota 上的经验 4,必须做奖励塑形,但要注意方向:
| 塑形项 | 是否推荐 | 理由 |
|---|---|---|
| 通关 +1 / 失败 0 | ✅ 终局主信号 | 必须保留,定义"赢" |
| 击败 Blind 的金钱奖励 | ✅ 弱 | 与游戏内经济一致 |
| 超额完成分数 | ⚠️ 慎用 | 易导致 agent 刷分而非控血 |
| 存活到下一个 ante | ✅ 推荐 | 稠密化进度信号 |
| 购买 joker 后的"战力增量" | ✅ 推荐 | 引导构筑质量 |
| 剩余出牌/弃牌次数 | ⚠️ 弱 | 避免过度挥霍资源 |
核心原则(借鉴 OpenAI Five 的零和思想 4):塑形奖励的净效果不应偏离"通关"目标。一个实用做法是 potential-based reward shaping $F = \gamma\Phi(s’) - \Phi(s)$,其中 $\Phi$ 是一个手工或学习到的"通关势函数",它理论上不改变最优策略,只加速学习 5。
三、算法选型:为什么纯 PPO 不够,需要 MCTS+RL 混合架构
3.1 纯端到端 PPO 的失败原因
直觉上,Dota 2 用 PPO 成功了,Balatro 也该行?不行,原因有三:
- 样本效率:Dota 靠 256 GPU + 45,000 年游戏经验堆出来的 6。Balatro 社区模拟器(如 Jackdaw)虽然快,但单局长、决策密,要堆到 Dota 的量级不现实。
- 组合动作的精度:出牌是离散组合,PPO 用随机策略采样,很难稳定收敛到"当前手牌的最优子集"——而这恰恰是可以精确求解的。
- 构筑的长程依赖:Ante 3 买哪个 joker,直接决定 Ante 8 能否过关。PPO 的信用分配跨度太大。
3.2 推荐架构:战术层精确 + 战略层学习
借鉴 AlphaZero 的核心思想——用搜索做"策略改进算子",用网络指导搜索 7 8——但分层:
┌─────────────────────────────────────────────┐
│ 战略层(跨回合,RL 的主战场) │
│ - 商店决策:买/卖/跳过/重置 │
│ - 资源管理:金币、抽牌、弃牌的分配 │
│ - 风险控制:何时安全过 blind、何时贪分 │
│ 算法:PPO 或 AlphaZero-style 策略价值网络 │
└──────────────────┬──────────────────────────┘
│ (提供当前状态 + 战略意图)
▼
┌─────────────────────────────────────────────┐
│ 战术层(单回合内,组合优化) │
│ - 出牌选牌:从手牌中选最优子集 │
│ - 精确计分:含 joker 链触发顺序 │
│ 算法:精确枚举 / MCTS / 分支限界 │
└─────────────────────────────────────────────┘
为什么这样分工(初步设想)看起来有效?
- 战术层似乎"可精确求解"——手牌就 8 张,有效出牌组合几十个,直接枚举每个组合的实际计分(考虑所有 joker 触发),选最优的。
- 战略层才是 RL 的用武之地——商店构筑、资源调度是真正的长期规划问题,RL 在这里学"未来导向"的策略。
- 这样似乎能大幅压缩 RL 的动作空间和决策频率。
⚠️ 但这个"分工"有一个致命漏洞,见下一节 §3.3。初步设想的"战术层独立精确求解"在 Balatro 的真实机制下不成立。
3.3 关键修正:跨回合状态耦合,战术层无法独立求解
上面"战术层可精确求解"的判断,只在纯计分类 joker(如 +chips、+mult)存在时成立。但 Balatro 有一大类 joker,它的内部状态会随战术动作改变,并跨回合延续——这直接打破了"单回合封闭"的假设。
典型例子:积累型 joker
| joker | 机制 | 跨回合影响 |
|---|---|---|
| Green Joker | 每弃牌 +1 mult,每出牌 -1 mult | ★ mult 加成永久累积,影响后续所有回合 |
| Ride the Bus | 每打出不含面牌的一手 +0.2 mult | 累积 mult,直到打出面牌归零 |
| Banner | 每剩余弃牌 +30 chips | 弃牌次数本身是跨回合资源 |
| Supernova | 牌型本次得分永久 +mult | 整局永久记忆 |
| Mystic Summit | 前几次弃牌触发 +mult | 一次性消耗,跨回合预算 |
一个具体推演(以 Green Joker 为例):手牌里有一个稳赢的对子,直接出即可过关。但如果先弃牌 2 次再出对子,这一回合 mult 永久 +2,会延续到后续所有回合。真正的决策是:
方案 A:直接出对子 → 过关,mult 不变
方案 B:先弃牌 2 次 → 攒永久 mult → 再出对子 → 过关,mult +2(全周期有效)
方案 C:弃牌 5 次 → 攒更多 mult → 但可能把好牌弃了,过不了关
“是否弃牌攒 buff"是一个长期投资决策,不是单回合最优。 “战术层精确求解"的假设,在这类 joker 存在时直接崩塌。
结论:Balatro 表面是卡牌游戏,底层其实是一个伪装成卡牌游戏的资源管理 + 长期投资博弈。 它的很多机制设计(积累型 mult、deck 演化、消耗品投资)本质都是"现在牺牲、换取未来收益"的权衡。这类问题 RL 比 MCTS 更擅长——因为 MCTS 擅长离散对抗搜索(围棋),RL 擅长长程投资的规划与信用分配。
3.4 修正后的架构:战术层依赖战略层的长期价值
原架构里战术层是"独立黑盒求解器”,修正后它必须由战略层网络引导,两层端到端联合训练:
┌─────────────────────────────────────────────────┐
│ 战略层(RL:学习长期价值 V(s)) │
│ - 输入:完整状态(★ 含 joker 运行时累积状态) │
│ - 输出:V(s) = 期望通关率 │
│ - 用途:① 商店决策 ② 给战术层提供长期价值 │
└──────────────────┬──────────────────────────────┘
│ 提供 V(s') —— 操作后状态的价值
▼
┌─────────────────────────────────────────────────┐
│ 战术层(组合优化 + 长期价值引导) │
│ - 枚举出牌/弃牌组合 c │
│ - 对每个组合 c,精确计算综合价值: │
│ 单回合得分 + γ · V(操作后状态 s') │
│ - 选综合价值最高的组合 │
└─────────────────────────────────────────────────┘
关键改变:战术层不再追求"单回合得分最高”,而是追求"单回合得分 + 折扣后长期价值“的综合最优。Green Joker 的"弃牌攒 mult"操作,其长期价值会被战略层网络 $V(s’)$ 识别并奖励。
对状态编码的影响:Set Transformer 的输入不再是"joker 类型 embedding”,而是 “joker 类型 + 运行时累积状态(当前 mult/chips 加成、触发计数等)“的联合 embedding。
对训练的影响:两层必须联合优化、梯度互通,接近 AlphaZero 式"用网络引导搜索、用搜索改进网络"的架构——而非"战术层独立、战略层独立”。
3.5 战略层的具体网络设计
状态编码(关键创新点)用 Set Transformer / GNN 处理 joker 集合,因为 joker 顺序和组合都重要:
joker 编码 = Transformer/SetEncoder(joker_embeddings)
全状态向量 = concat(标量状态, 手牌编码, joker编码, deck编码, 盲注信息)
↓
策略网络 π(a|s) → 商店动作分布
价值网络 V(s) → "从当前状态出发的期望通关率"
价值网络 $V(s)$ 输出的是期望通关概率,这正是我们最终要最大化的量——让 agent 直接学会评估"我现在这个构筑、这个局面,有多大把握通关 Ante 8”。
四、训练流程:课程学习 + 自我对弈
4.1 课程学习(Curriculum)
不要一上来就训 Ante 8。参考通用 RL 工程经验 9:
- 阶段 1:先训 Ante 1-3,让 agent 学会基础计分和商店节奏
- 阶段 2:Ante 4-6,引入构筑协同和资源管理
- 阶段 3:Ante 7-8,聚焦突破分数墙和 Boss 应对
- 阶段 4:全 ante 随机种子,完整一局训练
⚠️ 注意:OpenAI Five 在 Dota 上没有手工课程 4。但 Balatro 不同——它的 ante 是天然递增的难度阶梯,利用这个结构做课程是合理且高效的。
2.2 自我对弈 + 对手池
由于 Balatro 是单人对随机环境(非对抗性),不需要对手池。但可以维护一个种子池/难度池:把 agent 容易输的随机种子(罕见 Boss 组合、烂商店)加权采样,做 prioritized experience——这等价于 AlphaStar 的"利用者"思想 10 在单 agent 场景的迁移。
五、关键技术风险与缓解
| 风险 | 说明 | 缓解 |
|---|---|---|
| 模拟器保真度 | Jackdaw 等第三方模拟器可能与真实游戏有出入 | 用真实游戏 API(如 BalatroBot)做 A/B 校验;关键计分逻辑用单元测试对齐官方 wiki 2 |
| 奖励黑客(reward hacking) | agent 可能找到模拟器 bug 或边缘行为刷分 | 终局信号以通关为准;塑形奖励做零和/势函数化;定期人工审计 agent 行为 |
| joker 组合空间爆炸 | 150+ joker 的组合策略空间极大 | Set Transformer 编码 + 迁移学习(先训小 joker 子集) |
| 罕见 Boss 应对不足 | Ante 8 的 The Wall(300k 分)等极端 Boss | 对抗性种子采样,专门强化极端场景 |
| 过拟合到固定随机性 | RL 可能在固定种子上"背答案" | 训练时大量随机种子,评估时用 held-out 种子集 |
六、99% 真的可达吗?我的判断
可达,但有条件:
- 白注的随机性是有限的:商店商品随机,但不是对抗性的——不存在"必输局"。理论上几乎每个随机种子都有解,只是难度不同。
- 人类顶尖能到 ~80% 1,说明剩余的 19% 失败大多来自次优决策而非"死局"。RL 系统性优化长期期望,有空间把这 19% 吃掉。
- 瓶颈在构筑层的长期规划,而这正是 AlphaZero 式"搜索+学习"架构的强项——MCTS 能在商店决策时前瞻模拟若干回合。
🎯 现实预期:用 Jackdaw + 战术层精确 + 战略层 AlphaZero 风格的混合架构,在中等算力(单机多卡)训练数周后,白注 Ante 8 通关率从随机 baseline 的接近 0% 提升到 90%+ 是有社区先例支撑的;再通过对抗性采样和架构打磨冲到 99% 是激进但非空想的目标。
社区已有 RL 项目在真实游戏中拿到首胜的报道 11,证明这条路是通的。
七、可落地的技术栈推荐
| 组件 | 推荐方案 | 备注 |
|---|---|---|
| 模拟器 | Jackdaw(Python, Gymnasium) | 首选,原生 Python 无 Lua 依赖 |
| 真实游戏对接 | BalatroBot(JSON-RPC API) | 校验模拟器保真度 |
| 战术层求解 | 精确枚举 + 计分模拟 | 8 选 5 完全可枚举 |
| 战略层算法 | PPO(Stable Baselines3)或 AlphaZero 风格 | SB3 上手快,AlphaZero 上限高 |
| 网络架构 | Set Transformer + MLP | 编码 joker 集合 |
| 训练框架 | Ray RLlib / CleanRL | 分布式训练 |
| 评估 | held-out 10k 种子通关率 | 防过拟合 |
八、总结:三句话记住这个设计
- 战术层不能脱离战略层:积累型 joker 让单回合动作带有长期后果(§3.3),战术层必须由战略层的长期价值 $V(s’)$ 引导,两层端到端联合训练。
- 奖励塑形要小心:稠密化进度信号可以,但终局必须锁定"通关",避免 reward hacking。
- 白注 99% 可达:因为随机性有限、人类已证明 ~80% 是次优决策造成的,RL 优化长期期望有空间补齐。
下一篇会动手实现一个最小可运行的 Balatro RL demo(基于 Jackdaw),把战术层精确求解器写出来,跑通第一个 baseline。Happy hacking! 🃏
参考资源
Reddit r/balatro, What is an overall good winrate on Balatro, https://www.reddit.com/r/balatro/comments/1ctabl2/what_is_an_overall_good_winrate_on_balatro/ ↩︎ ↩︎
Balatro Wiki, Blinds and Antes, https://balatrowiki.org/w/Blinds_and_Antes ↩︎ ↩︎
Reddit r/balatro, Is the Ante 8 Boss Blind always 300,000?, https://www.reddit.com/r/balatro/comments/1bkyqtg/is_the_ante_8_boss_blind_always_300000_or_did_i/ ↩︎
Berner, C. et al., Dota 2 with Large Scale Deep Reinforcement Learning, arXiv:1912.06680. https://arxiv.org/abs/1912.06680 ↩︎ ↩︎ ↩︎
Ng, A. et al., Policy Invariance Under Reward Transformations, ICML 1999. (potential-based reward shaping 理论基础) ↩︎
OpenAI, OpenAI Five, https://openai.com/index/openai-five/ ↩︎
Silver, D. et al., Mastering Chess and Shogi by Self-Play with a General Reinforcement Learning Algorithm, arXiv:1712.01815. https://arxiv.org/abs/1712.01815 ↩︎
Surag Nair, A Simple AlphaZero Tutorial, https://suragnair.github.io/posts/alphazero.html ↩︎
Narvekar, S. et al., Curriculum Learning for Reinforcement Learning Domains: A Framework and Survey, arXiv:2103.04794. ↩︎
DeepMind, AlphaStar: Grandmaster Level in StarCraft II, https://deepmind.google/blog/alphastar-grandmaster-level-in-starcraft-ii-using-multi-agent-reinforcement-learning/ ↩︎
Reddit r/reinforcementlearning, My Balatro RL project just won its first run, https://www.reddit.com/r/reinforcementlearning/comments/1m0te9n/my_balatro_rl_project_just_won_its_first_run_in/ ↩︎