Skip to content

Repository files navigation

五子棋 · 对弈实验室

15×15 五子棋项目,提供双人对弈、人机挑战、连珠禁手,以及可开关的落点估值与绿点提示。

打开在线版 · 下载 v0.0.2

五子棋对弈界面

运行方式

方式 如何开始 落点评估
在线版 打开上方 GitHub Pages 链接 浏览器内 CPU 模拟
单文件版 下载或双击 index.html 浏览器内 CPU 模拟
本地模型版 Windows 上双击 start-gpu.cmd 同一预训练模型,可选 CPU 或 NVIDIA GPU 推理

建议使用较新的 Chrome 或 Edge 浏览器。GitHub Pages 只托管静态网页,无法运行本机 Python 模型服务;需要模型估值时,请在自己的电脑上启动本地模型版。在线版与单文件版仍可完整进行双人和人机对弈。GPU 服务默认仅监听 127.0.0.1:8766。

版本说明见 CHANGELOG.md。

玩法

  • 双人对弈:同一台电脑上轮流用鼠标落子。
  • 人机挑战:选择执黑或执白,然后点击棋盘交叉点落子。电脑始终使用原“挑战”档的搜索强度并自动应手。
  • 对局变化:默认“适度”,电脑会在战术上接近且不会让对方下一手直接成五的选点中随机应手;“固定”恢复相同局面下的确定走法,“丰富”扩大可选范围。电脑能立即获胜或必须挡住对方立即获胜时,仍优先处理这些战术。
  • 显示胜率开关:人机模式的设置里默认开启。开启后,把鼠标移到空位可查看模型预测胜率或 CPU 模拟估算;棋盘上的半透明绿点标记当前预测较高的几个候选点。关闭后,悬停数字、绿点及相关后台计算都会停止。
  • 胜率计算:从本地模型服务打开页面时,CPU/GPU 两个选项运行同一份预训练模型,默认选 GPU;切换设备不会清空棋局。直接打开 HTML 且未启动服务时,自动使用旧 CPU 模拟作为备用。模型只用于悬停和绿点的局面评估;电脑落子仍使用本项目的搜索引擎。
  • 模拟精度:仅在没有模型服务、使用旧 CPU 模拟时,可分别调整每局向后推演的手数、悬停估值的模拟次数,以及每个绿点候选落点的模拟次数。“自动”固定为 40 手、128 次悬停模拟、每个绿点候选 24 次模拟。更改后立即重新计算,不会清空棋局。模型评估不使用这三个模拟参数,服务连接后会隐藏它们。
  • 连珠禁手:在设置里开启后,黑棋不能下长连、四四、三三;白棋不受这些限制。设置变更会开始新局。本模式不含职业比赛的开局交换规则,极少见的多层假三判定尚未经过赛事级验证。
  • 悔棋:双人模式撤回一步;人机模式撤回上一轮双方的落子。
  • 桌面布局:采用 C 方案的棋谱研习界面。棋盘随窗口放大并完整留在屏幕内;标题、回合与手数位于右侧,棋谱、分析和设置在右侧切换;内容过长时仅滚动右侧内容,“悔棋”和“重新开始”始终可见。

模型服务连接后,无论选择 CPU 还是 GPU,普通落点显示的是同一模型的预测胜率,按模型的 0–1 价值输出换算成百分比;没有服务时才使用旧 CPU 快速模拟。模型预测与模拟估值不能直接互相比较。这个预测未经搜索和校准,99% 不代表实战中有 99% 的机会获胜。程序会先用规则检查直接成五和明显的两步必胜;这些已识别的战术结果显示确定的 100% 或 0%,并写明原因。绿点只是模型预测较高的候选,不能保证走下去会赢。

技术来源与计算方法

**电脑搜索和备用 CPU 模拟由本项目的本地 JavaScript 计算。**没有接入第三方五子棋引擎、开局库、ChatGPT API 或云端服务;双击 HTML 的备用模式断网可用。本地模型服务加载第三方预训练权重,并可选择 CPU 或 GPU 推理,见下文。规则实现参考国际连珠规则,具体代码在 src/engine.js。禁手模式采用其中的基本禁手逻辑,不包含职业比赛的开局交换流程;多层假三的极端局面尚未做赛事级验证。

电脑怎样落子

电脑先检查自己能否立即成五、对方下一手能否立即成五,以及自己能否落下一手后形成对方无法同时封堵的双杀点,再给棋子附近的合法空点打分。打分考虑活二、活三、活四、冲四、跳位威胁和防守价值。电脑固定采用原挑战档的 3 层负极大值搜索与 Alpha-Beta 剪枝。搜索末端会先判断轮到谁走、他能否立即获胜;若对手只有一个成五点,还会模拟当前行棋方在该点封堵后的局面,避免把可堵住的“跳四”误判成必胜。开启“对局变化”后,只在相近且不漏一手成五的落点中随机选择;确定的两步必胜优先于随机变化。电脑属于本地轻量棋力,不是职业级求解器。

用户提供的第 33 手局面中,旧版默认的“适度”变化可能选 J4,形成 E8–F7–G6–空 H5–J4;白棋 H5 就能封住唯一的成五点。除了把这种单点可堵的威胁高估,旧版还会把黑棋下一手才可能在 J8 做成活四当作既成优势,漏看白棋可以先占 J8。现在搜索末端会检查这类关键落点的封堵应手;复原该局面时,“适度”变化改选 G5 或 H5。跳四在与其他威胁配合时仍可能是合理手段,程序不会一概禁用。

无模型服务时的 CPU 模拟怎样得出

  1. 先按当前禁手设置检查这个落点;非法点不显示数值,落子直接成五则显示确定获胜。
  2. 把棋盘与落点按旋转、镜像统一为同一个标准形。因此对称棋局中的对称落点使用完全相同的模拟输入和随机序列,结果必须相同。
  3. 假设在该点落子,然后快速模拟后续对局。自动设置下默认模拟 128 局,每局最多向后模拟 40 手;这两项均可在设置中覆盖。玩家后续走法采用固定的进阶级策略;电脑后续走法采用挑战级策略。模拟始终遵守当前禁手设置。
  4. 一局模拟若分出胜负,玩家胜、负、和分别计 1、0、0.5。达到手数上限仍未分胜负时,用双方当前最佳战术落点的分数差,经 0.5 + 0.5 × tanh(分差 / 8000) 换成该局的近似得分。所有模拟得分取平均后乘以 100,界面逐批显示。

这个数字严格说是指定模拟策略下的平均得分估算。模拟策略与真实玩家不同,棋形评分也有偏差;增加次数只能降低抽样波动,不能把它变成数学上的必胜率。界面显示模拟次数,方便判断结果稳定程度。

棋盘绿点怎样选出

轮到玩家时,程序先按棋形评分从附近的合法空点选出约 10 个候选点;空棋盘则比较中心附近 3×3 的九个点。CPU 模式再按相同的模拟方法快速估算,自动设置下对每个候选点模拟 24 局;这个次数可独立调整。GPU 模式则批量使用模型预测。绿点显示其中预测最高的约五处,明显落后于最佳点的不会显示;同分的对称点会一起显示。模型输出保留推理原始精度用于排序,避免多个 99.9 以上的点先被四舍五入成 100 而按坐标错误排序。CPU 候选点在后台逐步比较,所以绿点可能在计算中变化。悬停的数字使用单独设置的模拟局数,最终可能与绿点快速估算的排序不同;绿点仅用于提示值得关注的位置。

预训练模型预测胜率

双击 start-gpu.cmd 启动本机服务。首次运行会建立 .venv 并安装 CUDA 版 PyTorch,下载量约 2 GB;模型权重已放在 models/iter_0150_15x15.pt。服务在 127.0.0.1:8766 打开页面后可选择“CPU 模型”或“GPU 模型”,两者加载相同权重。关闭服务窗口后,页面会明确提示并退回旧 CPU 模拟。

权重来自 GomokuZeroAI 的 15×15 模型,模型卡标注 MIT 许可;文件 SHA-256 为 23FA3409DA45A7FA3DFA14BA2FB9415F3B730C5F4299D51E46660045670030E6。本项目的 gpu_server.py 按作者公开的网络结构加载权重,使用 PyTorch CUDA 在本机 GPU 上批量推理。落子后的棋盘先统一到旋转、镜像标准形,确保对称局面的对应落点输出一致;按作者的输入说明,双通道依次是下一手行棋方及对手棋子,所以页面从刚落子者的角度显示 100 × (1 − 网络输出)。当前服务只运行一次价值网络前向计算,没有运行原项目推荐的蒙特卡洛树搜索;GPU 只加速该次推理,不会自动看穿后续棋步。

已知局限与复现:作者的模型卡说明棋力很依赖推理时的 MCTS 模拟次数,交互对弈建议 2000 次;此项目目前没有执行该搜索。我们用本项目的挑战档电脑执黑、白棋每步选模型预测最高的候选点做了本地复现:白棋中盘连续得到 99.5%、99.9% 乃至接近 100% 的预测,最后第 30 次白棋落子后黑棋取胜。这个反例说明模型输出虽是预测胜率,却不能当成经过实战校准的胜率;连续走绿点也可能输。之前的服务还把数值提前保留一位小数,导致多个高预测值候选被误判为同分;现在排序使用原始推理精度。重复评估同一个局面只会得到相同结果;提高质量需要让模型在不同的后续局面上反复推理,例如 MCTS,并在独立对局集上校准、验证。当前版本还没有完成这一步。

该权重按无禁手五子棋训练。开启连珠禁手后,当前落点仍由本项目规则检查并排除非法点,但网络没有学习后续禁手约束,其预测可能有系统偏差,界面会标明。模型模式不参与电脑应手;电脑固定使用原挑战档搜索,“对局变化”控制其随机应手。

单点悬停的计算量较小,GPU 数据传输的开销可能抵消并行优势;选择 GPU 不保证每次都比 CPU 更快。

计算设备

src/worker.js 在浏览器后台线程运行电脑搜索和备用 CPU 模拟,避免棋盘操作卡住。模型服务在 CPU/GPU 模式下分别用 PyTorch CPU/CUDA 推理;在 RTX 5070 Ti 上已验证 torch.cuda.is_available() 为真,并完成浏览器到 GPU 服务的悬停与绿点推理。当前不使用浏览器 WebGPU;直接打开 file:// 页面时使用备用 CPU 模拟。

开发与验证

对弈引擎、规则、CPU 模拟与后台线程仍使用本项目的 JavaScript。界面使用 React、Mantine 控件、Tabler 图标和 Inter 字体,由 esbuild 连同样式打包进单个 index.html;运行已构建页面不需要安装 Node 或联网。修改源码并重新构建需要 Node.js 与 npm。可选的本地模型服务需要 Python 与 PyTorch。

npm ci
npm test
npm run build
node tests/browser-smoke.mjs
py -3.14 -m unittest discover -s tests -p 'test_gpu_server.py' -v
node tests/gpu-browser-smoke.mjs

修改 src/ 后重新运行构建命令,生成可独立打开的 index.html。浏览器检查脚本需要本机安装 Chrome;GPU 浏览器测试还需要 .venv、CUDA PyTorch、NVIDIA GPU 和模型权重。

项目文件

路径 用途
index.html 已构建的单文件程序,也是 GitHub Pages 入口
src/、scripts/build.mjs、package.json 页面源码、Mantine 界面、棋局引擎、后台计算与单文件构建脚本
gpu_server.py、start-gpu.cmd、models/ 本地模型推理服务、Windows 启动器与预训练权重
tests/ 搜索、规则、模型接口与浏览器检查
.github/workflows/verify.yml 提交后自动运行单元测试并核对构建产物

项目代码和文档采用 MIT 许可;预训练权重的来源及许可说明见 THIRD_PARTY_NOTICES.md。

About

在线五子棋对弈实验室:双人对弈、人机挑战、禁手规则与落点胜率;支持本地 NVIDIA GPU 模型估值。

Topics

Resources

Stars

1 star

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages