【问题标题】:How can I manipulate this chess notation with python?如何用 python 操作这个国际象棋符号?
【发布时间】:2021-12-15 14:51:28
【问题描述】:

我正在尝试在 python 中使用一些与国际象棋相关的库(例如 chessnut 和 chess),它们使用以下符号

r1bqkb1r/pppp1Qpp/2n2n2/4p3/2B1P3/8/PPPP1PPP/RNB1K1NR b KQkq - 0 4

我已经搜索过它并没有找到任何东西。我该如何操作以及如何将标准代数符号(例如“d4 Nc6 e4 e5 f4 f6 dxe5 fxe5”)转换为这个新符号?

【问题讨论】:

  • 这是当前棋盘的快照,而不是移动的替代符号。 python-chess 使用 algebraic notation 进行移动。

标签: python data-manipulation chess python-chess


【解决方案1】:

FEN 信息:https://en.wikipedia.org/wiki/Forsyth–Edwards_Notation

有两种方法可以从 python 中的 san 获取 FEN: 带有.pgn 文件:

import chess
import chess.pgn

pgn = open("your_pgn_file.pgn")
game = chess.pgn.read_game(pgn)
board = game.board()

for move in game.mainline_moves():
    board.push(move)
print(board.fen())

或来自单个 san 主线:

import chess

board = chess.Board()
san_mainline = "d4 Nc6 e4 e5 f4 f6 dxe5 fxe5"

for move in san_mainline.split():
    board.push_san(move)
print(board.fen())

【讨论】:

    【解决方案2】:

    您可以使用python-chess 来完成这项工作。这是获取 SAN 字符串并在板上进行这些移动的代码:

    import chess
    san = 'd4 Nc6 e4 e5 f4 f6 dxe5 fxe5'
    board = chess.Board()
    for move_san in san.split(' '):
        board.push_san(move_san)
    

    【讨论】:

    • tks,这解决了我的问题。
    【解决方案3】:

    那个符号叫做 FEN (Forsyth–Edwards Notation),看起来 python-chess 知道它并且可以解析它。

    这个符号实际上并不等同于移动列表 - 这是用于指定一个位置,它也可能是一个起始位置。没有完整的记录说明游戏是如何达到这一点的。

    Python-chess 可以将您加载到其中的任何棋盘位置(例如使用 PGN 表示法)转换为这种表示法。

    【讨论】:

    • 对于我正在制作的函数,我需要为每一步生成棋盘,所以我认为这种符号会比代数符号更有帮助。谢谢帮助
    猜你喜欢
    • 2012-03-25
    • 2019-10-01
    • 2018-03-25
    • 1970-01-01
    • 2013-05-24
    • 2022-06-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-26
    相关资源
    最近更新 更多