Tic-Tac-Chec:规则与已被解决的游戏
Tic-Tac-Chec 给每位玩家四枚棋子,要求在 4×4 棋盘上连成四子。被吃掉的棋子会重新回到场上,兵会在棋盘两端之间往返,局面可以无限重复。
我强解了 1998 年的 Dream Green 原版游戏。双方最佳着法的结果是和棋。 该残局库收录了 2,476,597,610 个已索引局面,给出每一个合法着法的精确结果,并为每个必胜或必负局面给出到终局的距离。
可在下方探索。每个着法都按当前行棋方的视角标注结果。距离以着为单位,即一方走一步;和棋没有有限距离。
拖动棋子或点击排序后的着法即可跟进一条变化。绿色为胜,灰色为和棋,红色为负。
规则
每位玩家拥有一兵、一马、一象和一车。把四枚棋子排成一横行、一纵列或一条长对角线即获胜。
- 开局: 棋盘起始为空。前六着中,每位玩家各放置三枚棋子。
- 回合: 一旦解锁走子,玩家可以放置手中的棋子,或移动盘面上的棋子。此后再有吃子,走子依然保持解锁状态。
- 国际象棋式走法: 马、象、车按常规走法移动和吃子。没有王,也没有将军和将死。
- 棋子回收: 被吃的棋子回到其所有者手中,而不是从游戏中移除。
- 兵: 直走一格,斜前方吃子,到达棋盘任一端时反向。重新放置时其方向重置为朝向对手。
结果
空棋盘是和棋,全部 64 种首着放置都保持和棋。 在强制放置的开局阶段之后,游戏依然以和棋为主:已索引的开局后局面中有 91.51% 是和棋。
| 部分 | 胜 | 负 | 和棋 |
|---|---|---|---|
| 开局后 | 184,895,598 | 24,178,920 | 2,253,286,227 |
| 仅放置的开局阶段 | 147,472 | 30,468 | 14,058,925 |
数值均以行棋方视角计。胜表示该方能强制连成四子;负表示一切防守都失败。开局后最深的必胜在 41 着结束,从必负局面出发最长可抵抗 40 着。仅放置的开局阶段中最深的决定性局面达到 39 着。
和棋是什么样子
我从空棋盘提取了一条确定性的和棋变化。它走了 32 着后进入一个恰好 18 着的循环。棋盘、行棋方、手中棋子以及兵的方向全部重复。
这条变化上的某个局面比开局结果所暗示的要尖锐得多:
| 黑方的选择 | 着法 |
|---|---|
| 合法 | 18 |
| 保持和棋 | 3 |
| 两着内落败 | 15 |
黑方行棋。只有
a1-b2、d2-c2 和 c3-a2 是和棋;其余 15 个选择都会在两着内落败。
这条变化说明了结果。完整的胜/负/和棋表才是证明,它为每个和棋局面都提供了至少一种保和的续法。
一场注意力的较量
残局库可以检验一种更贴近人类的描述:这个游戏通常很宽容,但当对手排出三枚棋子时,你必须察觉到。
只有当对手存在一个能立刻连成四子的合法着法时,我才计为实际威胁。这就排除了那些具有误导性的三子排列:第四枚棋子被阻挡、兵的方向不对,或走子仍未解锁。两个相互独立的检测器在每一个已索引局面中都找到了完全相同的取胜着法。
| 在开局后的和棋局面中 | 结果 |
|---|---|
| 能保持和棋的合法着法 | 93.20% |
| 多数着法均为和棋的局面 | 94.63% |
| 所有着法均为和棋的局面 | 77.45% |
| 存在实际威胁的和棋局面 | 108,060,290 |
| 受威胁时能保持和棋的着法 | 25.12% |
| 只有唯一保和应手的受威胁局面 | 15.23% |
规律很鲜明:
- 通常宽松: 多数和棋局面中的多数着法都没问题。
- 局部强制: 一个实际威胁把保和的选择从 93.20% 的着法压缩到 25.12%。
- 并非总能防守: 开局后所有实际威胁中有 96.89% 存在安全应手。剩下的 3,762,536 个正是残局库中的两着内负局面。
处于和棋局面中的每一个实际威胁都有防守手段。而更强的说法(任何局面中的任何威胁都能被挡住)并不成立。
这些是基于完整结构索引的计数,而不是对局面在人类对局中出现频率的估计。它们支持「注意力游戏」这一解读,但并不把它变成概率论断。
解决一个带环的游戏
棋子回收使游戏不会逐步收缩到残局。状态图包含环,因此配合简单置换表的前向极小化极大算法并不安全:依赖路径的重复判定可能渗入某个局面所存储的值。
每个值都以行棋方的视角计。走完一着后,子局面属于对手。我采用逆向方式求解状态图,并显式处理这种视角转换:
- 把已连成四子的终局标记为下一位该行棋者的负。
- 当存在任一着法能让对手处于负局面时,把该局面标记为胜。
- 当每个合法着法都让对手处于胜局面时,把该局面标记为负。
- 反复迭代直到没有值再变化。所有未确定的局面都是和棋:任何一方都无法把状态图强行推向终局结果。
原始规则没有规定重复局面的上限。残局库把无限的非取胜行棋判定为和棋;人类的重复规则可以提供终止条件。
| 表 | 局面数 | 表示方式 |
|---|---|---|
| 开局后 | 2,462,360,745 | 带环状态图,按颜色互换与 180° 旋转归一化 |
| 仅放置的开局阶段 | 14,236,865 | 独立的六着无环表 |
每个局面由其棋盘布局和兵方向直接映射为一个整数。工作结果每个局面占一个字节:距离的奇偶性编码胜或负,另有一个编码表示和棋。
- 源表: 2.48 GB,含每个局面的结果与剩余距离。
- 浏览器表: 463 MiB,仅为决定性局面存储距离。
- 打包审计: 每一条压缩条目都与源表做了比对。
验证结果
正式求解在一台 M3 Max 上使用扁平字节数组完成。它按需生成 28,730,418,180 个开局后有向着法,而不存储边图,使整个求解能在一台笔记本上完成。
随后结果经过了若干独立检查:
- 值审计: 在全部 24.6 亿个开局后局面上重新生成每个合法后继局面,并在不使用求解器前驱计数器的情况下校验极小化极大方程。
- 距离审计: 在单独一轮中检查全部 209,074,518 个开局后决定性局面。
- 开局重放: 使用一个独立的可读规则引擎。
- 表示检查: 独立测试了编号/反编号、颜色归一化、兵方向以及生成的前驱边。
- 威胁普查: 两个独立检测器在每一个已索引局面上对立即取胜着法完全一致。
发布的表也带有自身标识。规则标签指明它是在哪个确切变体下求解的,内部的 CRC-64/XZ 校验和覆盖全部条目,因此浏览器绝不会悄悄地用一套规则的局面去查询另一套规则的表。
| 字段 | 值 |
|---|---|
| 规则标签 | 0x54544303 |
| 开局后局面数 | 2,462,360,745 |
| 仅放置阶段局面数 | 14,236,865 |
| 表 CRC-64/XZ | 0xeb952765179a695e |
在既有资料检索中,我没有找到更早的公开强解或弱解。这是一个有范围限定的否定结果,并不能证明无人私下解决过它。
哪一套规则?
本次求解针对的是 1998 年 Dream Green 版游戏。这个名字如今涵盖了不止一套规则:
| 规则集 | 兵/开局的解读 | 空棋盘 | 状态 |
|---|---|---|---|
| 1998,按行进方向 | 返程的兵按其当前方向吃子 | 和棋 | 标准残局库 |
| 1998,仅去程 | 返程的兵不能吃子 | 和棋 | 备选残局库 |
| 2025 年 鲍比·菲舍尔 复刻版 | 宣称有新的兵首着和开局规则 | 未知 | 需要完整规则书并单独求解 |
原始说明书写道兵在远端反向,且只在「向前」移动时吃子,但从未用图示说明返程吃子。我采用了行进方向的解读:其吃子斜线随之转向。一份详细的法语转录和一个独立的可玩实现都与此一致。设计者或出版方的直接裁定才能最终定论。
更严格的「仅去程」解读移除了 426,173,880 个合法着法,并改变了 16,529,908 个局面的值。其中有些彻底反转:9,366 个标准规则下的胜变成仅去程规则下的负,810 个负变成胜。开局结果仍为和棋,但由于数以百万计的表条目不同,浏览器依然能识别出是哪个变体。
结语
十六个格子足以产生 24.8 亿个已索引局面,原因在于吃子会回收棋子而非移除它们。正是这条规则造就了和棋背后的环,也造就了让保和变得困难的战术。
可在 tic-tac-chec.brianhliou.com 与完整解法对战。
资源:
- Tic-Tac-Chec 残局库浏览器:每个合法着法都按精确结果和决定性距离排序。
- 标准残局库 v1:463 MiB 的压缩残局库及 SHA-256 校验和。
- 求解器与研究记录:Rust 求解器、规则台账、验证测试和复现命令。
- 正式求解记录:局面数、耗时、审计与校验和。
- 生成的战略报告:完整的剩余距离直方图与重放的变化。
- 威胁与防守普查:穷尽式的着法宽度与立即威胁统计。
- 兵规则变体对比:两种兵解读之间的精确转变数量。
- Dream Green 原始规则:用于标准求解的第一手规则说明书。