中国象棋 FEN 格式备忘

FEN (Forsyth-Edwards Notation) 是一种用字符串记录棋局状态的格式。

为什么用 FEN

  • 紧凑:一串字符就能描述整个棋局,存数据库、URL、文本都方便
  • 标准化:象棋软件、引擎、网站之间交换棋谱的通用格式
  • 可恢复:随时能从 FEN 还原棋盘,不用从头播放走法

如何判断将军

FEN 只记录状态,判断将军需要解析后用代码实现。

基本思路:

  1. 解析 FEN,把棋子放到 9×10 的二维数组
  2. 找到将/帅的位置
  3. 遍历对方所有棋子,检查能否攻击到将/帅

伪代码:

1
2
3
4
5
6
7
8
9
10
11
function isInCheck(board, kingColor) {
const kingPos = findKing(board, kingColor);
const enemyColor = kingColor === 'red' ? 'black' : 'red';

for (const piece of getAllPieces(board, enemyColor)) {
if (canAttack(piece, kingPos, board)) {
return true;
}
}
return false;
}

每种棋子的攻击范围不同:

  • :直线无阻挡
  • :日字形(注意蹩马腿)
  • :直线,攻击时中间需隔一子
  • 兵/卒:过河前只能前进,过河后可左右
  • 将/帅:九宫内一步,不能对面(将帅照面也是将军)

将帅照面判断:如果两个将/帅在同一列,且中间无子,也算将军。

格式结构

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