Stockfish.py中兵升变时的走法日志格式咨询
Stockfish.py兵升变走法格式及PGN转换问题解决
一、Stockfish.py的升变走法格式
Stockfish Python库返回的兵升变走法是完整长格式,例如c7c8=Q,包含:
- 起始格子(前2位:
c7) - 目标格子(中间2位:
c8) - 升变棋子后缀(
=Q)
不会返回c8=Q这种短格式。
二、你的代码问题分析
- 升变处理逻辑错误:原代码中
sq2 = move[2:]会把升变后缀=Q和目标格合并(比如c7c8=Q会得到c8=Q),直接导致PGN解析失败——PGN要求升变后缀附加在目标格后,但你的逻辑未正确拆分这两部分。 - 变量赋值错误:获取黑方最佳走法时,
best_b = best_w[random.randint(0,2)]['Move']是错误的,best_w是已提取的白方走法字符串,应该用stockfish.get_top_moves(3)返回的列表取值。
三、修正后的PGN转换函数
以下是修复了升变处理的getfgn函数:
import random def getfgn(move, stockfish): # 拆分升变部分 has_promotion = '=' in move if has_promotion: move_core, promotion_piece = move.split('=', 1) promotion_suffix = f'={promotion_piece}' start_sq = move_core[:2] end_sq = move_core[2:] else: start_sq = move[:2] end_sq = move[2:] promotion_suffix = '' # 判断是否为兵 piece = stockfish.get_what_is_on_square(start_sq) is_pawn = piece.endswith('P') # 判断是否为吃子 is_capture = stockfish.will_move_be_a_capture(move) # 构建PGN格式走法 if is_pawn: if is_capture: # 兵吃子升变:列 + x + 目标格 + 升变后缀 pgn_move = f"{start_sq[0]}x{end_sq}{promotion_suffix}" else: # 兵推进升变:目标格 + 升变后缀 pgn_move = f"{end_sq}{promotion_suffix}" else: # 非兵棋子基础处理(可补充同子区分逻辑) piece_abbr = piece[1].upper() # 提取棋子缩写:N=马,B=象,R=车,Q=后,K=王 pgn_move = f"{piece_abbr}{end_sq}" if is_capture: pgn_move = f"{piece_abbr}x{end_sq}" return pgn_move # 调用示例 best_w_list = stockfish.get_top_moves(3) best_w = best_w_list[random.randint(0,2)]['Move'] fgn_w = getfgn(best_w, stockfish) best_b_list = stockfish.get_top_moves(3) best_b = best_b_list[random.randint(0,2)]['Move'] fgn_b = getfgn(best_b, stockfish)
四、关键修复点
- 主动判断走法中是否包含升变符号
=,拆分核心走法与升变后缀 - 正确提取起始格、目标格,避免升变后缀混入目标格
- 按照PGN规则生成升变走法:普通升变如
c8=Q,吃子升变如bxc8=Q
内容的提问来源于stack exchange,提问作者ReliableAirRepair
相关产品推荐
相关产品推荐

