规格说明¶
本页说明项目应该提供什么行为。它关注系统接收什么、返回什么,以及维护者如何判断结果是否正常。
游戏规则¶
游戏使用 15x15 自由五子棋。黑棋先手。横、竖、斜任意方向五连或更多即胜。没有禁手。长连允许。
在人机模式中,人类执黑,AI 执白。AI 让人类先手,所以引擎必须重视防守,而不能依赖先手优势。
正常结果:轮到人类时,任何空交叉点都可以点击。形成五连后结束游戏,页面显示赢家,并保留棋盘用于复盘。
浏览器运行时¶
浏览器加载 index.html、JavaScript 模块、CSS 和生成的 Wasm 文件。页面必须通过 HTTP 提供,因为 Worker 和 Service Worker 在 file:// 下不可靠。
输入:仓库中的静态文件。
输出:可交互棋盘、模式菜单、搜索表和状态栏。
正常结果:选择模式后,模式菜单隐藏,棋盘接受合法点击,状态栏显示当前回合。
JavaScript 到 Rust 的数据流¶
JavaScript 发送给 Rust 的棋盘是 225 项数组:
index = row * 15 + col
black = 1
white = -1
empty = 0
Worker 还会发送 isBlackTurn、thinkTimeMs 和可选根节点分片。根节点分片是 Uint8Array,每个值都是 row * 15 + col。
Rust 返回 JSON 字符串。JavaScript 解析后更新棋盘、表格和热力图。
正常结果:AI 搜索结果包含落子、分数、完成深度、节点数、耗时、NPS 和热力图。没有可下点时返回 -1, -1。
搜索行为¶
引擎使用 VCF 连续冲四算杀、反杀防御检查、NegaMax 和 Alpha-Beta 剪枝。迭代加深保证时间到时仍有完整搜索结果。置换表减少一次搜索内的重复工作。
评估器识别立即胜、强制堵、活三、四连和断点四。VCF 模块会额外检查连续冲四强制胜,并在候选点下完后检查对手是否能立即胜或进入 VCF,避免主动进攻时被反杀。
正常结果:如果人类有一步成五的四连威胁,除非 AI 自己也能立即获胜,否则 AI 应该返回堵点。
热力图¶
热力图显示候选点的相对评分。它不是概率模型。
输入:Rust 返回的 heatmap 条目,每个条目包含行、列和分数。
输出:候选点上的红、黄、绿圆点。较高评分点可能显示数字。
正常结果:已经有棋子的点不需要热力图标记,最强候选点应该显示为绿色。
部署¶
GitHub Pages 提供站点。GitHub Actions 构建 Rust/Wasm 输出并上传静态产物。
正常结果:推送到 main 后,Pages 工作流应生成一个能打开游戏并加载 assets/wasm/gomoku_ai.js 的站点。