中国象棋棋谱格式说明
中文记谱法、FEN 局面格式、PGN 对局格式详解,以及系统中的导入导出使用方式
一、棋盘坐标系
1.1 标准棋盘
以下为标准初始局面棋盘,红方位于下方,黑方位于上方。棋盘四周标注了列号(红方中文数字、黑方阿拉伯数字)和行号(0-9):
1.2 棋盘结构
中国象棋棋盘为 10行 × 9列 的网格,中间有"楚河汉界"分隔。棋盘四周标注了列号(红方中文数字、黑方阿拉伯数字)和行号(0-9):
1.3 系统内部坐标
系统使用 board[row][col] 二维数组表示棋盘:
| 属性 | 范围 | 说明 |
|---|---|---|
| row | 0-9 | 0=黑方底线,9=红方底线 |
| col | 0-8 | 0=最左列,8=最右列 |
1.4 棋子编码
| 红方(大写) | 黑方(小写) | 棋子 |
|---|---|---|
| K | k | 帅 / 将 |
| R | r | 车 / 車 |
| N | n | 马 / 馬 |
| B | b | 相 / 象 |
| A | a | 仕 / 士 |
| C | c | 炮 / 砲 |
| P | p | 兵 / 卒 |
二、中文记谱法
2.1 基本格式
中文记谱法是中国象棋最传统的记录方式,格式为:
棋子名 + 列号 + 动作 + 目标
示例:炮二平五、馬8进7、車一平二
2.2 列号编号规则
红方和黑方使用不同方向的列号编号:
对应棋盘列号(board col 0=最左, col 8=最右):
| 红方记谱 | 棋盘列号 | 黑方记谱 |
|---|---|---|
| 一 | 8 | 9 |
| 二 | 7 | 8 |
| 三 | 6 | 7 |
| 四 | 5 | 6 |
| 五 | 4 | 5 |
| 六 | 3 | 4 |
| 七 | 2 | 3 |
| 八 | 1 | 2 |
| 九 | 0 | 1 |
2.3 动作说明
| 动作 | 含义 | 说明 |
|---|---|---|
| 进 | 前进 | 红方向上(row减小),黑方向下(row增大) |
| 退 | 后退 | 红方向下(row增大),黑方向上(row减小) |
| 平 | 横移 | 列号改变,行号不变 |
2.4 目标表示
目标的表示方式取决于棋子类型:
| 棋子类型 | 目标表示 | 示例 |
|---|---|---|
| 车、炮、兵、将(直线移动) | 前进/后退的步数 | 炮五进三(前进3步) |
| 马、象、士(斜线移动) | 目标的列号 | 馬二进三(目标列=三) |
| 所有棋子(横向移动) | 目标的列号 | 車一平二(目标列=二) |
2.5 消歧规则
当同一列有多个同类棋子时,用"前/后"区分:
消歧规则:
- 红方:row 小的为"前"(靠近黑方),row 大的为"后"
- 黑方:row 大的为"前"(靠近红方),row 小的为"后"
2.6 完整示例
三、FEN 局面格式
FEN(Forsyth-Edwards Notation)是一种用单行文本描述棋盘局面的标准格式,广泛用于棋类软件间的数据交换。
3.1 格式结构
| 字段 | 说明 | 示例 |
|---|---|---|
| 棋盘局面 | 10行用 / 分隔,每行从左到右编码 | rnbakabnr/9/1c5c1/... |
| 走棋方 | w=红方走棋,b=黑方走棋 | w |
| - | 占位符(象棋无特殊规则) | - |
| - | 占位符(象棋无吃过路兵) | - |
| 半回合数 | 通常为 0 | 0 |
| 回合数 | 当前回合数 | 1 |
3.2 棋盘局面编码
每行(rank)从左到右编码:
- 棋子用字母表示(大写=红方,小写=黑方)
- 数字表示连续的空格数
- 每行必须合计 9 列
3.3 标准初始局面 FEN
逐行解读:
| 行 | FEN | 棋盘内容 |
|---|---|---|
| 0 | rnbakabnr | 車馬象士將士象馬車 |
| 1 | 9 | 全空 |
| 2 | 1c5c1 | _炮_____炮_ |
| 3 | p1p1p1p1p | 卒_卒_卒_卒_卒 |
| 4 | 9 | 全空 |
| 5 | 9 | 全空 |
| 6 | P1P1P1P1P | 兵_兵_兵_兵_兵 |
| 7 | 1C5C1 | _炮_____炮_ |
| 8 | 9 | 全空 |
| 9 | RNBAKABNR | 車馬相仕帥仕相馬車 |
3.4 自定义局面示例
四、PGN 对局格式
PGN(Portable Game Notation)是一种记录完整对局过程的标准格式,包含头部标签和走法文本两部分。
4.1 头部标签(Tags)
结果值:
| 值 | 含义 |
|---|---|
| 1-0 | 红方胜 |
| 0-1 | 黑方胜 |
| 1/2-1/2 | 和棋 |
| * | 未结束 / 未知 |
4.2 走法文本
走法使用中文记谱法,红黑交替,每步用步数编号:
4.3 完整 PGN 示例
五、系统使用方式
5.1 棋谱回放页面(/manual/play)
导出功能
在棋谱回放页面的右侧面板底部,提供两个导出按钮:
| 按钮 | 功能 | 输出格式 |
|---|---|---|
| 复制 FEN | 将当前回放局面复制到剪贴板 | FEN 字符串 |
| 导出 PGN | 下载整局棋谱为文件 | .pgn 文件 |
5.2 自定义棋局弹窗(/game 页面)
导入/导出功能
在游戏页面点击「🎮 自定义棋局」按钮,弹窗底部有 FEN/PGN 标签切换区域:
FEN 导入:粘贴 FEN 字符串 → 点击「导入」→ 棋盘自动加载局面
FEN 导出:编辑好棋盘 → 点击「导出」→ FEN 自动复制到剪贴板
PGN 导入:粘贴 PGN 内容 → 选择加载位置(初始局面/最终局面)→ 点击「导入」
5.3 列号映射规则
系统中红方和黑方的列号映射方向不同:
FEN 编码方向:从左到右(标准方向,与后端一致)
六、格式转换关系
七、常见问题
为什么红方和黑方的列号方向不同?
这是中国象棋的传统记谱规范。红方从自己的右手边(棋盘右端)开始编号为"一",黑方从自己的左手边(棋盘左端)开始编号为"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 格式没有像国际象棋那样严格的国际标准,部分软件可能无法直接解析中文记谱。建议使用支持中国象棋的专业软件(如象棋桥、鲨鱼象棋等)打开。