中国象棋 FEN 格式备忘
FEN (Forsyth-Edwards Notation) 是一种用字符串记录棋局状态的格式。
为什么用 FEN
- 紧凑:一串字符就能描述整个棋局,存数据库、URL、文本都方便
- 标准化:象棋软件、引擎、网站之间交换棋谱的通用格式
- 可恢复:随时能从 FEN 还原棋盘,不用从头播放走法
如何判断将军
FEN 只记录状态,判断将军需要解析后用代码实现。
基本思路:
- 解析 FEN,把棋子放到 9×10 的二维数组
- 找到将/帅的位置
- 遍历对方所有棋子,检查能否攻击到将/帅
伪代码:
1 | function isInCheck(board, kingColor) { |
每种棋子的攻击范围不同:
- 车:直线无阻挡
- 马:日字形(注意蹩马腿)
- 炮:直线,攻击时中间需隔一子
- 兵/卒:过河前只能前进,过河后可左右
- 将/帅:九宫内一步,不能对面(将帅照面也是将军)
将帅照面判断:如果两个将/帅在同一列,且中间无子,也算将军。
格式结构
1 | [局面] [走方] [无吃子步数] [回合数] |
局面编码
棋子用字母表示,红方大写,黑方小写:
| 红方 | 黑方 | 棋子 |
|---|---|---|
| K | k | 帅/将 |
| A | a | 仕/士 |
| B | b | 相/象 |
| R | r | 车 |
| N | n | 马 |
| C | c | 炮 |
| P | p | 兵/卒 |
- 数字表示连续空格数(如
9表示 9 个空位) /分隔各行,从红方视角从上到下(第 10 行到第 1 行)
初始局面
1 | rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1 |
逐行解读:
- 第 10 行:
rnbakabnr(黑车黑马黑象黑士黑将黑士黑象黑马黑车) - 第 9 行:
9(9 个空位) - 第 8 行:
1c5c1(空位、黑炮、5 个空位、黑炮、空位) - 第 7 行:
p1p1p1p1p(黑卒隔位排列) - 第 6-5 行:
9(楚河汉界,全空) - 第 4 行:
P1P1P1P1P(红兵隔位排列) - 第 3 行:
1C5C1(红炮位置) - 第 2 行:
9(空行) - 第 1 行:
RNBAKABNR(红方底线)
其他字段
- 走方:
w红方走,b黑方走 - 无吃子步数:用于判断和棋,通常 60 或 100 步无吃子判和
- 回合数:当前回合
其他编码格式
中文纵线格式
传统记谱法,也是最常见的棋谱记录方式。
格式:棋子名 + 纵线号 + 动作 + 目标位置
- 纵线:红方从右到左 1-9,黑方从右到左 1-9(实际上同一列号码相反)
- 动作:进(向前)、退(向后)、平(横向)
示例:
| 走法 | 含义 |
|---|---|
| 炮二平五 | 红炮从第 2 纵线移到第 5 纵线(同一横线) |
| 马八进七 | 红马从第 8 纵线前进到第 7 纵线方向 |
| 车一进六 | 红车从第 1 纵线前进 6 步 |
| 卒 3 进 1 | 黑卒从第 3 纵线前进 1 步 |
优点:人类易读,棋谱书都用这个。
ICCS 格式
国际象棋坐标改编,用字母表示列,数字表示行。
- 列:a-i(从左到右,红方视角)
- 行:0-9(从红方底线到黑方底线)
示例:h2e2 表示红炮从 h2 走到 e2(炮二平五)。
优点:格式简单,适合引擎通信。
UCCI 走法格式
通用中国象棋协议,引擎和界面通信用。
格式:起点 + 终点,坐标同 ICCS。
示例:h2e2
对比
| 格式 | 用途 | 可读性 |
|---|---|---|
| FEN | 局面快照 | 低 |
| 中文纵线 | 棋谱记录 | 高 |
| ICCS/UCCI | 引擎通信 | 中 |
示例
顺手炮开局(红方已走炮二平五,黑方炮 8 平 5):
1 | rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 1 2 |
同一走法用不同格式:
- 中文:
炮二平五 - ICCS:
h2e2 - UCCI:
h2e2