GoForum🌐 V2EX

开源一个翻翻棋 ai

igofreely · 2026-03-22 22:54 · 0 次点赞 · 1 条回复

目标就是能在天天象棋的翻翻棋里当外挂使,但是奈何本人水平有限,只能在新手场赢,普通场就打不过了。抛砖引玉,欢迎提 PR 或提供加强 AI 的思路。

翻翻棋 AI 项目说明

这是一个基于原生 HTML 、CSS 、JavaScript 实现的浏览器版翻翻棋项目,包含完整的棋局规则、血量结算、候选棋子池、棋谱记录与复盘,以及多版本本地 AI 和可切换的远程 AI 接口。

项目目标不是只做一个可玩的棋盘,而是围绕“暗棋信息不完全 + 吃子博弈 + AI 决策”构建一个可持续迭代的实验场。

项目特点

纯前端实现,打开即玩,核心逻辑集中在少量脚本文件中。

棋盘为 4 列 × 8 行,包含暗子翻开、走子、吃子、炮跳吃等规则。

引入 HP 机制,不以“将死”判胜,而以“扣空对方总血量”判负。

支持本地 AI 与远程 AI 两种来源,并在远程失败时自动回退到本地策略。

本地最高版本 AI 支持 Web Worker 异步计算,避免阻塞主线程。

内置棋谱导出、导入、逐步复盘、自动播放等功能。

目录结构

项目当前结构如下:

darkchess/ ├─ index.html # 页面结构、控制区、规则展示 ├─ style.css # 棋盘、侧栏、状态面板、复盘区样式 ├─ game.js # 棋盘状态、规则判断、回合推进、快照与撤销 ├─ ai.js # AI 基类、本地多版本策略、远程 AI 适配 ├─ ai_worker.js # Worker 内运行的 AI 推理入口 ├─ gamelog.js # 棋谱记录、导出、导入与复盘引擎 └─ main.js # UI 渲染、交互事件、AI 调度、模式切换

架构概览

整个项目采用“界面层 + 游戏状态层 + AI 决策层 + 棋谱层”的轻量分层:

index.html / style.css

    |
    v
 main.js
    |
    +--> game.js      负责规则、状态、合法动作、胜负判断
    |
    +--> ai.js        负责本地 AI / 远程 AI 决策
    |      |
    |      +--> ai_worker.js 负责 Worker 异步推理
    |
    +--> gamelog.js   负责棋谱记录、导出导入、复盘
  1. 界面层

index.html 定义棋盘区域、HP 血条、AI 状态面板、候选棋子区、剩余棋子池、操作按钮和规则说明。

style.css 负责:

棋盘格与棋子视觉效果

选中、高亮、合法走法提示

AI 状态面板与来源切换按钮

候选棋子面板和复盘控制条

  1. 游戏核心层

game.js 是项目最关键的状态中心,主要职责包括:

初始化 8 × 4 棋盘

构造红黑双方完整棋子池

管理 4 个固定开局放置点

判断翻棋、走子、吃子的合法性

处理炮的隔子跳吃规则

记录每一步后的快照,用于悔棋和 AI 搜索

按 HP 变化判断胜负

Game 类同时提供了 AI 依赖的关键能力:

getAllActions():返回当前回合的所有可行动作

getValidMoves(row, col):返回指定棋子的合法走法

createSnapshot() / restoreSnapshot():给搜索和回放使用

getState():导出给远程 AI 的序列化局面

  1. AI 决策层

ai.js 里定义了整个 AI 体系:

AIPlayer:统一接口,所有 AI 都实现 getMove(game)

SimpleAI:基础启发式 AI

StrategicV2AI 到 StrategicV14AI:逐代增强的本地策略 AI

RemoteAI:通过 HTTP 调用外部 Python 服务获取动作

ai_worker.js 负责将部分本地 AI 放到 Web Worker 中执行。当前实现中,StrategicV14AI 被配置为 Worker 优先运行,以降低复杂搜索对界面流畅度的影响。

  1. 棋谱与复盘层

gamelog.js 提供两个主要能力:

GameLogger:记录开局、翻棋、移动、吃子、悔棋、胜负等事件,并导出 JSON 棋谱

GameReplay:基于棋谱重建局面快照,实现逐步回放和自动播放

游戏规则

当前实现的规则可以概括为:

棋盘与棋子

棋盘尺寸为 4 列 × 8 行。

双方棋子类型包括:将、仕、象、车、马、炮、兵。

数量配置为:将 1 、仕 2 、象 2 、车 2 、马 2 、炮 2 、兵 5 。

大小关系

将 > 仕 > 象 > 车 > 马 > 炮

兵可以吃将

将不能吃兵

这里的大小关系体现在普通棋子的吃子判定上:非炮棋子只能吃已翻开的敌方棋子,且满足大小比较规则。

炮的特殊规则

炮不能像普通棋子那样直接移动到空格。

炮只能“隔一个子”进行跳吃。

炮可吃已翻开的敌方棋子。

炮也可吃未翻开的暗子,但被吃暗子的真实身份需要从剩余棋子池中确定。

开局阶段

对局开始时并不是满盘布子。

系统固定 4 个开局放置点。

玩家在这 4 个位置依次从剩余棋子池中选择要放出的棋子。

红黑数量不受限制,属于当前玩法设计的一部分。

4 个位置放置完成后,游戏进入正式对局阶段。

回合行动

正式阶段每回合只能做一件事:

翻开一个暗子

或移动一个己方明子

或执行一次吃子

HP 机制与胜负

本项目不是传统“吃光棋子”或“将死”判定,而是采用总血量机制:

双方初始 HP 均为 60

各棋子 HP:将 30 、仕 10 、象/车/马/炮 5 、兵 2

吃掉一个棋子时,直接扣除该棋子的 HP

任一方 HP 先降到 0 或以下,则该方失败

这个设计让高价值棋子的重要性非常高,也直接影响 AI 的估值函数。

游戏流程

一次完整对局的流程如下:

玩家选择阵营,红方先手,黑方后手。

进入开局放置阶段,玩家依次确定 4 个固定点的明子。

放置结束后进入正式对局。

玩家和 AI 轮流进行翻棋、移动或吃子。

主界面实时展示血量、当前回合、上一步动作和剩余棋子池。

对局结束后可导出棋谱,后续也可以重新导入进行复盘。

AI 设计

AI 总体思路

这个项目的 AI 并不是单一算法,而是一套逐步演化的策略体系。

核心挑战在于:

局面存在不完全信息,暗子尚未翻开

翻子行为本身就是一种带概率性质的决策

HP 机制让“吃子收益”不等同于普通象棋中的单纯子力交换

炮、兵、将之间存在特殊克制关系

因此本项目的 AI 采用“启发式评分 + 战术覆盖 + 有限深度搜索”的混合思路。

SimpleAI

SimpleAI 是最基础的本地策略版本,特点是:

遍历所有合法动作

对翻棋、移动、吃子分别打分

对对手下一步进行浅层响应估计

选出综合评分最高的动作

它的启发式会考虑以下因素:

吃子获得的 HP 收益

子力价值差

是否会被反吃

炮架、空翻、邻近敌我棋子等局面因素

落后时的搏命翻子倾向

这类策略计算量小,响应快,适合作为基线和回退方案。

Strategic 系列

StrategicV2AI 到 StrategicV14AI 是持续增强的策略版本。虽然 README 不逐个展开每个版本的内部细节,但可以把它们理解为一条演化路线:

从单步启发式评分,逐步加入更多局面特征

强化对将、仕、兵、炮等关键子种的特殊战术判断

细化“是否安全”“是否互换有利”“是否保护重要棋子”等判断

在中后期减少纯随机性,提高确定性和稳定性

最终引入搜索,而不只是静态评分

StrategicV14AI

当前默认本地模型是 StrategicV14AI ,也是现阶段最强的本地 AI 。它的关键特征包括:

将 flip 和“炮吃暗子”的 poolIndex 纳入动作定义

使用 deterministic negamax + alpha-beta 剪枝

使用 transposition table 降低重复局面计算

使用局面评估函数代替早期版本偏随机的动作打分

保留高优先级战术覆盖逻辑,用于紧急防御或强制战术场景

这意味着 AI 不只是看“这一步值不值”,而是会在有限深度内搜索“走完这一步之后,接下来会发生什么”。

本地 AI 与 Web Worker

在 main.js 中,本地 AI 有两种运行方式:

普通模式:直接在主线程中实例化 AI

Worker 模式:通过 LocalWorkerAI 将计算委托给 ai_worker.js

这样做的目的很直接:

避免高阶搜索阻塞 UI

在较重的 AI 版本上保持棋盘动画与交互响应

在 Worker 失败时自动回退到主线程本地 AI

远程 AI 模式

项目还支持通过 RemoteAI 调用远程 Python 服务。

默认端点为:

http://127.0.0.1:8000/web/ai/move

健康检查: http://127.0.0.1:8000/health

远程模式的工作方式:

前端将当前局面 game.getState() 序列化后发送给后端。

后端返回 AI 动作。

如果远程服务不可用,前端自动回退到当前选择的本地 AI 。

UI 的 AI 状态面板会展示当前来源、服务状态和模型信息。

这个设计让前端既可以独立运行,也可以作为更复杂模型的可视化对战界面。

棋谱系统

项目内置完整棋谱能力,适合调试 AI 和复盘对局。

支持记录的内容

开局放置

翻棋

移动

吃子

悔棋

胜负与最终 HP

导出格式

棋谱导出为 JSON ,包含:

对局 ID

开始/结束时间

玩家与 AI 阵营

AI 模型与 AI 来源

最终胜者与剩余 HP

全部动作序列

复盘功能

导入棋谱后可进入复盘模式,支持:

回到起点

上一步

下一步

跳到结尾

自动播放

退出复盘

这部分能力对于分析 AI 行为和验证规则实现非常有价值。

关键文件说明

game.js

核心职责:

规则实现

局面状态维护

悔棋支持

AI 搜索快照支持

如果要修改玩法规则、棋子数值、合法行动范围,通常应先从这里入手。

ai.js

核心职责:

定义 AI 基类与所有策略版本

提供远程 AI 适配器

实现启发式评分与搜索逻辑

如果要增强 AI 强度、调整估值函数或接入新的后端模型,这里是主战场。

main.js

核心职责:

渲染棋盘与侧栏信息

响应点击、选择棋子、按钮操作

切换 AI 来源与本地模型

驱动 AI 回合调度

管理复盘模式

如果要改交互流程或 UI 行为,这里影响最大。

gamelog.js

核心职责:

棋谱记录

导出下载

导入重建

复盘快照生成

如果要做“对局分析面板”“胜率统计”“训练数据导出”,通常会以这里为基础扩展。

如何运行

仅运行前端版本

这是一个前端项目,但建议不要直接双击 HTML ,而是通过本地静态服务器运行。原因是:

Web Worker 在部分浏览器/安全策略下对 file:// 支持不稳定

远程 AI 接口需要通过 HTTP 调用

可选方式示例:

方式 1:使用 VS Code Live Server

直接在编辑器中启动 index.html

方式 2:使用 Python

python -m http.server 8080

然后访问

http://127.0.0.1:8080

启用远程 AI

如果你有对应的 Python AI 服务:

确保后端监听 http://127.0.0.1:8000

提供 /web/ai/move 和 /health 接口

在游戏界面的 “AI 来源” 中切换到 “远程 AI”

如果后端未启动,前端会自动回退到本地 AI 。

适合继续扩展的方向

如果后续继续演进,这个项目比较自然的扩展方向包括:

将更多 Strategic 版本统一整理成可配置搜索框架

为远程 AI 增加请求耗时、日志和错误细分展示

在复盘模式中加入局面评估、关键手标注和胜负转折点

把规则参数化,支持不同翻翻棋变体

为 AI 对局记录增加统计维度,用于自动评测不同版本强度

总结

这个项目的价值在于三点:

它是一个可玩的翻翻棋前端

它是一个可试验多种 AI 策略的对战平台

它已经具备对局记录和复盘能力,适合后续做分析与训练闭环

如果你准备继续开发,建议优先关注 game.js 、ai.js 和 main.js 这三个文件,它们共同构成了规则、决策和交互的主干。

1 条回复
igofreely · 2026-03-22 22:54
#1
添加回复
你还需要 登录 后发表回复

登录后可发帖和回复

登录 注册
主题信息
作者: igofreely
发布: 2026-03-22
点赞: 0
回复: 0