棋盘坐标系统
理解AI象棋平台的坐标定义,掌握行号、列号与棋盘位置的对应关系
棋盘基本结构
中国象棋棋盘为 10行 × 9列 的网格,棋子摆放在交叉点上。在程序内部,棋盘用一个 String[10][9] 的二维数组表示。
棋盘以楚河汉界为界分为南北两方:黑方(上方)阵地在行0-4,红方(下方)阵地在行5-9。
行坐标(Row)
行号 0~9,从上到下递增:
- 行 0 — 黑方底线(顶部)
- 行 0-2 — 黑方九宫范围
- 行 4 — 黑方河沿
- 行 5 — 红方河沿
- 行 7-9 — 红方九宫范围
- 行 9 — 红方底线(底部)
列坐标(Col)
列号 0~8,从左到右递增:
- 列 0 — 最左侧
- 列 3-5 — 九宫宽度范围
- 列 4 — 棋盘正中线
- 列 8 — 最右侧
列号方向说明:程序内部列号从左到右递增(0=左, 8=右),这与传统象棋记谱法(一在右, 九在左)方向相反。显示时会自动转换。
初始棋盘坐标对照
下图并排展示标准开局棋盘在内部程序坐标和传统记谱坐标两种体系下的行列标注:
内部程序坐标
| 行: | 0=黑方底线(顶) ~ 9=红方底线(底) |
| 列: | 0=最左 ~ 8=最右 |
传统记谱坐标
| 行: | 1=红方底线(底) ~ 10=黑方底线(顶) |
| 列: | 一=红方视角右侧 ~ 九=红方视角左侧 |
红字=红方棋子
黑字=黑方棋子
虚线框=九宫
内部坐标 ↔ 传统记谱法映射
在显示走法记录时,系统通过以下规则将内部坐标转换为传统象棋记谱格式:
列号转换
| 内部列号 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 传统列名 | 九 | 八 | 七 | 六 | 五 | 四 | 三 | 二 | 一 |
传统记谱法中,列号从红方视角的右侧开始编号(一=最右),与内部方向相反。
行号转换
传统记谱中行号用数字表示,红方底线为 1,黑方底线为 10:
显示行号 =
例如:内部行 0 → 显示行 10(黑方底线),内部行 9 → 显示行 1(红方底线)
10 - 内部行号例如:内部行 0 → 显示行 10(黑方底线),内部行 9 → 显示行 1(红方底线)
传统记谱法详解
中国传统象棋记谱法以红方视角为基准,每方使用自己的列号体系(从右侧开始编号)。记录一步棋的完整格式为:
棋子名 + 起始列号 + 动作 + 目标
其中动作分为三种:进(前进)、退(后退)、平(横移)。
走法分类
直线棋子(车、炮、将/帅、兵/卒)
- 横移:平 + 目标列号
例:炮二平五— 炮从二路横移至五路 - 前进:进 + 前进步数
例:車一进三— 车从一路前进3步 - 后退:退 + 后退步数
例:炮八退二— 炮从八路后退2步
斜行棋子(马、象/相、士/仕)
- 前进:进 + 目标列号
例:馬八进七— 马从八路进到七路 - 后退:退 + 目标列号
例:象三退一— 象从三路退到一路 - 斜行棋子没有"平",不走直线
红黑双方列号的镜像关系
双方各自从右侧开始编号列号(一~九)。由于双方对坐、方向相反,同一列在红方和黑方的编号不同:
| 棋盘实际列(内部col) | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 |
|---|---|---|---|---|---|---|---|---|---|
| 红方列号 | 九 | 八 | 七 | 六 | 五 | 四 | 三 | 二 | 一 |
| 黑方列号 | 一 | 二 | 三 | 四 | 五 | 六 | 七 | 八 | 九 |
关键:红方"一"路在棋盘最右侧(col=8),黑方"一"路在棋盘最左侧(col=0)。双方列号互为镜像。
同列重名处理
当同一方两个相同棋子位于同一列时,用前/后区分:
前車进二— 前面的车前进2步后炮平五— 后面的炮平移到五路
本平台走法显示格式
本平台在棋局记录面板中使用简化的目标位置记谱法,便于程序化处理和快速阅读:
格式:棋子名 + 目标列(中文) + 目标行(数字) [+ (吃)表示吃子]
示例解读
| 显示记录 | 含义 | 目标内部坐标 |
|---|---|---|
炮三7 | 炮走到 三路第7行 | (3, 6) — row=3, col=6 |
車五10(吃) | 車走到 五路第10行,吃子 | (0, 4) — row=0, col=4 |
馬二5 | 馬走到 二路第5行 | (5, 7) — row=5, col=7 |
兵一1(吃) | 兵走到 一路第1行(红方底线),吃子 | (9, 8) — row=9, col=8 |
走法图示(目标位置标红)
炮三7炮走到三路第7行
車五10(吃)車走到五路第10行,吃子
馬二5馬走到二路第5行
兵一1(吃)兵走到一路第1行,吃子
坐标换算公式
目标列名 =
colNames = [九,八,七,六,五,四,三,二,一]
colNames[内部列号]colNames = [九,八,七,六,五,四,三,二,一]
目标行号 =
内部行0 → 显示10, 内部行9 → 显示1
10 - 内部行号内部行0 → 显示10, 内部行9 → 显示1
示例:炮三7即表示炮走到 (内部行=10-7=3, 内部列=colNames索引"三"=6),即内部坐标 (3, 6)。
九宫( Palace )
| 方 | 行范围 | 列范围 |
|---|---|---|
| 黑方 | 0 ~ 2 | 3 ~ 5 |
| 红方 | 7 ~ 9 | 3 ~ 5 |
将(帅)和士(仕)只能在九宫范围内移动。
楚河汉界
位于行4与行5之间,是红黑双方的分界线:
- 黑方阵地:行 0 ~ 4
- 红方阵地:行 5 ~ 9
- 象(相)不可越界
- 兵(卒)过界后可横移
棋子前进方向
红方(下方)
前进 = 行号减小(向行0移动)
forward = -1黑方(上方)
前进 = 行号增大(向行9移动)
forward = +1完整坐标映射参考表
| 棋盘特征 | 内部坐标 (row, col) | 传统记谱 |
|---|---|---|
| 黑方底线 | row = 0 | 第10行 |
| 黑方河沿 | row = 4 | 第6行 |
| 红方河沿 | row = 5 | 第5行 |
| 红方底线 | row = 9 | 第1行 |
| 最左列 | col = 0 | 九路 |
| 正中列 | col = 4 | 五路 |
| 最右列 | col = 8 | 一路 |
| 黑方九宫 | rows 0-2, cols 3-5 | 第10-8行, 7-5路 |
| 红方九宫 | rows 7-9, cols 3-5 | 第3-1行, 7-5路 |