关于这个游戏
井字棋是在3x3的格子里轮流落子的双人游戏:谁先把横、竖、斜中的任意一条线连成自己的3个棋子,谁就获胜。在本页面里你执X,电脑执O。棋盘很小,所有走法早已被完全算清,因此它也常被用来入门理解"程序是怎样向前推算的"。可以拿来休息时玩一局,也可以用来向孩子讲解"多想一步"的思路。
游戏玩法
- 你执X,电脑执O。默认由你先手,在"先手方"菜单里可以改成电脑先手,切换后会重新开局。
- 获胜的线共有8条(3横、3竖、2斜),任意一条连成3个相同的棋子即刻获胜。
- 9格全部下满而无人连成一线,则为平局。
- 可以点击或轻触格子,也可以用Tab键移动后按Enter或空格落子。电脑"思考"的约0.3秒内点击无效,因此连点不会重复落子。中途点"新游戏"会同时取消电脑尚未走出的那一步。
- 战绩只保存在当前打开的页面里,刷新或关闭标签页后清零,不会上传服务器,也不会在设备间同步。
三档难度的原理
- 简单:电脑在空格中等概率随机选一格。随机数使用浏览器的Math.random,适合游戏,但不能用于安全用途。
- 中等:每一步像抛硬币一样,各有一半概率走"最优步"或"随机步"。
- 困难:使用极小极大(minimax)算法,把所有后续走法推算到终局。赢的得分为"10减去盘面上的棋子数",输为"棋子数减10",所以能赢就选最快的赢法,必输时则选拖得最久的输法。若有多个得分相同的格子,会随机取其一,因此同一局面在不同对局中的应对可能不同。
一共有多少种对局?(构建页面时实际数出的数值)
9个格子轮流填满看似有 9! = 362,880 种顺序,但一旦有人连成一线对局就结束,所以实际可能的对局更少。以X先手、按规则穷举全部走法,最终得到255,168种不同的完整对局,其中X胜131,184、O胜77,904、平局46,080。这些数字由与游戏本身相同的规则自动计算,并非手工填写。先手获胜的对局更多,但那说的是双方都乱点的情形。
| 结束时机 | 对局数 |
|---|---|
| 第5手结束 | 1,440 |
| 第6手结束 | 5,328 |
| 第7手结束 | 47,952 |
| 第8手结束 | 72,576 |
| 第9手结束 | 127,872 |
| 合计 | 255,168 |
对局最早也要到第5手才会结束(X的第3个棋子是全盘的第5手)。数量最多的是下满9手的127,872种。若改数"盘面"而不是对局,包括空盘和终局盘面在内共有5,478种;把旋转、翻转后重合的视为同一种,则只剩765种。盘面这么少,电脑才能把一切都算一遍还几乎瞬间回应。
对手乱下时的结果(精确概率)
下表假设X(先手)在空格中等概率随机落子,按电脑的不同难度,把所有可能对局的概率逐一相加。它是"不动脑乱点"时的基准线,并不是真人的实际胜率。"简单"是双方都随机的情形。
| 电脑难度 | X(你)胜 | 平局 | O(电脑)胜 |
|---|---|---|---|
| 简单 | 58.5% | 12.7% | 28.8% |
| 中等 | 28.0% | 18.5% | 53.5% |
| 困难 | 0.0% | 22.3% | 77.7% |
"困难"不会输给乱下的对手,也不会错过能连成线的机会;同时,你即使下得很好也无法战胜它,现实的目标是"不输"。
先手的开局与后手的应对
双方都走最优时结果是平局(对空棋盘求值的结果为平局(0))。格子从左上角起向右依次编号1到9。每个格子所在的线数不同:角3条、边中间2条、中心4条,中心牵涉的线最多。先手落第一子后,后手有多少种应对仍能保住平局,经穷举得到:
| 先手开局 | 所在线数 | 后手可选格 | 能保平的应对 |
|---|---|---|---|
| 角(例如1号格) | 3条 | 8格 | 1格 |
| 边中间(例如2号格) | 2条 | 8格 | 4格 |
| 中心(5号格) | 4条 | 8格 | 4格 |
先手若从角开局,后手只有一个安全应对:中心;其余7种应对在对手走最优时都会输。因此对先手而言,角开局最容易让对方出错。若先手从边中间(如2号格)开局,保平的应对是1、3、5、8号格;若从中心开局,则是四个角。这些是面对完美对手的理论值,不是人类对战的胜率。
取胜关键:双重威胁(分叉)
一步同时威胁两条线,让对方只能堵住其中一条,这就是"分叉"。下面是一个可以复盘的例子:X下1号(左上角),O回应对角的9号;X下3号,威胁1-2-3,O必须堵2号;X再下7号,同时威胁1-4-7和3-5-7。O即使堵了4号,X下5号即可连成斜线获胜。问题出在O的第一步:用角回应角开局会让对方得到这个分叉,用中心回应则不会。
怎样做到不输
- 后手遇到角开局,一定要占中心;遇到中心开局,则占任意一个角。
- 每一步按顺序检查:一、我现在能否连成一线?二、对手是否已有两子成线且第三格空着(有就堵)?三、都没有再考虑自己的计划。
- 提前一步识别对手的分叉:想想对手落在哪个空格会同时形成两个威胁,先占住那一格,或先制造一个逼对手必须应对的威胁。
- 先手后手都多练几局。"困难"在得分相同的格子里随机选择,所以每次的局面都可能不同。
常见误解与局限
- 井字棋是已被解决的游戏,面对完美对手没有必胜法;双方最优时最好的结果就是平局。
- "先手有优势"指的是对手可能失误的情形,双方都最优时先手后手都是平局。
- 本页的概率是在"对手随机"的假设下精确算出的,并非访客统计,页面也不收集任何对局数据。
- 电脑之所以强,是因为3x3棋盘极小。像五子棋这样棋盘很大的游戏,无法用同样方式在浏览器里搜索到终局。
常见问题
能赢"困难"难度吗?
只要电脑按设计运行就赢不了。双方最优时必然平局,而"困难"只选最优步。这一档的目标是平局;想赢请选"简单"或"中等"。
先手真的有优势吗?
在对手可能失误时有:双方随机时X约58.5%获胜、O约28.8%获胜。双方最优则是平局。先手的好处主要是给对手更多出错的机会,尤其是角开局。
电脑先手会更难吗?
稍难一些,因为你必须一开始就应对正确。电脑若走角,你要占中心。"困难"下空棋盘上每个开局格的评价相同,所以电脑会随机选一格作为开局。
一共有多少种可能的对局?
X先手、连成一线即结束的规则下共有255,168种不同对局,5,478种不同盘面(旋转和翻转视为同一种则为765种)。两个数字都是网站构建时自动算出的。
"中等"是怎么选步的?
每一步以各一半的概率选择最优步或随机步,因此同一局面在不同对局中可能得到强应对或弱应对。