九子棋攻略:成三、吃子与 50 手和棋(2026)
亲自试试 — 立即玩 九子棋
浏览器免费直玩,无需下载或注册。
js/engine.js;点按、撤销栈、提示与档位按钮在 js/main.js(均为 Playnesta 原创,MIT)。73 项无头 harness 本场重跑全绿;另一份策略探针直接 import 线上页面所加载的同一个模块,跑了 140 局带种子的 AI 对局(简单 80、中等 30、困难 30),把先手第一手分别钉在 24 个点上再跑 480 局,并手工摆出局面验证「磨坊保护」「飞子」「封锁」「双三连」「50 手判和」的边界。线上两个文件的 sha256 与本地测量副本相同(engine.js 558d3575…、main.js cac42545…)。游戏页讲的是点按与规则;本页是策略层:为什么一个磨坊只值一次吃子、该吃哪一枚、以及为什么这一版最强的 AI 会把棋下成和棋。九子棋是 14 世纪就有记录的公共领域玩法,mills、Mühle、jeu du moulin 都是同一游戏的其他叫法,不是本站的商标。
1. 棋盘是 24 个点、16 个三连,而且每个点都正好属于两个三连
这一版不是照抄一张邻接表,而是用坐标生成拓扑,所以数字可以重新数:
- 24 个点落在 7×7 的坐标上:外、中、内三层方框,加四条辐线。
- 32 条边:点只沿方框的边或辐线相连,没有一条线穿过空着的中心。
- 16 个三连:8 条横线加 8 条竖线,就是三层方框的 12 条边,加上四条辐线各自的上下/左右两半。
- 每个点正好属于两个三连(一横一竖)。不存在「属于更多三连的双三连点」——这张棋盘上 24 个点全是交叉点。
真正有差别的是出口数量。坐标 (0,0) 到 (6,6) 让每条边的中点看起来像路口,引擎也确实这么连:
| 点的类型 | 数量 | 出口(边数) | 位置 |
|---|---|---|---|
| 三层方框的角 | 12 | 2 | 外框 (0,0)、(6,0)、(0,6)、(6,6);中框 (1,1)、(5,1)、(1,5)、(5,5);内框 (2,2)、(4,2)、(2,4)、(4,4) |
| 外框与内框的边中点 | 8 | 3 | 外框 (3,0)、(0,3)、(6,3)、(3,6);内框 (3,2)、(2,3)、(4,3)、(3,4) |
| 中框的边中点 | 4 | 4 | (3,1)、(1,3)、(5,3)、(3,5) |
由此有两条对后文很重要的结论:
- 四个「四出口」点就是四条辐线三连的轴心。 四条辐线三连是 (3,0)-(3,1)-(3,2)、(3,4)-(3,5)-(3,6)、(0,3)-(1,3)-(2,3)、(4,3)-(5,3)-(6,3),它们的中点正好是这四个四出口点。棋子放在这里能朝四个方向走,放在角上只有两个方向。
- 图正中 (3,3) 不是点。 横竖两条辐线都停在内框的边中点上,所以每条长辐线被切成两个独立的三连,任何棋子都不会穿过中心。
页面用 700×700 的 viewBox、80 的边距、90 的步长画棋盘;棋子半径 26、点击热区半径 38,所以棋盘虽然不密,手机画面上每个点仍然点得中。
2. 三个阶段,其实是三种不同的棋
一局不是一种棋。合法走法生成器会切换两次,每个阶段奖励的习惯完全不同:
| 阶段 | 什么时候 | 能做什么 | 奖励什么 |
|---|---|---|---|
| 放子 | 任意一方手里还有子(各 9 枚,共 18 手) | 往任意空点放一枚 | 威胁:往已经有一枚的线里放第二枚 |
| 走子 | 双方手里都没子 | 沿一条线把棋子挪到相邻空点 | 封锁:把对方棋子的出口占掉 |
| 飞子 | 手里没子 且盘上正好 3 枚 | 三枚中的任意一枚走到任意空点 | 节奏:每手都是威胁,因为封不住 |
这一版的常数是每方 9 枚、连续 50 手无吃子判和(第 9 节)。没有停一手、没有跳过、也没有一手放两枚:一个动作换一个回合,成三后再加一次吃子。所以下面所有算术都很短——任何优势都只能用一手去买。
动手之前先记两条容易读反的边界规则:
- 飞子是「正好 3 枚」,不是「3 枚以下」。 4 枚时照常走子,2 枚时已经输了。探针确认
canFly在 3 枚时为真、4 枚时为假。 - 无路可走是输棋,不是跳过。 轮到的一方没有任何合法走法,棋局立刻判对方胜。探针跑的 30 局困难对局里有 2 局这样结束,都在放子阶段之后。
3. 一个磨坊只换一次吃子
自己三枚棋子连成一线就是磨坊,成三后可以吃掉对方一枚。整套计分就这一条:没有分数、放子阶段没有吃子、同一手成两个磨坊也没有额外奖励。
吃子有一条限制,也是新手最容易记反的规则:
只要对方还有棋子在磨坊之外,就不能吃对方磨坊里的棋子。
换句话说,磨坊不会让里面的棋子永久安全,只在对方还有自由棋子时保护它们。当对方所有棋子都在磨坊里,它们就全都可以吃。
这不是罕见的角落情况。探针的 140 局里,这条限制在简单档 967 次吃子中有 637 次生效(65.9%)、中等档 380 次中有 258 次(67.9%)、困难档 150 次中有 32 次(21.3%)。困难档比例低,是因为那里的磨坊本来就少(每局 4.87 个,简单档 11.72 个),吃子时常常没有对方的磨坊立着。实战含义:对方还有自由子时成三,你吃不到最想要的那一枚,只能吃自由子;等对方其余棋子都进了磨坊再成三,选择才会打开。
双三连也只换一次吃子。 一手放子可以同时完成两个三连:探针摆出白棋在 (3,0)、(1,1)、(5,1)、(3,2)、手里还有一枚的局面,放在 (3,1) 就同时完成了横线 (1,1)-(3,1)-(5,1) 和竖线 (3,0)-(3,1)-(3,2)。引擎只立一个「待吃子」标记、只列一次合法目标,吃完一枚就换手。没有第二次吃子,也没有额外回合。简单档 80 局里出现 3 次;中等、困难样本里 0 次,因为那两档 AI 不会把这种形状留在盘上。
所以一个磨坊的价值就是对方一枚棋子,这是唯一的计数单位。为了成三把两枚棋子的位置走坏的交易不划算;吃掉撑起对方磨坊的那一枚则很划算。
4. 放子阶段是一场「威胁拍卖」
威胁指的是:往这个空点放子就能成三。同一条线上有两枚自己的子,这条线就正好有 1 个威胁点;只有 1 枚,就没有威胁。所以放子阶段最小的有用单位,是同一磨坊里的两枚棋子。
算术很简单,也很无情:
- 每个点属于两个三连。第一枚棋子会带来四个能组成「二连」的伙伴点(两个三连各两个)。
- 两枚共享一个三连的棋子,只造出一个威胁点(这条线的第三点)。
- 一条三连线只有三个点,所以对方任意一枚棋子占住其中任何一个点,整条线就废了。隔着被占的点永远成不了三。
这就是「我要成三」本身不构成计划的原因。对方只要占住三个点里的一个就能封线,而最便宜的封法通常就是你正准备用的那个点。放子阶段真正的决策是:几条二连里保哪一条,以及同一枚棋子能顺手掐掉对方几个威胁。
探针的对局显示了转换有多快。第一次吃子出现的中位数是简单档第 7 手、中等档第 11.5 手、困难档第 20 手;放子阶段一共 18 手,所以困难档的第一次吃子通常在放子结束之后。而先成三的一方,赢下了简单档 78 局决出胜负中的 59 局(75.6%)、中等档 30 局中的 21 局(70.0%)、困难档 10 局中的 9 局(90%)。这是相关,不是因果——先成三的人往往本来就已经领先——但相关性足够强,值得把第一个磨坊当成计划目标。
5. 首着:测量不支持「开局定式」
每个点都属于两个三连,所以「抢交叉点」这类建议等于描述了整张棋盘,什么也没决定。探针检验了另一个流行说法——四个四出口点是最好首着——办法是把白棋第一手钉在 24 个点上,之后让简单档 AI 执双方各下 20 局,共 480 局:
| 第一手 | 局数 | 白胜 | 和棋 | 白负 | 胜率 |
|---|---|---|---|---|---|
| 四出口点(中框边中点) | 80 | 47 | 0 | 33 | 58.8% |
| 三出口点(外框/内框边中点) | 160 | 106 | 1 | 53 | 66.3% |
| 两出口点(角) | 240 | 142 | 6 | 92 | 59.2% |
四出口首着并没有赢得更多;三出口那一类反而最高,而单个点之间的差距(20 局里从 45% 到 95%)比类别之间的差距还大。这个样本量下,这就是噪声的样子,诚实的结论是:第一手不是决定胜负的地方。
困难档 AI 自己的行为也这么说。60 个种子下,它的首着落在 24 个点中的 23 个,同一个点最多选 5 次,(3,4) 一次都没被选过。它不是在囤某个「最佳格」,而是在一堆几乎等价的走法里按种子拆同分。
首着真正决定的是前两枚棋子的形状:
- 前两枚放同一条三连线。两枚棋子只有这样才能造出威胁;放在两条不同的线上,威胁是 0。
- 预期对方会封掉这条线三个点里的一个。封线很便宜,所以别把没被封的二连当成承诺。
- 四个四出口点留给走子阶段记:它们是唯一有四个出口的点,同时也是四条辐线三连的轴心。
6. 该吃哪一枚:拆威胁,别拆角
成三后可以吃子时,候选是对方的自由棋子(如果全在磨坊里就是全部)。最诱人的是角或边上看起来重要的那枚;更好的选择几乎总是位于对方「二连」里的棋子,因为吃它能消掉一个威胁,而不只是把数量减一。
这一版的 AI 大体按这个思路走,但并不完美,探针量出了差距。每次吃子,探针先数每个合法目标各自处在几个二连里,取最大值,再记录 AI 实际吃了哪一枚:
| 档位 | 吃子次数 | 吃了威胁最大的那枚 | 明明有更好的,却吃了零威胁的一枚 |
|---|---|---|---|
| 简单 | 717 | 500(69.7%) | 163(22.7%) |
| 中等 | 221 | 150(67.9%) | 68(30.8%) |
| 困难 | 106 | 64(60.4%) | 36(34.0%) |
两个读法都有用:
- AI 三次里有两次会吃威胁最大的那枚,所以照抄它的吃法是个不错的默认值。
- 但它三次里有一次会吃一枚无害的棋子,哪怕盘上有威胁。和 AI 下棋时这是白送的优势:它吃完之后先看你自己的威胁还在不在,很多时候还在。
给人用的清单很短。落手之前问三句:
- 这几枚里,哪一枚处在最多的二连中?吃它。
- 对方有磨坊时,是不是所有棋子都在磨坊里?不是的话,磨坊里的吃不了;别把这次吃子浪费在一枚什么威胁都不拆的自由子上。
- 吃掉这枚会不会打开对方需要的出口?吃掉那枚一直堵着你线路的棋子,有时比吃掉一个威胁更值。
7. 走子阶段:棋子比出口重要
最后一枚放完,棋就变了。此后每一手都是沿线滑动,无路可走的一方直接输。自然的直觉是数出口——自己的棋子旁边有多少空点——并认为越多越好。探针量了这个假设,它并不成立:
| 档位 | 放子结束时出口更多的一方赢下的决胜局 | 子力不等时,棋子更多的一方赢下的决胜局 |
|---|---|---|
| 简单 | 29 / 78(37.2%) | 38 / 46(82.6%) |
| 中等 | 9 / 30(30.0%) | 20 / 26(76.9%) |
| 困难 | 9 / 11(81.8%) | 3 / 4(75.0%) |
出口数量的方向会随档位翻转(简单、中等远低于一半,困难远高于一半),不是一个稳定信号。棋子数量不翻转:放子结束时棋子更多的一方,在各档都赢下约四分之三的决胜局。两个数字会打架,原因很机械:盘面越挤,出口越少。 棋子多的一方往往空间小,所以「出口多」常常是棋子少的症状,而不是位置好的证据。
实战含义:
- 先看子力。 一次吃子比一个好看的形状值钱。简单、中等档每局 12–13 次吃子就是棋局本身;困难档平均掉到 5 次,因为双方都不肯开线。
- 再看封锁。 封锁不用吃子就能赢。困难档 30 局里有 2 局以封锁结束;引擎把「没有合法走法」直接判为轮到的一方输。
- 四出口点是逃生口,不是奖杯。 (3,1)、(1,3)、(5,3)、(3,5) 上的棋子有四个方向可走,最难被冻住;角只有两个,单边被堵的角子几乎死定。需要一枚钉不死的棋子时用四出口点,不要为了收集而收集。
8. 飞子残局:三枚既是自由,也是危险
手里没子、盘上正好 3 枚时可以飞:三枚里的任何一枚都能去任何空点。探针验证了边界——3 枚能飞、4 枚不能——机动性也是真的。双方都只剩 3 枚时,盘上有 18 个空点,飞子一方最多有 54 个合法走法;同样局面下被堵住的走子棋子只有两三个选择。
在这一版里飞子不是稀罕事:简单档 80 局里 78 局、中等档 30 局全部、困难档 30 局里 20 局都出现过。原因是结构性的:胜利条件是「对方少于 3 枚」,所以只要不是和棋,败方一定经过 3 枚的局面,而且常常双方在终局前都到过 3 枚。
张力在于:3 枚也意味着再被吃一枚就输。飞子能逃开任何封锁,却扛不住一次成三——对方成三、你没有第四枚,被吃一口就剩 2 枚,棋就结束了。飞子残局里:
- 三枚别放在同一条线上。 三枚组成磨坊看着强,但也意味着三枚都被绑在一条线上;对方在别处成一个磨坊就结束了。
- 飞向能造威胁的点,不是飞向看起来最安全的点。没有东西可封时,节奏就是一切;一个威胁会逼对方应手。
- 盯着 50 手计数器(下一节)。只会来回挪的飞子一方,哪怕形状上「占优」,也会慢慢漂进和棋。
9. 50 手判和,以及困难档为什么总和
这一版在连续 50 个动作没有吃子时判和。探针把边界钉死了:已经 49 个安静动作的局面还没结束,第 50 个动作一落,胜者 0、原因 fifty。吃子会把计数器清零;放子和走子各加一。计的是动作不是回合,所以一次成三加它的吃子是两个动作,吃子本身重置计时。
就这一条规则,解释了三档之间最大的差别:
| 档位 | 局数 | 按棋子数结束 | 按封锁结束 | 和棋 | 每局吃子 |
|---|---|---|---|---|---|
| 简单 | 80 | 78 | 0 | 2 | 12.09 |
| 中等 | 30 | 30 | 0 | 0 | 12.67 |
| 困难 | 30 | 9 | 2 | 19 | 5.00 |
困难档 30 局里 19 局(63.3%)以 50 手和棋结束,平均每局只有 5 次吃子,而不是 12–13 次。机制不是 bug:深度 4 的 AI 把「被对方成三」估得太重,所以不肯开线;两台这样的 AI 可以挪 50 个动作,谁都不肯送出一个磨坊。简单档 AI 反过来会一头撞进磨坊,棋局就按棋子数结束。
对人有三条实际后果:
- 和棋是真实结果,不是失败状态。 和困难档下到没人开线,页面就判和。你没有「输」,你只是没能造出强制的磨坊。
- 对手消极时,主动制造接触。 子力领先时交换棋子,用自己的成三威胁逼对方花动作。每一次封线都是一个不重置计数器的动作;只有吃子能重置。
- 落后时别求和。 规则是对称的,落后一方有时能躲在和棋后面。要赢就得接受风险:开一条线、送出一个磨坊、进入吃子竞赛。
还有一个数字值得记住:先成三的一方赢下了困难档决胜局的 90%(10 局里 9 局)。困难档的局数少、时间长,但第一个磨坊仍然是决定它们的事件。
10. 操作、档位与页面上的数字
外壳刻意做得很小,每个操作都对应一种可测的行为:
- 撤销会退回你的一个动作 连同 AI 的应手。历史存的是每个动作之前的局面,所以撤销永远把回合还给你;它不能只退 AI 的那一步。
- 提示向困难档 AI(深度 4、14 万节点预算)要一手,高亮它并给结束卡片上的提示计数加一。它不改档位;中等局也能拿到困难档的提示。
- 档位按钮在简单/中等/困难之间循环并重开。改的是搜索深度(2/3/4)和节点预算(2 万/6 万/14 万),不是规则。简单档还会在「与最佳分差 30 以内」的前四手里随机挑,所以会撞进磨坊;中等、困难在 12 分以内拆同分,困难只在完全同分时随机。
- 颜色按钮换边并重开。执白你先走;执黑 AI 先走。上面的首着实验是白先,所以引用的胜率是白方胜率。
?level=easy、?side=black、?seed=7钉住一局。种子决定 AI 的同分拆分(mulberry32 流与手数混合),所以同一个种子加同样的走法会得到同样的应手。它不钉提示(提示走的是seed + 977加困难档)。- 战绩(各档胜–负–和)与手数、提示数只存在本机浏览器的 localStorage,不往外发。分析桥会发
game_load、第一次人手下发game_start、game_60s、game_restart,只有你赢时才发game_win。
下一局前的短清单:
- 前两枚放同一条线,这就是你的第一个威胁。
- 每次放子前数一遍对方的威胁;既能封对方又能补自己线的,就是盘上最好的一手。
- 成三后吃处在最多二连里的那枚,不是最近的角。
- 对方有磨坊也有自由子时,磨坊里的吃不了,把这次吃子用到别处。
- 走子阶段先数棋子,再数出口。
- 只剩三枚时,飞向威胁,不要飞向安全。
- 局面安静下来时,想起 50 手规则,主动制造一次吃子。
常见问题
九子棋怎么玩?
双方各 9 枚棋子。放子阶段轮流往空点放一枚;自己三枚连成一线就是磨坊,成三可以吃掉对方一枚。双方手里都没子后,每手沿一条线把一枚棋子挪到相邻空点。正好剩 3 枚时可以飞到任意空点。对方少于 3 枚或无合法走法时你获胜。这一版连续 50 个动作没有吃子就判和。
棋盘上有多少个点、多少个三连?
这一版生成 24 个点、32 条边、16 个三连。每个点正好属于两个三连(一横一竖)。16 个三连是三层方框的 12 条边加上四条辐线的 4 个半段;中心 (3,3) 不是点,所以两条长辐线被拆成各自独立的三连。
磨坊里的棋子能吃吗?
对方还有磨坊外的棋子时不能吃。对方磨坊里的棋子,只在至少还有一枚自由棋子时受保护。当对方所有棋子都在磨坊里,就全部可以吃。实测中这条限制在简单档 65.9%、中等档 67.9%、困难档 21.3% 的吃子里生效。
只剩三枚棋子时会怎样?
手里没子、盘上正好 3 枚时可以飞:三枚中的任意一枚都能去任意空点。4 枚时照常走子,2 枚时已经输了。飞子在简单档 80 局里出现 78 局、中等档 30 局全部、困难档 30 局里 20 局。
最好的第一手是哪?
测量不支持「最好的第一手」。把白棋第一手分别钉在 24 个点上跑 480 局,四出口点胜率 58.8%、三出口点 66.3%、角 59.2%——差距和噪声分不开。困难档 AI 在 60 个种子下的首着落在 24 个点中的 23 个。前两枚放同一条线,然后去下威胁。
为什么会下成和棋?
这一版在连续 50 个动作没有吃子时判和。吃子会清零计数器,每次放子和走子各加一。困难档 30 局里有 19 局这样结束,因为两台深度 4 的 AI 都不肯开线。和棋是这一版的规则,不是 bug,也不是输棋。
成三后为什么吃不到想要的那枚?
因为对方还有棋子在磨坊外。规则保护磨坊里的棋子,只要还有自由子,合法目标就只有自由子。想要磨坊里那枚,得先把自由的吃完,而这通常不止一个磨坊的代价。
AI 的三档有什么不同?
只改搜索,不改规则。简单档搜 2 层、2 万节点,在「与最佳分差 30 以内」的前四手里挑,所以会撞进磨坊;中等档搜 3 层、6 万节点,12 分以内拆同分;困难档搜 4 层、14 万节点,只有完全同分才随机。所以简单档会送磨坊,困难档能把棋走成和。
九子棋被解出来了吗?
这一页和这一版都没有。页面不带开局库,也没有残局表;AI 是带节点上限的深度 4 alpha-beta 搜索。关于「完美走法」的结论属于博弈论,不属于这一版的实测,我们在这里不下这个结论。
撤销和提示有代价吗?
撤销没有代价,而且永远把回合还给你(恢复你动作之前的局面,连同 AI 的应手)。提示只会计数:结束卡片显示你用了几次,但游戏不扣分,也不会在任何档位禁用提示。
能把 AI 钉住、复现一局吗?
可以。?seed= 钉住同分拆分的随机流,?level= 钉住搜索深度,?side=black 让 AI 先走。同一个种子加同样的走法会得到同样的应手;提示用的是自己的偏移(seed + 977),所以钉住对局不等于钉住提示。