斗兽棋(丛林棋)引擎:经典搜索胜过学习型评估
简而言之
- MistyJungle 是一款用 Rust 写的斗兽棋经典引擎,对阵我所能运行的最强开源引擎取得 W11-L2-D187,约合 +16 Elo。
- 在 800 个局面中有 779 个与精确四子残局库一致,且没有任何胜/和/负判断错误。
- 我原本看好的两项升级都没奏效:学习型评估始终没能胜过手工评估,而在搜索叶节点接入残局库反而损失约 13 Elo。
- 已发表的残局数据库止步于四子,完整游戏很可能会一直得不到解决。
我做了 MistyJungle,一款用 Rust 写的斗兽棋经典引擎,棋盘 7×9,英文里通常叫 Jungle 或 Animal Chess。你可以 在 Mistboard 上与 MistyJungle 对弈。它使用 alpha-beta 搜索、手工评估、重复局面处理,对弈版本中不含任何神经网络。
10 月 7 日更新:MistyJungle 已不再是 Mistboard 上最强的斗兽棋机器人。9 月,自我对弈神经网络 KataGo-AnimalChess 在 200 局中以 82-0 外加 118 局和棋击败了它,夺得最高席位;MistyJungle 现在是排在它下面、较容易对付的机器人。
结果幅度不大,但真实可靠。对阵我所能运行的最强开源引擎,200 局取得 W11-L2-D187,在这样一个和棋率很高的游戏里约合 +16 Elo;它的四子残局着法与精确残局库一致,没有任何胜/和/负判断错误。我原本看好的两项升级,学习型评估和搜索叶节点残局库,都没有奏效。真正起作用的是经典搜索。
我做了什么
一个独立的 Rust 引擎,带有一套精简的 UCI 风格协议,可以从命令行使用,也可以通过 PyO3 从 Python 调用。强度由节点预算决定,而不是时钟,所以同一个局面在任何机器上都会返回同样的着法。
技术栈很常规:带迭代加深的 negamax alpha-beta、Zobrist 置换表、对吃子和入穴着法的静态搜索,以及配合 PVS 和后期着法削减的 killer/history 着法排序,底层是一套手工评估,对子力、冲穴竞速、陷阱、水域和机动性进行打分。这些排序与剪枝的打磨在固定节点预算下实测值 +49 Elo。
在学习型修正能带来任何收益之前,评估本身必须准确。斗兽棋很看重子力,但充满尖锐的例外:鼠能克象,落入陷阱的棋子失去等级,一步踏进兽穴就结束比赛。
规格
双方各有八只动物,棋盘 7×9,走进对方兽穴或吃光对方所有棋子即获胜。规则因地区而异,所以具体采用哪一套很重要。我使用的是 2026 年 6 月时的 Mistboard 规则,其中狼大于狗(有些资料把两者对调)。其中一条规则后来改了:老虎原本只能纵向跳河,这个读法来自英文维基百科,而中文规则(腾讯 QQ游戏、莱顿大学的页面)给老虎和狮子同样的跳跃能力。Mistboard 和 MistyJungle 0.0.6 于 2026 年 9 月改用中文规则;本文中的对局是在旧规则下进行的。
吃子等级,由强到弱

象
狮
虎
豹
狼
狗
猫
鼠每种动物可以吃掉右边的动物。鼠还能吃象。位于对方陷阱中的棋子等级视为零。
除了单纯按等级吃子,还有三条规则塑造了这个游戏的战术:
- 鼠能吃象,但只限于陆地上。最弱的棋子可以吃掉最强的棋子。不过吃子不能跨越岸边,所以游进水里的鼠除了另一只鼠之外谁都吃不到。
- 狮和虎可以跳河。只有鼠能进入水中。大猫则可以整片河地跳到对岸,横向或纵向均可,除非水里有鼠挡住跳跃路线。
- 落入陷阱的棋子失去等级。每个兽穴周围的三格是陷阱。站在上面的敌方棋子等级降为零,任何棋子,哪怕是鼠,都能吃掉它。
完整规则和可对弈棋盘:mistboard.com/rules/jungle。
结果
在这样一个强引擎之间大多和棋的游戏里,这是一点小优势:
| 测试 | 结果 |
|---|---|
| 开源基准,200 局 | W11-L2-D187,约 +16 Elo |
| 搜索打磨(排序、PVS、LMR) | +49 Elo,配对自我对弈,p = 0.008 |
| 四子残局库校验 | 779/800 一致,0 处胜和负矛盾 |
| 五子和六子 | 对阵深 8 倍的搜索 >99%(代理指标,非证明) |
| 搜索叶节点残局库 | W37-L40-D3,约 -13 Elo |
| 残差神经评估 | 最好约 -70 Elo |
那个 +49 是最难测的。两个实力相当的斗兽棋引擎和棋太多,用胜率作为门槛不管用,所以我采用了配对、交换先后手的自我对弈(每个开局正反各下一遍,新搜索对旧搜索),并对分出胜负的对局做符号检验。
数据
残局与求解现状
小规模残局可以用逆向分析攻克,而且它们是极好的裁判。Van Rijn 和 Vis 于 2013 年在莱顿解决了四子残局(采用莱顿约定,狗和狼互换),此后我没有找到更大的已发表结果。我的引擎在 800 个局面中有 779 个与精确四子着法一致,没有胜和负矛盾,在五子和六子上与深 8 倍的搜索吻合度超过 99%。
四子数据库仍是当前的边界,越过它的那堵墙是存储,而不是求解技术。问题出在棋盘上:63 格,而翻棋斗兽棋只有 16 格,所以每多一个棋子就有约 60 个空格可站,而不是十来个,各层的规模增长大约快五倍。翻棋斗兽棋的五子在我笔记本上只占 2.8 GB;斗兽棋的五子则要大约 7 TB。八子及以上,也就是初始子力的一半,作为数据库已经遥不可及,也没有人给出完整十六子游戏的前向证明。斗兽棋解到四子为止,再往上仍未解决,而且很可能会一直如此。
2026 年 9 月 27 日更正:本文早先的版本称边界为七子。这个数字来自一篇 2019 年论文中的引用,核查后发现它指向莱顿一篇关于 Jungle Checkers 的论文,那是另一种游戏。
在搜索叶节点加载残局库同样没有提升棋力(约 -13 Elo):在能装得下的规模上搜索本来就能找到答案,而真正能帮上忙的规模又根本做不出来。有一点要提醒,来自翻棋斗兽棋那次构建:同样的实验一开始也读作零效果,后来发现是掩盖了一个 bug。那些表只存了胜/和/负而不带距离,只有胜和负信息的叶节点会让引擎把已经赢定的残局无限拖下去而不去终结,因为每一个获胜着法的分数都一样。给表加上将死距离之后,收官问题就解决了。我在斗兽棋这边的叶节点探查也只有胜和负信息,所以这 -13 里有一部分可能是同样的效应,而不是说残局库在叶节点没用。这一点未经验证;无论如何,发布的经典引擎不带这个探查。
学习型评估
卡住的是数据,不是架构。一个残差网络(手工分数加上一个有界修正)随着我修正标签,从 -470 爬升到约 -70 Elo,但始终没能胜过手工评估。标签最薄弱的地方,恰恰是网络最需要帮助的地方:和棋居多的自我对弈里子力波动的样本太少,精确残局库标签只覆盖小规模残局,而搜索分数标签主要是教网络去模仿它本来就有的搜索。
AlphaZero
仍是待做的工作。我没有完整跑过斗兽棋的 AZ 训练。相邻的翻棋 AZ 风险排查没有通过门槛,但那是另一个游戏,并不能否定 AZ 在斗兽棋上的可行性;斗兽棋的条件更友好:确定性、完全信息,没有随机节点翻开。我先搁置了,因为最便宜的那一档是负收益,而经典引擎已经打赢了基准。
对局示例
这场对抗赛大多是和棋,但分出胜负的几局显示出优势的形态:先是兽穴压力,其次才是子力。棋盘展示从转化点附近开始,想看开局可以往回翻;六局全部收录在 Mistboard 上的一个研究里。它们是在 Mistboard 2026 年 9 月之前采用的老虎仅可纵向跳河规则下进行的。
MistyJungle(黑方)建立子力优势,最终以狮子进入红方兽穴收官:
又一局黑方获胜,这次挤压更短,在陷阱周围的兑子之后,最后一枚棋子抵达 d1:
一局红方获胜,说明为什么不能只数子力:MistyJungle 子力亏损,却赢下了冲穴竞速:
保存下来最长的一局胜利,红方磨了 283 着才抵达兽穴:
引擎每着 8M 节点的自我对弈,每着约五秒:一场势均力敌的长局,红方守着一子优势走了四十回合,随后完成转化,把狮子送进黑方兽穴:
更富戏剧性的一局,同样是 8M 节点的自我对弈:红方任由黑方保住象、狮和虎,子力落后十六分,却靠一只鼠抢在子力发挥作用之前冲进兽穴取胜。这是对引擎真正在优化什么最清楚的说明:
结论
MistyJungle 是一款经典搜索引擎,对我所能运行的最强开源引擎有一点实测出来的微弱优势。真正提升棋力的工作都不起眼:正确的规则、固定预算的测量、交换先后手的测试、搜索打磨,以及残局验证。残局库作为裁判很称职,但放在叶节点没有帮助;神经网络的第一档输给了手工评估;而真正跑一遍 AlphaZero 仍是待做的工作。
资源:
- 在 Mistboard 上与 MistyJungle 对弈,或阅读规则。
- misty-jungle:引擎本体,Rust 实现。
- Layheng-Hok/Jungle-Chess:我用作固定基准的开源引擎。
- Bagheera:莱顿的闭源引擎,以及我用来评分的残局库。
- 引擎系列的更多内容:打造一个翻棋引擎,把同样的测量方法用在中国暗棋上。