简而言之

  • Tic-Tac-Chec(4×4 棋盘,双方各四枚棋子,四子连线取胜)在其 1998 年原始规则下已被强解:双方最佳着法下为和棋。
  • 残局库覆盖 2,476,597,610 个局面,全部 64 种首次落子都能保持和棋,开局阶段之后的局面有 91.5% 为和棋。
  • 这是一盘考验注意力的棋。一旦出现实质威胁,保持和棋的着法比例就从 93% 降到 25%,而和棋局面中的每个威胁都有解。
  • 被吃掉的棋子会回到手中,因此局面会重复出现;求解器从已结束的对局逆向推进,并把无休止的行棋判为和棋。

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

Tic-Tac-Chec 残局库棋盘上的一个和棋局面,黑方有十八个合法着法,但只有三个能保持和棋 黑方行棋。只有 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 个正是残局库中的两着内必负局面。

处于和棋局面中的每个实质威胁都有解。但更强的说法,即任何局面中的任何威胁都能被化解,并不成立。

这些是在完整结构索引上的计数,而不是对局面在人类对局中出现频率的估计。它们支持「考验注意力」的解读,但并不把它变成一个概率论断。

求解一个带环的游戏

棋子循环使棋局不会逐步收缩到残局。局面图中存在环,因此配合简单换位缓存的正向极小化极大并不安全:依赖路径的重复判定可能会渗入某个局面被存储的值。

每个值都以当前行棋方的视角给出。走一着之后,子局面属于对手。我把这一视角转换显式化,对整张图做逆向求解:

  1. 把已形成四子连线的终局标记为下一个该行棋方的负。
  2. 若存在任一着法使对手处于负,则把该局面标记为胜。
  3. 若所有合法着法都使对手处于胜,则把它标记为负。
  4. 重复直到没有任何值发生变化。所有未定的局面都是和棋:任何一方都无法把这张图逼入一个终局结果。

原始规则没有规定重复次数上限。残局库把无限的非取胜行棋判为和棋;由人类采用的重复规则可以提供终止条件。

表 局面数 表示方式
开局之后 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 年 Bobby Fischer 再版 宣称有新的兵首着走法和开局规则 未知 需要完整规则书并单独求解

原始规则单页写道,兵在远端反向,且只在「向前」移动时吃子,但从未用图示说明折返时的吃子。我采用了按行进方向的解读:它的吃子斜线随之转向。一份详细的法语转录和一个独立的可玩实现与此一致。设计者或出版方的直接裁定才能定论。

更严格的「仅去程」解读会移除 426,173,880 个合法着法,并改变 16,529,908 个局面的值。其中有些直接反转:9,366 个标准规则下的胜变成仅去程规则下的负,810 个负变成胜。开局结果仍是和棋,但由于数百万条表项不同,局面浏览器仍能辨识出变体。

结语

十六个格子就足以产生 24.8 亿个已索引局面,原因在于吃子是把子力循环利用而不是移除。正是这条规则造就了和棋背后的环,也造就了让守和变得困难的战术。

想与完整解法对局,可访问 tic-tac-chec.brianhliou.com。

资源: