目标就是能在天天象棋的翻翻棋里当外挂使,但是奈何本人水平有限,只能在新手场赢,普通场就打不过了。抛砖引玉,欢迎提 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 负责棋谱记录、导出导入、复盘
index.html 定义棋盘区域、HP 血条、AI 状态面板、候选棋子区、剩余棋子池、操作按钮和规则说明。
style.css 负责:
棋盘格与棋子视觉效果
选中、高亮、合法走法提示
AI 状态面板与来源切换按钮
候选棋子面板和复盘控制条
game.js 是项目最关键的状态中心,主要职责包括:
初始化 8 × 4 棋盘
构造红黑双方完整棋子池
管理 4 个固定开局放置点
判断翻棋、走子、吃子的合法性
处理炮的隔子跳吃规则
记录每一步后的快照,用于悔棋和 AI 搜索
按 HP 变化判断胜负
Game 类同时提供了 AI 依赖的关键能力:
getAllActions():返回当前回合的所有可行动作
getValidMoves(row, col):返回指定棋子的合法走法
createSnapshot() / restoreSnapshot():给搜索和回放使用
getState():导出给远程 AI 的序列化局面
ai.js 里定义了整个 AI 体系:
AIPlayer:统一接口,所有 AI 都实现 getMove(game)
SimpleAI:基础启发式 AI
StrategicV2AI 到 StrategicV14AI:逐代增强的本地策略 AI
RemoteAI:通过 HTTP 调用外部 Python 服务获取动作
ai_worker.js 负责将部分本地 AI 放到 Web Worker 中执行。当前实现中,StrategicV14AI 被配置为 Worker 优先运行,以降低复杂搜索对界面流畅度的影响。
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 调用
可选方式示例:
python -m http.server 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 OP |