You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python处理国际象棋FEN记谱并转换标准代数记谱

首先你提到的记谱格式是国际象棋FEN(福斯夫-爱德华兹记谱法),是用来完整记录某一时刻棋局全部状态的标准格式,6个字段用空格分隔,含义分别为:

  • 第1段:棋盘8行的棋子排布,从第8行到第1行依次排列,小写字母代表黑棋,大写代表白棋,数字代表对应位置连续的空位数
  • 第2段:当前行棋方,w代表白方走棋,b代表黑方走棋
  • 第3段:王车易位权限,KQkq分别对应白方王翼易位、白方后翼易位、黑方王翼易位、黑方后翼易位,无对应权限则用-代替
  • 第4段:过路兵目标格,无过路兵则为-
  • 第5段:距离最近一次兵移动或吃子的半回合计数,用于判定50回合和棋规则
  • 第6段:当前全回合计数,黑方走棋后计数加1
FEN格式的基础操作

以常用的python-chess库为例,操作方法如下:

  • 读取FEN生成棋局对象:
import chess
# 直接传入FEN字符串初始化棋局
board = chess.Board("r1bqkb1r/pppp1Qpp/2n2n2/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR b KQkq - 0 4")
  • 从现有棋局导出FEN字符串:
current_fen = board.fen()
  • 基于FEN棋局做常规业务操作:
    • 校验走法合法性:board.is_legal(chess.Move.from_uci("e7e5"))
    • 生成所有合法走法:legal_moves = list(board.legal_moves)
    • 判定棋局状态:board.is_checkmate()(判断是否将死)、board.is_stalemate()(判断是否和棋)等
标准代数记谱(SAN)转FEN的实现

标准代数记谱是走法序列,需要先按顺序将所有走法应用到初始棋局,再导出最终状态的FEN即可,示例代码如下:

import chess

# 输入的标准代数记谱走法序列
san_moves = "d4 Nc6 e4 e5 f4 f6 dxe5 fxe5"
# 初始化开局初始棋局,如果走法从非开局局面开始,可传入对应初始FEN到chess.Board()
board = chess.Board()

# 依次应用每一步走法
for move_san in san_moves.split():
    # 解析SAN格式走法,自动校验合法性
    move = board.parse_san(move_san)
    board.push(move)

# 导出最终状态的FEN
result_fen = board.fen()
print(result_fen)

如果走法序列存在非法走法,parse_san会抛出异常,可根据需求添加异常捕获逻辑处理异常情况。


内容的提问来源于stack exchange,提问作者Giraffes are Fake

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 08:45:03