九子棋 · 攻略

九子棋攻略:成三、吃子与 50 手和棋(2026)

slug: nine-mens-morris-beginner-tips · Last verified 2026-11-09

亲自试试 — 立即玩 九子棋

浏览器免费直玩,无需下载或注册。

玩 九子棋

2026 年 11 月更新 · 在 Playnesta 的九子棋(Playnesta 原创 MIT;24 个点、16 个三连、三档 AI)上实测 · 无头 harness 73 项 · 策略探针跑了 140 局带种子的 AI 对局、480 局固定首着的对局,并逐条验证规则边界 · 线上 engine.js 与 main.js 和本文测量的文件逐字节一致
方法:本页每个数字都来自线上 build,不来自设计稿。棋盘的拓扑、成三判定、吃子规则、AI 和判和规则在 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)

由此有两条对后文很重要的结论:

  1. 四个「四出口」点就是四条辐线三连的轴心。 四条辐线三连是 (3,0)-(3,1)-(3,2)、(3,4)-(3,5)-(3,6)、(0,3)-(1,3)-(2,3)、(4,3)-(5,3)-(6,3),它们的中点正好是这四个四出口点。棋子放在这里能朝四个方向走,放在角上只有两个方向。
  2. 图正中 (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 下棋时这是白送的优势:它吃完之后先看你自己的威胁还在不在,很多时候还在。

给人用的清单很短。落手之前问三句:

  1. 这几枚里,哪一枚处在最多的二连中?吃它。
  2. 对方有磨坊时,是不是所有棋子都在磨坊里?不是的话,磨坊里的吃不了;别把这次吃子浪费在一枚什么威胁都不拆的自由子上。
  3. 吃掉这枚会不会打开对方需要的出口?吃掉那枚一直堵着你线路的棋子,有时比吃掉一个威胁更值。

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 反过来会一头撞进磨坊,棋局就按棋子数结束。

对人有三条实际后果:

  1. 和棋是真实结果,不是失败状态。 和困难档下到没人开线,页面就判和。你没有「输」,你只是没能造出强制的磨坊。
  2. 对手消极时,主动制造接触。 子力领先时交换棋子,用自己的成三威胁逼对方花动作。每一次封线都是一个不重置计数器的动作;只有吃子能重置。
  3. 落后时别求和。 规则是对称的,落后一方有时能躲在和棋后面。要赢就得接受风险:开一条线、送出一个磨坊、进入吃子竞赛。

还有一个数字值得记住:先成三的一方赢下了困难档决胜局的 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。

下一局前的短清单:

  1. 前两枚放同一条线,这就是你的第一个威胁。
  2. 每次放子前数一遍对方的威胁;既能封对方又能补自己线的,就是盘上最好的一手。
  3. 成三后吃处在最多二连里的那枚,不是最近的角。
  4. 对方有磨坊也有自由子时,磨坊里的吃不了,把这次吃子用到别处。
  5. 走子阶段先数棋子,再数出口。
  6. 只剩三枚时,飞向威胁,不要飞向安全。
  7. 局面安静下来时,想起 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),所以钉住对局不等于钉住提示。

更多游戏

Playnesta 上更多免费游戏——选下一局吧。