Core Conclusion (Top of the Pyramid)
To stably achieve a 99% Ante 8 clear rate on Balatro White Stake, end-to-end deep reinforcement learning (such as PPO) is not viable. The feasible route is “hierarchical architecture + hybrid search”:
- Tactical layer (within a single round): model “selecting and playing cards” as a combinatorial optimization problem, and use MCTS or exact enumeration to find an approximately optimal solution—but note that this layer cannot be solved independently of the strategic layer (see §3.3: accumulating jokers give tactical actions long-term consequences)
- Strategic layer (across rounds + shop): this is where RL should really focus—building (joker selection), resource management (gold/draws/discards), risk control, and providing long-term value estimates $V(s’)$ to the tactical layer
- Reward shaping: the sparse “clear” signal must be densified, but we must also avoid the agent learning to “farm score” instead of “clear”
We break it down layer by layer below. First, clarify why this goal is both hard-core and feasible.
I. Calibrating the Goal First: What Does a 99% White Stake Clear Rate Mean?
1.1 Difficulty Baseline (Human Level)
White Stake is Balatro’s lowest difficulty (no stake modifiers). But even so, clearing Ante 8 is by no means easy. According to community statistics 1:
| Player Tier | White Stake Clear Rate |
|---|---|
| Casual players | ~20-30% |
| Experienced players | ~50% |
| Top players | ~80% (some decks such as Checkered can be higher) |
📌 Key Judgment: The 99% target is significantly above human top performance. It means the agent cannot rely on “lucky builds” and must systematically avoid death risks and maximize the expected clear probability of every decision. This is precisely RL’s natural advantage over humans—RL can optimize long-term expectation, while humans are limited by the emotion and visible horizon of a single run.
1.2 The Score Wall: The Hard Threshold of Ante 8
The score required by Ante 8 Boss Blind on White Stake (Red Deck baseline) 2:
| Ante | Small Blind | Big Blind | Boss Blind |
|---|---|---|---|
| 1 | 300 | 450 | 600 |
| 4 | 8,000 | 12,000 | 16,000 |
| 8 | ~100,000 | ~150,000 | ~200,000+ |
Some bosses (e.g., The Wall) can push the Ante 8 score wall to 300,000 3. This means: entering Ante 7-8, the agent must have exponential score growth ability (xMult joker + hand upgrades). The build path chosen in the early-to-mid game already determines whether the late game can break through this wall.
II. Modeling the Game as an MDP: State, Action, Reward
This is the foundation of all RL work. The difficulty of Balatro lies in its decisions being hybrid, sparse, and highly build-dependent.
2.1 State Space $S$
A complete state needs to encode:
状态 = (
手牌(花色/点数/增强), # 当前可打出的牌
牌堆/弃牌堆(残差信息), # 推断剩余牌分布
当前 blind 目标分数 + 已得分,
剩余出牌次数 / 弃牌次数, # 资源
金币, # 商店购买力
当前 joker 列表 + 每张效果, # ★ 核心构筑,150+ 种
# ★★ 每张 joker 的运行时累积状态(如 Green Joker 当前 mult、Ride the Bus 计数、Supernova 永久加成)
# 这一项绝不能省——见 §3.3,它是跨回合耦合的根源
牌组(deck)构成, # 已增删/增强的牌
消耗品(塔罗/星球/光谱),
当前 ante / blind 类型 / Boss 效果,
商店内容(若在商店阶段)
)
Encoding Challenge: Joker effects are extremely heterogeneous (some add chips, some multiply mult, some trigger conditionally, some rewrite scoring rules such as Burglar / Eternal types). They cannot be simply one-hot encoded and require structured/embedded encoding—this is the focus of subsequent network design. More critically, every joker must also carry its runtime accumulated state (current mult/chips bonuses, trigger counts, etc.); otherwise the model cannot understand long-range investments such as “discard to stack buffs” (see §3.3 for details).
2.2 Action Space $A$ (There Is a Big Pitfall Here)
Balatro’s actions are phased and heterogeneous:
| Phase | Action | Action Count |
|---|---|---|
| Play | Select 1–5 cards and play them | $\binom{8}{1..5} + \text{ordering variants}$, but we only care about hand-type combinations, roughly $10^2$ |
| Discard | Select 1–5 cards to discard | Same as above |
| Shop | Buy joker / consumable / reroll shop / sell joker / skip | ~20-30 |
| Ordering | Reorder hand cards | Affects some jokers (e.g., left-to-right triggers) |
⚠️ Key Insight: The “combinatorial explosion” of playing cards is a false proposition. Selecting 1–5 cards from 8 gives $\sum_{k=1}^{5}\binom{8}{k} = 218$ combinations, and after excluding invalid hand types the actually valid plays are often only a few dozen. This subproblem can be solved by enumeration + exact scoring; no RL needed!
2.3 Reward $R$: The Design That Needs the Most Care
The direct reward is “clear = +1, fail = 0”. But this signal is too sparse—a run lasts 15–40 minutes with hundreds of decisions, yet there is only one terminal signal, making credit assignment nearly impossible.
Drawing on OpenAI Five’s experience in Dota 4, we must do reward shaping, but we must watch the direction:
| Shaping Item | Recommended? | Rationale |
|---|---|---|
| Clear +1 / Fail 0 | ✅ Terminal main signal | Must keep; defines “win” |
| Gold reward for defeating Blind | ✅ Weak | Aligns with in-game economy |
| Excess score over target | ⚠️ Use with caution | Easily causes the agent to farm score instead of surviving |
| Survive to next ante | ✅ Recommended | Densifies progress signal |
| “Power increase” after buying a joker | ✅ Recommended | Guides build quality |
| Remaining plays/discards | ⚠️ Weak | Avoid over-spending resources |
Core Principle (borrowing the zero-sum idea from OpenAI Five 4): The net effect of shaping rewards must not deviate from the “clear” objective. A practical approach is potential-based reward shaping $F = \gamma\Phi(s’) - \Phi(s)$, where $\Phi$ is a handcrafted or learned “clearance potential function” that theoretically does not change the optimal policy and only accelerates learning 5.
III. Algorithm Selection: Why Pure PPO Is Not Enough and Why an MCTS+RL Hybrid Architecture Is Needed
3.1 Why Pure End-to-End PPO Fails
Intuitively, Dota 2 succeeded with PPO, so Balatro should too? No. There are three reasons:
- Sample efficiency: Dota was built on 256 GPUs + 45,000 years of game experience 6. Although Balatro community simulators (such as Jackdaw) are fast, a single run is long and decisions are dense; stacking up to Dota’s scale is unrealistic.
- Precision of combinatorial actions: Playing cards is a discrete combinatorial problem; PPO samples from a stochastic policy and struggles to stably converge to “the optimal subset of the current hand”—which is exactly solvable exactly.
- Long-range dependency of builds: Which joker to buy in Ante 3 directly determines whether Ante 8 can be cleared. PPO’s credit assignment span is too large.
3.2 Recommended Architecture: Exact Tactical Layer + Learning Strategic Layer
Borrowing the core idea of AlphaZero—use search as a “policy improvement operator” and use the network to guide search 7 8—but hierarchical:
┌─────────────────────────────────────────────┐
│ 战略层(跨回合,RL 的主战场) │
│ - 商店决策:买/卖/跳过/重置 │
│ - 资源管理:金币、抽牌、弃牌的分配 │
│ - 风险控制:何时安全过 blind、何时贪分 │
│ 算法:PPO 或 AlphaZero-style 策略价值网络 │
└──────────────────┬──────────────────────────┘
│ (提供当前状态 + 战略意图)
▼
┌─────────────────────────────────────────────┐
│ 战术层(单回合内,组合优化) │
│ - 出牌选牌:从手牌中选最优子集 │
│ - 精确计分:含 joker 链触发顺序 │
│ 算法:精确枚举 / MCTS / 分支限界 │
└─────────────────────────────────────────────┘
Why does this division (preliminary idea) seem effective?
- The tactical layer seems “exactly solvable”—there are only 8 cards in hand, and the number of valid play combinations is only a few dozen; we can directly enumerate each combination’s actual score (considering all joker triggers) and pick the best.
- The strategic layer is where RL belongs—shop building and resource scheduling are the real long-term planning problems; RL learns “future-oriented” policies here.
- This seems to greatly compress RL’s action space and decision frequency.
⚠️ But this “division” has a fatal flaw; see the next section §3.3. The preliminary idea of “independently exactly solving the tactical layer” does not hold under Balatro’s real mechanics.
3.3 Key Correction: Cross-Round State Coupling Means the Tactical Layer Cannot Be Solved Independently
The above judgment that “the tactical layer is exactly solvable” only holds when pure scoring jokers (e.g., +chips, +mult) are present. But Balatro has a large class of jokers whose internal state changes with tactical actions and persists across rounds—this directly breaks the assumption of “single-round closure”.
Typical Example: Accumulating Jokers
| Joker | Mechanism | Cross-Round Impact |
|---|---|---|
| Green Joker | +1 mult per discard, -1 mult per play | The mult bonus permanently accumulates, affecting all subsequent rounds |
| Ride the Bus | +0.2 mult for each hand played with no face cards | Accumulates mult until playing a hand with a face card resets it |
| Banner | +30 chips per remaining discard | Discard count itself is a cross-round resource |
| Supernova | +mult permanently for the hand type scored this time | Permanent memory for the whole run |
| Mystic Summit | First few discards trigger +mult | One-time consumption, cross-round budget |
A concrete deduction (using Green Joker as an example): there is a sure-win pair in hand; playing it directly clears the blind. But if we discard twice first and then play the pair, this round permanently gains +2 mult, which persists to all subsequent rounds. The real decision is:
方案 A:直接出对子 → 过关,mult 不变
方案 B:先弃牌 2 次 → 攒永久 mult → 再出对子 → 过关,mult +2(全周期有效)
方案 C:弃牌 5 次 → 攒更多 mult → 但可能把好牌弃了,过不了关
“Whether to discard to stack buffs” is a long-term investment decision, not a single-round optimum. The assumption of “exactly solving the tactical layer” directly collapses when such jokers exist.
Conclusion: On the surface Balatro is a card game, but underneath it is actually a resource-management + long-term-investment game disguised as a card game. Many of its mechanics (accumulating mult, deck evolution, consumable investment) are essentially trade-offs of “sacrifice now for future returns”. RL is better than MCTS at this kind of problem—because MCTS excels at discrete adversarial search (Go), while RL excels at long-horizon investment planning and credit assignment.
3.4 Corrected Architecture: Tactical Layer Depends on the Strategic Layer’s Long-Term Value
In the original architecture the tactical layer was an “independent black-box solver”; after the correction it must be guided by the strategic-layer network, and the two layers are jointly trained end-to-end:
┌─────────────────────────────────────────────────┐
│ 战略层(RL:学习长期价值 V(s)) │
│ - 输入:完整状态(★ 含 joker 运行时累积状态) │
│ - 输出:V(s) = 期望通关率 │
│ - 用途:① 商店决策 ② 给战术层提供长期价值 │
└──────────────────┬──────────────────────────────┘
│ 提供 V(s') —— 操作后状态的价值
▼
┌─────────────────────────────────────────────────┐
│ 战术层(组合优化 + 长期价值引导) │
│ - 枚举出牌/弃牌组合 c │
│ - 对每个组合 c,精确计算综合价值: │
│ 单回合得分 + γ · V(操作后状态 s') │
│ - 选综合价值最高的组合 │
└─────────────────────────────────────────────────┘
Key Change: The tactical layer no longer pursues “highest single-round score”, but the combined optimum of “single-round score + discounted long-term value”. The long-term value of Green Joker’s “discard to accumulate mult” operation will be recognized and rewarded by the strategic-layer network $V(s’)$.
Impact on State Encoding: The input to the Set Transformer is no longer just “joker type embeddings”, but a joint embedding of “joker type + runtime accumulated state (current mult/chips bonuses, trigger counts, etc.)”.
Impact on Training: The two layers must be jointly optimized with gradient flow, approaching an AlphaZero-style “network guides search, search improves network” architecture—rather than “tactical layer independent, strategic layer independent”.
3.5 Concrete Network Design for the Strategic Layer
State encoding (the key innovation) uses Set Transformer / GNN to process the joker set, because joker order and combinations both matter:
joker 编码 = Transformer/SetEncoder(joker_embeddings)
全状态向量 = concat(标量状态, 手牌编码, joker编码, deck编码, 盲注信息)
↓
策略网络 π(a|s) → 商店动作分布
价值网络 V(s) → "从当前状态出发的期望通关率"
The value network $V(s)$ outputs the expected clear probability, which is exactly the quantity we ultimately want to maximize—letting the agent directly learn to evaluate “given my current build and situation, how confident am I of clearing Ante 8”.
IV. Training Pipeline: Curriculum Learning + Self-Play
4.1 Curriculum Learning
Don’t train on Ante 8 right away. Referring to general RL engineering experience 9:
- Phase 1: First train on Ante 1-3, letting the agent learn basic scoring and shop rhythm
- Phase 2: Ante 4-6, introducing build synergy and resource management
- Phase 3: Ante 7-8, focusing on breaking the score wall and Boss handling
- Phase 4: Full-ante random seeds, complete-run training
⚠️ Note: OpenAI Five did not use a hand-designed curriculum in Dota 4. But Balatro is different—its ante is a naturally increasing difficulty ladder, so exploiting this structure for curriculum learning is reasonable and efficient.
2.2 Self-Play + Opponent Pool
Because Balatro is a single-player versus stochastic environment (non-adversarial), no opponent pool is needed. But we can maintain a seed pool / difficulty pool: weightedly sample random seeds on which the agent tends to lose (rare boss combinations, bad shops) for prioritized experience—this is equivalent to transferring AlphaStar’s “exploiter” idea 10 to the single-agent setting.
V. Key Technical Risks and Mitigations
| Risk | Description | Mitigation |
|---|---|---|
| Simulator fidelity | Third-party simulators such as Jackdaw may differ from the real game | Do A/B validation with the real-game API (e.g., BalatroBot); align key scoring logic with unit tests against the official wiki 2 |
| Reward hacking | The agent may find simulator bugs or edge behaviors to farm score | Use clear/fail as the terminal signal; make shaping rewards zero-sum / potential-based; periodically audit agent behavior manually |
| Joker combinatorial space explosion | The strategic space of 150+ joker combinations is huge | Set Transformer encoding + transfer learning (first train on a small joker subset) |
| Insufficient handling of rare bosses | Extreme Ante 8 bosses such as The Wall (300k score) | Adversarial seed sampling, specifically hardening extreme scenarios |
| Overfitting to fixed randomness | RL may “memorize answers” on fixed seeds | Use a large number of random seeds during training, and a held-out seed set for evaluation |
VI. Is 99% Really Achievable? My Assessment
Achievable, but conditional:
- The randomness of White Stake is limited: shop items are random, but it is not adversarial—there are no “unwinnable seeds”. Theoretically almost every random seed has a solution; only the difficulty differs.
- Human top performance reaches ~80% 1, showing that the remaining ~19% of failures mostly come from suboptimal decisions rather than “dead seeds”. RL systematically optimizes long-term expectation, leaving room to eliminate that 19%.
- The bottleneck lies in long-term planning at the build layer, and this is exactly the strength of an AlphaZero-style “search + learning” architecture—MCTS can look ahead several rounds during shop decisions.
🎯 Realistic Expectation: With Jackdaw + exact tactical layer + AlphaZero-style strategic-layer hybrid architecture, after training for several weeks on moderate compute (single-machine multi-GPU), raising the White Stake Ante 8 clear rate from near 0% random baseline to 90%+ is supported by community precedent; pushing to 99% through adversarial sampling and architecture refinement is an aggressive but not fantastical goal.
There are already reports of RL projects achieving their first win in the real game 11, proving that this path works.
VII. Recommended Production-Ready Tech Stack
| Component | Recommended Solution | Notes |
|---|---|---|
| Simulator | Jackdaw (Python, Gymnasium) | First choice; native Python with no Lua dependency |
| Real-game interface | BalatroBot (JSON-RPC API) | Validate simulator fidelity |
| Tactical-layer solver | Exact enumeration + scoring simulation | Choosing 5 out of 8 is fully enumerable |
| Strategic-layer algorithm | PPO (Stable Baselines3) or AlphaZero-style | SB3 is quick to start; AlphaZero has higher ceiling |
| Network architecture | Set Transformer + MLP | Encode joker set |
| Training framework | Ray RLlib / CleanRL | Distributed training |
| Evaluation | Held-out 10k-seed clear rate | Prevent overfitting |
VIII. Summary: Three Sentences to Remember This Design
- The tactical layer cannot be decoupled from the strategic layer: accumulating jokers make single-round actions have long-term consequences (§3.3), so the tactical layer must be guided by the strategic layer’s long-term value $V(s’)$, and the two layers are jointly trained end-to-end.
- Be careful with reward shaping: densifying progress signals is fine, but the terminal signal must lock onto “clear” to avoid reward hacking.
- 99% on White Stake is achievable: because randomness is limited and human ~80% shows the remainder is caused by suboptimal decisions, RL’s optimization of long-term expectation has room to close the gap.
The next post will implement a minimal runnable Balatro RL demo (based on Jackdaw), write out the exact tactical-layer solver, and get the first baseline running. Happy hacking! 🃏
References
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. (theoretical foundation of 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/ ↩︎