# 用自动自我对局平衡 AI 卡牌游戏

> Moonfall 让游戏自己把比赛打完，并给每一场完成的比赛打分，好在玩家遇到之前就抓出含混的卡牌。

- Canonical: https://moonfall.io/blog/zh-CN/automated-self-play
- Published: 2026-07-09
- Updated: 2026-08-17
- Language: zh-CN
- Part of: Moonfall guides — https://moonfall.io/blog/zh-CN/
- Play: https://moonfall.io/play

![一位生翼的召唤者在云海之上举剑，衡量什么能通过、什么不能。](https://moonfall.io/assets/marketing/art/valkyrie-1920.webp)

*每一场完成的比赛都要先用同一套标准称过，游戏才会改动。*

Moonfall 的卡牌没有攻击力或生命值数值。[每一次出牌都是一段提示词](https://moonfall.io/blog/zh-CN/what-is-an-ai-card-game)，由 [AI 游戏主持](https://moonfall.io/blog/zh-CN/ai-game-master)当场决定它做什么。这就产生了一类单元测试抓不到的缺陷：卡牌这样写，故事那样暗示，局面却落在第三个地方。这三样要等一场比赛走完才会缠到一起。而且故事并非一次性的——一场完成的比赛可以变成有人分享出去的[漫画故事书](https://moonfall.io/blog/zh-CN/share-your-story)。

## 让游戏自己去玩

自动自我对局把没有真人坐在里面的 Moonfall 比赛完整跑完。真实服务器上由两个 socket 客户端占据玩家的位置，模拟玩家从合法着法中挑一个，故事系统则完全按照正式对局的方式把它结算掉。没有任何东西被 mock，所以不会出现这里通过、生产环境失败的情况。

比赛以批次为单位并行运行。一场奇怪的比赛什么也说明不了；同一种奇怪出现在二十五场中的六场，那就是一个可以去找的缺陷。

每场比赛都会留下一份轨迹：初始状态、每一个动作、故事系统的调用、它发出的补丁，以及局面最后真正落在哪里。把这些放在一起比对，才能把"刚才感觉不对"变成"第七回合的补丁移除了一张故事里从未提到的牌"。

![展示并行比赛经由 Moonfall 服务器与故事系统流向轨迹捕获、LLM 裁判、改动队列和护栏约束应用的示意图。](https://moonfall.io/assets/marketing/selfplay/selfplay-harness-overview.svg)

*这里没有任何 mock。测试框架走的是正式对局完全相同的服务器路径。*

## 给结果做评判

完成的比赛会走一段很短的阶梯。先是确定性检查，因为程序能拍板的事不该拿来争论。剩下的交给 LLM 裁判：它不打十分制的分数，而是回答二选一的问题，并引用决定该答案的那个回合。这两点都遵循了关于 [LLM 评估](https://hamel.dev/blog/posts/llm-judge/)和[先推理再打分](https://arxiv.org/abs/2303.16634)的公开建议。

最要紧的是通常被交给感觉的那一半：是否真的出现过令人意外的时刻，恐惧是文字挣来的还是只是宣称的，结算有没有尊重卡牌名字所许诺的东西。重复出现的发现会变成小提案，受限的改动在护栏下自动应用，并留下审计记录供监控和可选的介入。

![展示 Moonfall 评判阶梯的表格，列出每一级运行什么、回答哪个问题、判定是什么形态。](https://moonfall.io/assets/marketing/selfplay/selfplay-judging-ladder.svg)

*确定性检查先行，可被证明的违规不会送到一个能与之争辩的模型手里。*

## 十个批次显示了什么

![十个 Moonfall 自我对局批次中故事系统估算准确率、惊喜时刻和自然情绪的折线图。](https://moonfall.io/assets/marketing/selfplay/quality-signals-real-data.svg)

*惊喜那条线一路蹿升；准确率那条线经过此前多轮运行已处于高位，爬升得更慢。*

每个点是一个二十五场的批次。只有完整跑完的比赛才计分。

故事变得意外得多。第一个批次里，裁判在 44% 的比赛中找到了真正令人意外且公平的时刻；最后两个批次则是 95%，然后是 100%。准确率如今提升得更慢——此前的多轮运行已经把它显著拉高，十个批次中始终保持在 92.6% 到 97.1% 之间。

两点说明。这里的准确率是估算值：从未被关联到已登记正确性缺陷的故事系统调用所占的比例，更适合用于批次之间的比较，而不是裁定任何单场比赛。另外，十个批次是试点：数百场比赛，而不是数十万场。

## AI 卡组有可能在游戏里互相对战吗？

这套测试框架本身已经是一种**自走棋**：由 AI 操控的卡组彼此施压，故事系统叙述结果。它的某种形态放进 Moonfall 里也许会很有意思——人把注意力放在选牌和组卡上，而不是逐回合点击。这不是功能预告，只是这项工作在测试之外同样有意思的一个原因。

眼下它做的事要窄得多。Moonfall 本该让你意外，这套循环存在的意义，就是让那份意外来自比赛，而不是来自一张措辞含混的卡牌。
