中国象棋棋谱格式说明

中文记谱法、FEN 局面格式、PGN 对局格式详解,以及系统中的导入导出使用方式

目录

  1. 棋盘坐标系
  2. 中文记谱法
  3. FEN 局面格式
  4. PGN 对局格式
  5. 系统使用方式
  6. 格式转换关系
  7. 常见问题

一、棋盘坐标系

1.1 标准棋盘

以下为标准初始局面棋盘,红方位于下方,黑方位于上方。棋盘四周标注了列号(红方中文数字、黑方阿拉伯数字)和行号(0-9):

1.2 棋盘结构

中国象棋棋盘为 10行 × 9列 的网格,中间有"楚河汉界"分隔。棋盘四周标注了列号(红方中文数字、黑方阿拉伯数字)和行号(0-9):

行号 0 ── 黑方底线(第1行) 行号 1 ── 行号 2 ── 行号 3 ── 行号 4 ── ─── 楚河汉界 ─── 行号 5 ── 行号 6 ── 行号 7 ── 行号 8 ── 行号 9 ── 红方底线(第10行) 列号: 0 1 2 3 4 5 6 7 8 ← ───────────────────────────── → 最左 最右

1.3 系统内部坐标

系统使用 board[row][col] 二维数组表示棋盘:

属性范围说明
row0-90=黑方底线,9=红方底线
col0-80=最左列,8=最右列

1.4 棋子编码

红方(大写)黑方(小写)棋子
Kk帅 / 将
Rr车 / 車
Nn马 / 馬
Bb相 / 象
Aa仕 / 士
Cc炮 / 砲
Pp兵 / 卒

二、中文记谱法

2.1 基本格式

中文记谱法是中国象棋最传统的记录方式,格式为:

棋子名 + 列号 + 动作 + 目标

示例炮二平五馬8进7車一平二

2.2 列号编号规则

红方和黑方使用不同方向的列号编号:

黑方视角(从左到右): 1 2 3 4 5 6 7 8 9 ↑ ↑ 最左 最右 红方视角(从右到左): 一 二 三 四 五 六 七 八 九 ↑ ↑ 最右 最左

对应棋盘列号(board col 0=最左, col 8=最右):

红方记谱棋盘列号黑方记谱
89
78
67
56
45
34
23
12
01

2.3 动作说明

动作含义说明
前进红方向上(row减小),黑方向下(row增大)
退后退红方向下(row增大),黑方向上(row减小)
横移列号改变,行号不变

2.4 目标表示

目标的表示方式取决于棋子类型:

棋子类型目标表示示例
车、炮、兵、将(直线移动)前进/后退的步数炮五进三(前进3步)
马、象、士(斜线移动)目标的列号馬二进三(目标列=三)
所有棋子(横向移动)目标的列号車一平二(目标列=二)

2.5 消歧规则

当同一列有多个同类棋子时,用"前/后"区分:

前車进一 ← 靠近对方的车前进1步 后車退二 ← 远离对方的车后退2步

消歧规则:

2.6 完整示例

1. 炮二平五 馬8进7 2. 馬二进三 車9平8 3. 車一平二 炮8进2

三、FEN 局面格式

FEN(Forsyth-Edwards Notation)是一种用单行文本描述棋盘局面的标准格式,广泛用于棋类软件间的数据交换。

3.1 格式结构

{棋盘局面} {走棋方} - - 0 {回合数}
字段说明示例
棋盘局面10行用 / 分隔,每行从左到右编码rnbakabnr/9/1c5c1/...
走棋方w=红方走棋,b=黑方走棋w
-占位符(象棋无特殊规则)-
-占位符(象棋无吃过路兵)-
半回合数通常为 00
回合数当前回合数1

3.2 棋盘局面编码

每行(rank)从左到右编码:

3.3 标准初始局面 FEN

rnbakabnr/9/1c5c1/p1p1p1p1p/9/9/P1P1P1P1P/1C5C1/9/RNBAKABNR w - - 0 1

逐行解读:

FEN棋盘内容
0rnbakabnr車馬象士將士象馬車
19全空
21c5c1_炮_____炮_
3p1p1p1p1p卒_卒_卒_卒_卒
49全空
59全空
6P1P1P1P1P兵_兵_兵_兵_兵
71C5C1_炮_____炮_
89全空
9RNBAKABNR車馬相仕帥仕相馬車

3.4 自定义局面示例

2baka3/3P3N1/bN7/7nc/9/4C1P2/P5n1P/B3R3B/4Apr2/2RAK3c w - - 0 1

四、PGN 对局格式

PGN(Portable Game Notation)是一种记录完整对局过程的标准格式,包含头部标签和走法文本两部分。

4.1 头部标签(Tags)

[Event "棋谱回放"] ← 事件名称 [Site "AI象棋"] ← 对局地点 [Date "2026.08.02"] ← 日期(YYYY.MM.DD) [Round "-"] ← 轮次 [Red "红方"] ← 红方棋手 [Black "黑方"] ← 黑方棋手 [Result "1-0"] ← 对局结果 [Title "气吞关右"] ← 棋局标题(扩展) [Source "适情雅趣"] ← 来源古谱(扩展) [FEN "..."] ← 初始局面FEN(扩展)

结果值

含义
1-0红方胜
0-1黑方胜
1/2-1/2和棋
*未结束 / 未知

4.2 走法文本

走法使用中文记谱法,红黑交替,每步用步数编号:

1. 炮五平九 馬7进5 2. 兵六进一 將5平4 3. 車七进九 象1退3 4. 炮九进五 象3进5 5. 馬八进七 將4进一 6. 馬二进四 1-0

4.3 完整 PGN 示例

[Event "棋谱回放"] [Site "AI象棋"] [Date "2026.08.02"] [Round "-"] [Red "红方"] [Black "黑方"] [Result "1-0"] [Title "气吞关右"] [Source "适情雅趣"] [FEN "2baka3/3P3N1/bN7/7nc/9/4C1P2/P5n1P/B3R3B/4Apr2/2RAK3c w - - 0 1"] 1. 炮五平九 馬7进5 2. 兵六进一 將5平4 3. 車七进九 象1退3 4. 炮九进五 象3进5 5. 馬八进七 將4进一 6. 馬二进四 1-0

五、系统使用方式

5.1 棋谱回放页面(/manual/play)

导出功能

在棋谱回放页面的右侧面板底部,提供两个导出按钮:

按钮功能输出格式
复制 FEN将当前回放局面复制到剪贴板FEN 字符串
导出 PGN下载整局棋谱为文件.pgn 文件

5.2 自定义棋局弹窗(/game 页面)

导入/导出功能

在游戏页面点击「🎮 自定义棋局」按钮,弹窗底部有 FEN/PGN 标签切换区域:

FEN 导入:粘贴 FEN 字符串 → 点击「导入」→ 棋盘自动加载局面

FEN 导出:编辑好棋盘 → 点击「导出」→ FEN 自动复制到剪贴板

PGN 导入:粘贴 PGN 内容 → 选择加载位置(初始局面/最终局面)→ 点击「导入」

5.3 列号映射规则

系统中红方和黑方的列号映射方向不同:

// 红方中文数字(从右到左) cnToCol = { '一':8, '二':7, '三':6, '四':5, '五':4, '六':3, '七':2, '八':1, '九':0 } // 黑方阿拉伯数字(从左到右) numToCol = { '1':0, '2':1, '3':2, '4':3, '5':4, '6':5, '7':6, '8':7, '9':8 }

FEN 编码方向:从左到右(标准方向,与后端一致)

六、格式转换关系

内部存储
棋盘数组
board[10][9]
局面描述
FEN
单行文本
完整对局
PGN
含走法
走法记录
中文记谱
炮二平五
走法坐标
from/to
(7,4)→(7,0)

七、常见问题

为什么红方和黑方的列号方向不同?

这是中国象棋的传统记谱规范。红方从自己的右手边(棋盘右端)开始编号为"一",黑方从自己的左手边(棋盘左端)开始编号为"1"。双方视角相反,所以列号方向不同。

FEN 中的棋子字母是固定的吗?

是的,这是国际通用的编码标准。大写表示红方,小写表示黑方。与中文棋子名称的对应关系为:K/k=帅/将, R/r=车, N/n=马, B/b=相/象, A/a=仕/士, C/c=炮, P/p=兵/卒。

导入 PGN 时"初始局面"和"最终局面"有什么区别?

初始局面:只取 PGN 中 [FEN "..."] 头部定义的棋盘状态(如果没有 FEN 头部则使用标准开局)。

最终局面:在初始局面的基础上,按顺序应用所有走法,得到终局棋盘。

系统的 FEN 编码方向是什么?

系统使用标准的从左到右编码,与后端 Java 代码的 boardToFen() 方法一致。棋盘数组的 board[row][0] 对应 FEN 中该行的最左端。

导出的 PGN 文件可以在其他软件中打开吗?

导出的 PGN 文件遵循标准格式,包含完整的头部标签和中文记谱走法。但由于中国象棋的 PGN 格式没有像国际象棋那样严格的国际标准,部分软件可能无法直接解析中文记谱。建议使用支持中国象棋的专业软件(如象棋桥、鲨鱼象棋等)打开。