Python 国际象棋:检查已通过的棋子

问题描述 投票:0回答:1

在国际象棋棋局中,我想检查是否存在白棋已过的棋子。

是否可以使用 python-chess 库来做到这一点?如果没有,我该如何实施?

def checkForPassedPawn(position: chess.Board, side_to_move: chess.Color):
    # ... check for passed pawn
    # return a boolean value

我找不到任何内置方法来检测传递的 pawn。

chess python-chess
1个回答
1
投票

您必须亲自查看典当位置。有很多方法可以做到这一点。例如,您可以将棋盘的字符串表示形式作为起点:

r n b q k b n r
p p . . . p p p
. . . . . . . .
. . p P p . . .
. . . . . P . .
. . . . . . . .
P P P P . . P P
R N B Q K B N R

这是使用

str(position)
得到的字符串。

然后您可以将每一列放入单独的列表中:

lines = str(position).replace(" ", "").splitlines()
columns = list(zip(*lines))

这给你:

[
    ('r', 'p', '.', '.', '.', '.', 'P', 'R'),
    ('n', 'p', '.', '.', '.', '.', 'P', 'N'),
    ('b', '.', '.', 'p', '.', '.', 'P', 'B'),
    ('q', '.', '.', 'P', '.', '.', 'P', 'Q'),
    ('k', '.', '.', 'p', '.', '.', '.', 'K'),
    ('b', 'p', '.', '.', 'P', '.', '.', 'B'),
    ('n', 'p', '.', '.', '.', '.', 'P', 'N'),
    ('r', 'p', '.', '.', '.', '.', 'P', 'R')
]

如果当前玩家是白人,那么您可以检查每个元组中最左边的“P”,其中它还有一个“p”,无论是在当前元组、上一个元组还是下一个元组中。

对于黑人玩家,您将使用类似的逻辑,在这种情况下首先反转元组可能会很有用。

这是这个想法的实现:

import chess

def checkForPassedPawn(position: chess.Board, side_to_move: chess.Color):
    selfpawn = "pP"[side_to_move]
    otherpawn = "Pp"[side_to_move]
    lines = str(position).replace(" ", "").splitlines()
    if side_to_move == chess.BLACK:
        lines.reverse()
    # turn rows into columns and vice versa
    columns = list(zip(*lines))
    for colnum, col in enumerate(columns):
        if selfpawn in col:
            rownum = col.index(selfpawn)
            if (otherpawn not in col[:rownum]
                    and (colnum == 0 or otherpawn not in columns[colnum-1][:rownum])
                    and (colnum == 7 or otherpawn not in columns[colnum+1][:rownum])):
                return f"{'abcdefgh'[colnum]}{rownum+1}"
    
position = chess.Board()
position.push_san("e4")
position.push_san("d5")
position.push_san("f4")
position.push_san("e5")
position.push_san("exd5")
position.push_san("c5")  # Now white pawn at d5 is a passed pawn 
print(position)
passedpawn = checkForPassedPawn(position, chess.WHITE)
print("passed white pawn:", passedpawn)
position.push_san("d4")
position.push_san("e4")  # Now black pawn at e4 is a passed pawn
print(position)
passedpawn = checkForPassedPawn(position, chess.BLACK)
print("passed black pawn:", passedpawn)

输出:

r n b q k b n r
p p . . . p p p
. . . . . . . .
. . p P p . . .
. . . . . P . .
. . . . . . . .
P P P P . . P P
R N B Q K B N R
passed white pawn: d4
r n b q k b n r
p p . . . p p p
. . . . . . . .
. . p P . . . .
. . . P p P . .
. . . . . . . .
P P P . . . P P
R N B Q K B N R
passed black pawn: e4
© www.soinside.com 2019 - 2024. All rights reserved.