关于 chess-best-move
这项技能指导从棋盘图片重建局面并求出合法走法,涵盖识别、局面校验、着法分析和输出格式检查。
主要功能
- 01识别棋盘网格与棋子位置
- 02校验棋子数量和 FEN
- 03目视比对重建棋盘
- 04检查候选着法是否合法
- 05遵循指定着法格式
适用场景
- 01分析图片中的棋局
- 02求解前验证重建局面
- 03查找满足目标的全部着法
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ letta-ai/ skills --skill chess-best-move安装后在 Claude Code 中输入/chess-best-move确认已加载。
详细介绍
国际象棋最佳着法
概述
本技能提供一种系统化方法,用于分析国际象棋棋盘图像并确定最佳着法。重点在于采用恰当的图像分析技术,避免一些常见陷阱,例如根据熟悉的棋题模式进行匹配,而不是分析实际局面。
核心工作流程
第 1 步:了解任务要求
开始分析前:
-
完整阅读任务要求,明确以下内容:
- 预期的输出格式(例如,以空格分隔还是以换行分隔的着法)
- 是否可能有多个获胜着法
- 要求的着法记谱法(例如
g2g4、Ng4或g4) - 解答的任何限制条件
-
留意任务是否提到:
- “多个获胜着法”——准备输出所有有效解答
- 特定的着法记谱格式——严格遵循该格式
- 时间限制(N 步将杀)——核实着法数
第 2 步:图像分析(关键阶段)
首选方法:系统化识别
不要尝试将图像与已知棋题进行匹配。应当:
-
先识别棋盘网格
- 确定 8x8 网格的边界
- 判断棋盘方向(a1 位于哪个角)
- 保存显示已识别网格线的调试图像,以便核验
-
系统地识别棋子位置
- 逐一分析全部 64 个格子
- 对于每个有棋子的格子,确定:
- 颜色(白方/黑方)
- 棋子类型(王、后、车、象、马、兵)
- 使用代数记谱记录结果(例如“白王位于 e1”)
-
验证识别结果
- 棋子总数必须 ≤32(如果识别出的棋子更多,则说明识别有误)
- 双方各必须恰好有 1 个王
- 双方各最多可以有 8 个兵、2 个车、2 个象、2 个马和 1 个后(升变棋子除外)
- 如果验证失败,应在继续之前改进识别方法
第 3 步:验证局面
计算着法前:
-
根据识别出的棋子构建 FEN 记谱
- 逐格构建局面字符串
- 如果可以确定,则包含易位权
- 如果相关,则包含吃过路兵目标格
-
验证 FEN 有效性
- 使用国际象棋库(python-chess)验证局面
- 检查局面是否合法(不存在不可能的配置)
- 如果 FEN 无效,则重新检查识别步骤
-
进行视觉核验
- 根据构建的 FEN 生成棋盘示意图
- 与原始图像进行视觉比对
- 如果两者不匹配,则迭代改进识别结果
第 4 步:计算着法
确认局面无误后:
-
使用国际象棋引擎或库
- python-chess 可以枚举合法着法并检查是否将死
- 对于“最佳着法”任务,可考虑使用 Stockfish 进行评估
- 对于“N 步将杀”任务,枚举所有可以将杀的着法
-
如有要求,找出所有获胜着法
- 如果任务提到多个解答,则找出所有有效着法
- 确认每个候选着法都能达成指定目标
-
输出前验证着法
- 确认每个着法在该局面中都合法
- 确认每个着法都能达成目标(将杀等)
第 5 步:输出格式
严格遵循预期的输出格式:
-
检查任务对格式的具体要求
-
常见格式:
- 以空格分隔:
g2g4 e2e4 - 以换行分隔:每个着法单独占一行
- 标准代数记谱:
Nf3、exd5 - 长代数记谱:
e2e4、g1f3
- 以空格分隔:
-
如果有多个有效着法,则按指定格式全部列出
需要避免的常见陷阱
1. 根据已知棋题进行模式匹配
**错误做法:**识别几个棋子后,就尝试与“著名棋题”数据库进行匹配。
**失败原因:**大多数局面都是独一无二的。即使几个棋子与某道已知棋题相符,完整局面也很可能不同。
**正确做法:**始终根据实际图像进行分析,不要先入为主。
2. 忽略检测失败
错误做法: 当检测结果不可能成立(例如棋子超过 40 个)时,仍使用不完整的数据继续操作。
失败原因: 错误输入导致错误输出。检测有误会导致着法错误。
正确做法: 如果检测结果不可能成立,就重新设计检测算法。检测通过验证之前,不要继续操作。
3. 确认偏误
错误做法: 只寻找支持预设观点的证据,同时忽略相矛盾的证据。
示例: 检测到 h5 和 f7 上有棋子后,立即得出“Legal's Mate”的结论,却没有检查其他格子。
正确做法: 考虑所有检测到的棋子。解决方案必须涵盖整个局面。
4. 循环验证
错误做法:
- 假设图像显示的是局面 X
- 在局面 X 上测试着法 M
- 确认 M 在局面 X 上有效
- 得出 M 正确的结论
失败原因: 这并不能证明实际图像的内容。
正确做法: 根据图像分析得出的局面进行验证,而不是依据假设的局面。
5. 遗漏输出要求
错误做法: 任务要求给出多个着法时,只输出一个着法。
正确做法: 完成输出前重新阅读任务要求。留意“所有制胜着法”或“多个解法”等表述。
6. 跳过棋子类型检测
错误做法: 只检测哪些格子被占据,不识别格子上的棋子类型。
失败原因: 不知道棋子类型就无法计算有效着法。计算兵的着法必须先知道它是兵。
正确做法: 检测必须识别每个被占据格子上的棋子颜色和类型。
验证清单
提交解决方案前,请确认:
- 检测得到的棋子数量有效(总数 ≤32,每方各有 1 个王)
- FEN 是根据检测结果构建的(而非假设得出)
- 已验证局面合法
- 视觉比较确认检测结果与图像相符
- 已在检测得到的局面上测试所有候选着法
- 着法实现了指定目标(将死等)
- 输出格式完全符合任务要求
- 如果存在多个着法,已全部列出
技术实现说明
推荐库
- 图像处理: OpenCV、PIL/Pillow
- 国际象棋逻辑: python-chess(处理 FEN、着法验证、将死检测)
- 引擎分析: Stockfish(通过 python-chess UCI 接口)
检测策略
- 使用颜色阈值分离浅色和深色格子
- 使用轮廓检测查找棋子形状
- 考虑将棋子模板与已知棋子图像进行匹配
- 始终生成调试可视化结果以验证准确性
调试方法
检测失败时:
- 保存显示以下内容的中间图像:
- 检测到的网格线
- 识别出的格子边界
- 带标签的检测棋子位置
- 先在已知局面上测试检测算法
- 根据对调试输出的目视检查,逐步改进