在线分析 · 02

从 SGF 源码到 KataGo变化树

从 FF[4] 源文本开始,读懂节点、属性、坐标和分支,再从 OGS、KaTrain、Sabaki 或 SmartGo 导出棋谱,最后用 Read19 与 KataGo 分析。

  1. 先把 SGF 当作一棵文本树

    SGF 是 Smart Game Format 的缩写。一个文件可以装一盘或多盘棋;每盘棋放在一对圆括号中,分号开始一个节点,大写属性名后面的方括号保存属性值。最小结构可以写成 (;GM[1]FF[4]SZ[19];B[pd];W[dd])。

    语法可以从五个符号读起:圆括号包住一棵 GameTree,分号开始一个 Node,大写字母组成 Property 标识,方括号包住属性值,反斜杠负责转义。空格在属性值外通常不重要,值内则可能属于正文。一个 Collection 可以顺次包含多棵 GameTree,因此一个 .sgf 文件不一定只是一盘棋。不要把 SGF 当作逐行落子表;它是可递归分叉的语法树,评论、标记和变化都附着在具体节点上。

    AlphaGo 第二局的完整棋谱也是从 (; 开始:GameTree 包含根节点、实战节点以及可能的分析分支。
  2. 读根节点:先确认分析前提

    第一个分号后的根节点保存全局信息。FF[4] 是文件格式版本,GM[1] 代表围棋,CA[UTF-8] 是文本编码,SZ[19] 是棋盘尺寸;KM、RU、HA、PL、AB、AW、AE 决定贴目、规则、让子、先手方与初始局面。

    根节点的属性顺序通常不影响语义,但内容会直接改变分析前提。FF[4] 与 GM[1] 说明这是 FF[4] 围棋记录;CA[UTF-8] 防止中文评论乱码;AP 记录生成软件。SZ[19]、KM[7.5]、RU[Chinese]、HA[0] 决定棋盘和规则。让子局还要同时检查 HA、AB 与 PL:只写 HA[2] 却没有两颗 AB 初始黑子,棋盘仍然是错的。KM[0] 也不能因为值为零就被当作“缺失”并替换成默认贴目。

    先读 FF、GM、CA 与 AP,再读 SZ、KM、RU、HA、PL、AB、AW、AE;元数据不是装饰,而是 KataGo 的输入。
  3. 读着手:SGF 坐标不是棋盘坐标

    B[pd] 表示黑棋落子,W[dd] 表示白棋落子。SGF 从左上角 aa 数到 19 路棋盘右下角 ss,横纵坐标都使用连续小写字母,不会像常见棋盘坐标那样跳过 I。FF[4] 中 B[] 或 W[] 才是规范的停一手写法。

    SGF 的点由两个小写字母组成,先横轴、后纵轴,原点在左上角:aa 是左上,ss 是 19 路右下。它与棋盘显示坐标的方向和字母表都不同;显示坐标通常从左下计数并跳过 I,SGF 不跳。于是 AlphaGo 第 37 手在棋盘上显示 P10,在源文件中是 B[oj]。FF[4] 用 B[] 或 W[] 表示停一手;旧文件可能用 tt 表示 19 路停一手,那只是兼容写法,不应作为新文件的规范输出。

    同一着可以同时写作棋盘坐标 P10 与 SGF 属性 B[oj];两者方向、大小写和是否跳过 I 都不同。
  4. 读分支与标记:变化树从这里生成

    连续节点组成一条路径;同一节点后并列的圆括号形成兄弟分支,第一条通常是主变化。C 保存评论,N 命名节点,TR、SQ、CR、MA、LB 标记棋盘,AB、AW、AE 可设置局面。Read19 的变化树就是在可视化这棵树。

    在节点后写 (;B[oj]...) (;B[dc]...) 就得到两条兄弟变化;每条括号内部还可以继续嵌套。查看器通常把第一条分支当作主变化,但 SGF 语法保存的是树,而不是“视频进度”。C[文本] 属于当前节点,N 可以给节点命名;TR、SQ、CR、MA 与 LB 分别保存三角、方框、圆圈、叉号和文字标签。Read19 把这些节点关系映射成变化树,因此回到第 36 手再打开 P10、D13、E12,本质上是在同一个父节点下切换子树。

    源码中的并列括号对应变化树的三张分支卡;主线、候选线和自己的应手都不会互相覆盖。
  5. 从常见软件导出或复制 SGF

    OGS 在已完成对局的侧边栏提供 Download SGF;KaTrain 可按 Ctrl+C 把当前 SGF 复制到剪贴板;Sabaki 使用 File → Save As 保存 .sgf,也能打开 GIB、NGF 后转换;SmartGo 可用 Save As,SmartGo Kifu 则可从 My Games 选择对局后通过分享或邮件导出。

    导出时先找“当前对局”而不是截图功能。OGS 在已完成对局右侧弹出栏里提供 Download SGF。KaTrain 官方快捷键 Ctrl+C 会把当前完整 SGF 放进剪贴板,可直接粘贴到 Read19。Sabaki 的 File → Save As 可保存 SGF,还能先打开弈城类 GIB 或 wBaduk 类 NGF 再另存。SmartGo 桌面版使用 Save As;SmartGo Kifu 可在 My Games 中选择对局,再通过分享或邮件得到 SGF。菜单名称会随系统语言略有变化。

    OGS 下载文件,KaTrain 复制源码,Sabaki 转换 GIB/NGF,SmartGo 分享棋谱;最终交给 Read19 的都是 SGF 文本。
  6. 在 Read19 导入并用变化树做实验

    选择 .sgf 文件或直接粘贴以左括号开头的源码。先核对棋手、终局数手、SZ、KM、RU、HA 与初始摆子,再进行整盘轻量扫描。找到转折点后提高搜索量,把实战、KataGo 候选和自己的应手保存在同一分叉点下比较。

    导入成功只证明语法能读,不证明棋局正确。先把进度拖到终局,核对最后三至五手、总手数和胜负;再回根节点检查 PB、PW、SZ、KM、RU、HA、PL、AB、AW、AE。确认无误后才做整盘轻量分析,用胜率与目差找转折,再把更多搜索量集中到少数局面。变化树中先保留 AlphaGo 实战 P10,分别打开 D13 与 E12,再新增自己最自然的应手。比较每条线解决的威胁、先后手和弱棋,而不是背一串坐标。

    文件解析 → 元数据核对 → 整盘扫描 → 转折深算 →变化树对比分支;五层通过才是一轮完整分析。

规范与软件导出依据

  1. SGF FF[4] 官方规范
  2. OGS:从对局侧边栏下载 SGF
  3. KaTrain:SGF 剪贴板快捷键
  4. Sabaki:SGF、GIB 与 NGF 支持
  5. SmartGo:保存与导出帮助

导入后逐项确认

  • 源码以合法 GameTree 开始并能完整解析
  • 棋手、手数和终局数手与原对局一致
  • SZ、KM、RU、HA、PL 与初始摆子正确
  • 字符编码正确,中文评论没有乱码
  • 实战主线与变体没有被意外互换
  • 至少在变化树中测试一条自己的应手
打开 KataGo 分析样例