开源一个翻翻棋 ai - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
请不要在回答技术问题时复制粘贴 AI 生成的内容
igofreely
V2EX    程序员

开源一个翻翻棋 ai

  •  
  •   igofreely 7 小时 33 分钟前 191 次点击

    目标就是能在天天象棋的翻翻棋里当外挂使,但是奈何本人水平有限,只能在新手场赢,普通场就打不过了。抛砖引玉,欢迎提 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 这三个文件,它们共同构成了规则、决策和交互的主干。

    igofreely
        1
    igofreely  
    OP
       7 小时 32 分钟前
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     892 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 23ms UTC 22:25 PVG 06:25 LAX 15:25 JFK 18:25
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86