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

开源一个翻翻棋 ai

  •  
  •   igofreely · 3 小时 14 分钟前 · 126 次点击

    目标就是能在天天象棋的翻翻棋里当外挂使,但是奈何本人水平有限,只能在新手场赢,普通场就打不过了。抛砖引玉,欢迎提 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
       3 小时 14 分钟前
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1054 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 23ms · UTC 18:07 · PVG 02:07 · LAX 11:07 · JFK 14:07
    ♥ Do have faith in what you're doing.