实验室 · 弈戏

五子棋

十五路纵横,二百二十五个交点。规则一句话说得完——先把五颗棋子连成一条线的人赢。难的是,你想连的时候,对面也想连。

胜负已分
点棋盘交点落子。人机对战时,机器落子前会停顿片刻,那阵子棋盘不接受点击。
采用自由规则:不禁手,长连(六子及以上)同样算赢。

局 面

轮次
手数0
对局人机

设 置

对局方式
你执何子
改动设置会立即重开一局。

玩 法

规则短,变化长。
怎么赢 黑先白后,轮流在空的交点上落子。横、竖、右斜、左斜,任一方向先凑够连续五子者胜。本局用自由规则,不设三三、四四、长连禁手,六子连亦判胜——省去规则争议,落子只管往连处走。
落子 鼠标或手指点在交点附近即可,会自动吸附到最近的那一点。落下的最后一手,中心有一枚朱砂小点作记;分出胜负时,成五的那条线以朱砂标出。
两种对局 「人机对战」你与机器轮流走,可选执黑先行或执白后行;「双人同屏」两人共用一块屏幕,各走各的,机器不插手。
悔棋 人机对战一次退回两手(机器的一手连同你的一手),确保退完仍轮到你;双人同屏一次退一手。可一直退回开局。已分胜负的局面按下悔棋,可继续往下走。
棋盘 棋盘随窗口宽度伸缩,始终保持正方,缩放后自动重绘。棋局只存在这一次访问里,刷新即散。

机 器 怎 么 想

没有神经网络,只有一张棋型分数表。
先看死活 每步先扫两遍:自己有没有一子成五的地方,有就直接下;再看对手下一手有没有成五的地方,有就堵上。这两件事优先于一切评分。
棋型评分 把棋盘上每条线(十五行、十五列、四十二条斜线)转成 0 空、1 己、2 敌墙 的字符串,用下表的模式去匹配计数。攻守两侧各算一份,相减得出局面分。
棋型形状说明
连五111115000000已经赢了
活四011110400000两头都能成五,无解
冲四011112 / 1101190000只剩一处能成五,可堵
活三01110 / 01011080000不理会下一手就成活四
眠三001112 / 101016000被压住一头的三
活二00110 / 010103000发育中的雏形
眠二000112500聊胜于无
只看有人的地方 全盘二百二十五点,机器只考虑与已有棋子相距两格以内的空点,再按「己方得分 + 对方得分 × 1.05」排序,取前十个当候选。防守权重略高于进攻,故它宁可先拆你的三,也不急着走自己的二。
推演两层 对每个候选,假设己方落下后,再替对手挑六个最好的应手,取其中对自己最糟的那一种作为该点的真实价值——即两层 min-max。这一步专治「白冲一个四、被堵掉、白费一手」的毛病:冲四虽然分高,可对手一堵,两层之后分就掉下来了。
停顿 算完之后并不立刻落子,先等二百六十到四百毫秒。倒不是算得慢,是走得太快像在赶人。同分的点之间加了一点随机扰动,同样的开局不会每次都走出同一盘棋。

已 知 的 简 陋 处

写出来,免得你以为是 bug。
搜索只有两层,且没有算杀(VCF/VCT)。遇上蓄意做双三、双四的连环杀,它多半接不住。
评分表里各棋型分值是手调的经验值,不是训练出来的。个别局面会出现「明明该抢占要点,却去补了一个无关的二」。
不设禁手,对执黑一方略有偏袒——这是自由规则的固有偏差,正式比赛用的是有禁手的规则。
不存盘、不记谱、不联网。关掉页面,这盘棋就没有了。