Как получить фигуру в python-chess

Теперь я использую python-chess для своего шахматного проекта. Я думаю, что нашел способ получить его через прямое определение. например chess.Board().piece_at(chess.B1) но я хочу получить его через переменную, есть ли способ получить тип произведения.

e.g.source = 'g1'как получить тип фрагмента для источника?


person Michael Yang    schedule 12.04.2019    source источник
comment
Попробуйте getattr на шахматном объекте.   -  person Paritosh Singh    schedule 12.04.2019


Ответы (4)


У вас должен быть доступ к объекту части, и вы можете получить тип части из объекта части, как это. (Вам также может понадобиться символ или цвет)

import chess
board = chess.Board()
piece = board.piece_at(chess.B1)
piece_type = piece.piece_type
piece_color = piece.color
piece_symbol = piece.symbol()

print(piece_type)
print(piece_symbol)
print(piece_color)
person Moldovan Daniel    schedule 12.04.2019
comment
Извините, возможно, я не совсем ясно сформулировал свой вопрос. Я искал способ заменить chess.B1. Я хочу получить информацию о фигуре на заданном квадрате через переменные. Интересно, могу ли я хранить B1 в переменной и получать разные типы фигур при изменении переменной. - person Michael Yang; 12.04.2019

предположим, вы хотите найти фигуру в позиции: F3, вы можете использовать chess.parse_square(), чтобы получить индекс любой клетки, передав: F3, A1, A2 и т. д.

Вот как мы найдем фигуру на определенной клетке:

import chess
import chess.engine
import chess.polyglot

board = chess.Board()

opponent_move = board.parse_san('g1f3')
board.push(opponent_move)
print(board)

piece = board.piece_at(chess.parse_square('f3'))

print(piece)

он вернется: N (в этом случае, когда мы переместим нашего коня с g1 на f3.)

person Abdul.Moqueet    schedule 25.03.2021

Как автор книги Играйте в шахматы с помощью веб-камеры, я столкнулся с та же проблема.

Существует несколько вариантов косвенного обращения, описанных в

https://python-chess.readthedocs.io/en/latest/core.html

Код ниже см.

https://github.com/WolfgangFahl/play-chess-with-a-webcam/blob/master/src/test_Board.py

использует доступ по строке/столбцу, но вы также можете сделать любое другое сопоставление, используя косвенные указания ранга/файла, доступные в ядре. Пока вы получаете SquareIndex в диапазоне от 0 до 63, все будет в порядке.

chess.SQUARES[squareIndex]

как вы затем получаете квадрат, который вы можете использовать в качестве входных данных для board.piece_at(square)

код

def test_PieceAt():
    """
    see https://stackoverflow.com/questions/55650138/how-to-get-a-piece-in-python-chess
    see https://python-chess.readthedocs.io/en/latest/core.html """
    board = chess.Board()
    print (board.unicode())
    print(" square | row | col | type | piece | color | field")
    print("--------+-----+-----+------+-------+-------+------")
    for row in range(0,8):
      for col in range(0,8):
        squareIndex=row*8+col
        square=chess.SQUARES[squareIndex]
        piece = board.piece_at(square)
        fieldColor=(col+row)%2==1
        if piece is None:
           assert row in {2,3,4,5}
        else:
           print("%7d | %3d | %3d | %4d | %5s | %4s | %4s" % (square,row,col,piece.piece_type,piece.symbol(),"white" if piece.color else "black","black" if col%2!=row%2 else "white"))
           if row in {0,1}:
              assert piece.color==chess.WHITE
              # white symbols are upper case
              assert ord(piece.symbol())>ord('A') and ord(piece.symbol())<ord('Z')
           if row in {6,7}:
              assert piece.color==chess.BLACK
              # black symbols are lower case
              assert ord(piece.symbol())>ord('a') and ord(piece.symbol())<ord('z'

вывод

♜ ♞ ♝ ♛ ♚ ♝ ♞ ♜
♟ ♟ ♟ ♟ ♟ ♟ ♟ ♟
· · · · · · · ·
· · · · · · · ·
· · · · · · · ·
· · · · · · · ·
♙ ♙ ♙ ♙ ♙ ♙ ♙ ♙
♖ ♘ ♗ ♕ ♔ ♗ ♘ ♖
 square | row | col | type | piece | color | field
--------+-----+-----+------+-------+-------+------
      0 |   0 |   0 |    4 |     R | white | white
      1 |   0 |   1 |    2 |     N | white | black
      2 |   0 |   2 |    3 |     B | white | white
      3 |   0 |   3 |    5 |     Q | white | black
      4 |   0 |   4 |    6 |     K | white | white
      5 |   0 |   5 |    3 |     B | white | black
      6 |   0 |   6 |    2 |     N | white | white
      7 |   0 |   7 |    4 |     R | white | black
      8 |   1 |   0 |    1 |     P | white | black
      9 |   1 |   1 |    1 |     P | white | white
     10 |   1 |   2 |    1 |     P | white | black
     11 |   1 |   3 |    1 |     P | white | white
     12 |   1 |   4 |    1 |     P | white | black
     13 |   1 |   5 |    1 |     P | white | white
     14 |   1 |   6 |    1 |     P | white | black
     15 |   1 |   7 |    1 |     P | white | white
     48 |   6 |   0 |    1 |     p | black | white
     49 |   6 |   1 |    1 |     p | black | black
     50 |   6 |   2 |    1 |     p | black | white
     51 |   6 |   3 |    1 |     p | black | black
     52 |   6 |   4 |    1 |     p | black | white
     53 |   6 |   5 |    1 |     p | black | black
     54 |   6 |   6 |    1 |     p | black | white
     55 |   6 |   7 |    1 |     p | black | black
     56 |   7 |   0 |    4 |     r | black | black
     57 |   7 |   1 |    2 |     n | black | white
     58 |   7 |   2 |    3 |     b | black | black
     59 |   7 |   3 |    5 |     q | black | white
     60 |   7 |   4 |    6 |     k | black | black
     61 |   7 |   5 |    3 |     b | black | white
     62 |   7 |   6 |    2 |     n | black | black
     63 |   7 |   7 |    4 |     r | black | white
person Wolfgang Fahl    schedule 27.10.2019

Я действительно не нашел элегантного решения для этого. Но я обнаружил, что он также принимает ввод чисел, но в специальном формате.

squares = [
            'A1', 'B1', 'C1', 'D1', 'E1', 'F1', 'G1', 'H1',
            'A2', 'B2', 'C2', 'D2', 'E2', 'F2', 'G2', 'H2',
            'A3', 'B3', 'C3', 'D3', 'E3', 'F3', 'G3', 'H3',
            'A4', 'B4', 'C4', 'D4', 'E4', 'F4', 'G4', 'H4',
            'A5', 'B5', 'C5', 'D5', 'E5', 'F5', 'G5', 'H5',
            'A6', 'B6', 'C6', 'D6', 'E6', 'F6', 'G6', 'H6',
            'A7', 'B7', 'C7', 'D7', 'E7', 'F7', 'G7', 'H7',
            'A8', 'B8', 'C8', 'D8', 'E8', 'F8', 'G8', 'H8',
        ]

Это имя на доске, так что вы можете использовать chess.Board().piece_at(squares.index(source.capitalize())).symbol() для получения его символа.

person Michael Yang    schedule 14.05.2019
comment
нет - нельзя: вы при каждом звонке создаете новую доску.. - person Wolfgang Fahl; 27.10.2019