实验室 · 弈戏
五子棋
十五路纵横,二百二十五个交点。规则一句话说得完——先把五颗棋子连成一条线的人赢。难的是,你想连的时候,对面也想连。
玩 法
规则短,变化长。
一怎么赢 黑先白后,轮流在空的交点上落子。横、竖、右斜、左斜,任一方向先凑够连续五子者胜。本局用自由规则,不设三三、四四、长连禁手,六子连亦判胜——省去规则争议,落子只管往连处走。
二落子 鼠标或手指点在交点附近即可,会自动吸附到最近的那一点。落下的最后一手,中心有一枚朱砂小点作记;分出胜负时,成五的那条线以朱砂标出。
三两种对局 「人机对战」你与机器轮流走,可选执黑先行或执白后行;「双人同屏」两人共用一块屏幕,各走各的,机器不插手。
四悔棋 人机对战一次退回两手(机器的一手连同你的一手),确保退完仍轮到你;双人同屏一次退一手。可一直退回开局。已分胜负的局面按下悔棋,可继续往下走。
五棋盘 棋盘随窗口宽度伸缩,始终保持正方,缩放后自动重绘。棋局只存在这一次访问里,刷新即散。
机 器 怎 么 想
没有神经网络,只有一张棋型分数表。
一先看死活 每步先扫两遍:自己有没有一子成五的地方,有就直接下;再看对手下一手有没有成五的地方,有就堵上。这两件事优先于一切评分。
二棋型评分 把棋盘上每条线(十五行、十五列、四十二条斜线)转成 0 空、1 己、2 敌墙 的字符串,用下表的模式去匹配计数。攻守两侧各算一份,相减得出局面分。
| 棋型 | 形状 | 分 | 说明 |
| 连五 | 11111 | 5000000 | 已经赢了 |
| 活四 | 011110 | 400000 | 两头都能成五,无解 |
| 冲四 | 011112 / 11011 | 90000 | 只剩一处能成五,可堵 |
| 活三 | 01110 / 010110 | 80000 | 不理会下一手就成活四 |
| 眠三 | 001112 / 10101 | 6000 | 被压住一头的三 |
| 活二 | 00110 / 01010 | 3000 | 发育中的雏形 |
| 眠二 | 000112 | 500 | 聊胜于无 |
三只看有人的地方 全盘二百二十五点,机器只考虑与已有棋子相距两格以内的空点,再按「己方得分 + 对方得分 × 1.05」排序,取前十个当候选。防守权重略高于进攻,故它宁可先拆你的三,也不急着走自己的二。
四推演两层 对每个候选,假设己方落下后,再替对手挑六个最好的应手,取其中对自己最糟的那一种作为该点的真实价值——即两层 min-max。这一步专治「白冲一个四、被堵掉、白费一手」的毛病:冲四虽然分高,可对手一堵,两层之后分就掉下来了。
五停顿 算完之后并不立刻落子,先等二百六十到四百毫秒。倒不是算得慢,是走得太快像在赶人。同分的点之间加了一点随机扰动,同样的开局不会每次都走出同一盘棋。
已 知 的 简 陋 处
写出来,免得你以为是 bug。
一搜索只有两层,且没有算杀(VCF/VCT)。遇上蓄意做双三、双四的连环杀,它多半接不住。
二评分表里各棋型分值是手调的经验值,不是训练出来的。个别局面会出现「明明该抢占要点,却去补了一个无关的二」。
三不设禁手,对执黑一方略有偏袒——这是自由规则的固有偏差,正式比赛用的是有禁手的规则。
四不存盘、不记谱、不联网。关掉页面,这盘棋就没有了。