黑白棋 AI 的构成

黑白棋仿照围棋客户端制作,由 Qt 应用、VLM 服务器和网页对局(othello.mariago.kr)三部分组成。在网页上,人执黑,并从本地 AI 和 VLM 中选择对手。

与人对局的记录

网页上下完的对局共 31 局。人赢了 23 局,AI 赢了 7 局,1 局平局。

人赢的 23 局中,有 12 局在 9 步内结束。结果全是 13–0,棋盘上一颗白子都没有留下。着法顺序只有两种。

  • C4 C3 C2 C5 C6 D6 E6 F4 G4:8 局
  • D3 C3 B3 E3 F3 F4 F5 D6 D7:4 局

第二种是把第一种沿对角线翻转后的着法顺序。12 局全都来自同一个浏览器。有人找到一条路之后,就一次又一次地重走。

与人对局的 31 局
与人对局的 31 局

对手是谁

对局记录中没有留下对手是本地 AI 还是 VLM。尽管如此,这 12 局可以认为是本地 AI 下的,因为同样的着法顺序原封不动地重复了八次和四次。第 3 篇会写到,这段时间 VLM 服务器是随机选择着法的,而随机是不会重复出相同着法顺序的。

全灭的着法顺序只有两个

在本地 AI 执白时,我们把黑方能下的所有着法展开到第 11 步。让白方全灭的着法顺序正好有两个,与记录中留下的两种着法顺序相同。AI 身上的漏洞只有这两个,而有人找到了这些漏洞并一直赢下去。

这一阶段的实际代码

这是对局记录表。有着法顺序(moves)和结果(end_text),但没有对手类型。

othello-web/lib/db.tsts · 18 行
CREATE TABLE IF NOT EXISTS games (
  code TEXT PRIMARY KEY,
  guest_id TEXT NOT NULL,
  access_key TEXT,
  size INTEGER NOT NULL DEFAULT 8,
  board TEXT NOT NULL,
  to_play INTEGER NOT NULL,
  last_r INTEGER,
  last_c INTEGER,
  move_no INTEGER NOT NULL DEFAULT 0,
  epoch INTEGER NOT NULL,
  started INTEGER NOT NULL DEFAULT 0,
  status TEXT NOT NULL DEFAULT 'playing',
  end_text TEXT,
  moves TEXT NOT NULL DEFAULT '[]',
  created_at TEXT NOT NULL,
  updated_at TEXT NOT NULL
);

下一篇是“2. 只看一步的 AI:已部署的 AI 与源代码不同”。