Есть ли способ преобразовать шахматную доску питона в список целых чисел? - PullRequest
2 голосов
/ 27 апреля 2019

Я пытаюсь создать нейронную сеть для игры в шахматы, но сначала мне нужно преобразовать шахматную доску в список целых чисел. Я использую модуль python-chess для шахматной доски и игры. В настоящее время у меня есть класс шахматной доски, но я не могу найти метод для преобразования его в список.

Я пытался использовать метод chess_board.epd(), но он возвращает схему форматирования, которую трудно конвертировать.

Вот код, который мне нужен:

board = chess.Board()  # Define board object
board.convert_to_int()  # Method I need

Прямо сейчас, с помощью метода .epd() я получаю "rnbqkbnr/pppppppp/8/8/8/5P2/PPPPP1PP/RNBQKBNR b KQkq -"

Как видите, очень трудно разобрать и преобразовать в список целых чисел, так как есть /8/ и /5P2/.

Ожидаемый результат примерно такой (идет строка за строкой):

[4, 2, 3, 5, 6, 3, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, ... -1, -1, -1, -1,-1, -1,-1, -1, -4, -2, -3, -5, -6, -3, -2, -4]

Например, целые числа могут отображаться в peices:

pawn - 1
knight - 2
bishop - 3
rook - 4
queen - 5
king - 6

И белые могут быть положительными целыми числами, а черные - отрицательными целыми числами.

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Я разместил вопрос на Github , и обнаружил, что нашел там более элегантное решение. Это было следующее:

>>> import chess
>>> board = chess.Board()
>>> [board.piece_type_at(sq) for sq in chess.SQUARES]  # Get Type of piece
[4, 2, 3, 5, 6, 3, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, ...]

Обратите внимание, что вышеприведенная версия не содержит негативов, поэтому вот улучшенная версия:

def convert_to_int(board):
        l = [None] * 64
        for sq in chess.scan_reversed(board.occupied_co[chess.WHITE]):  # Check if white
            l[sq] = board.piece_type_at(sq)
        for sq in chess.scan_reversed(board.occupied_co[chess.BLACK]):  # Check if black
            l[sq] = -board.piece_type_at(sq)
        return [0 if v is None else v for v in l]

piece_type_list(chess.Board())

"""
Outpus:
[4, 2, 3, 5, 6, 3, 2, 4, 1, 1, 1, 1, 1, 1, 1, 1, None, None, None, None, None, None, None, None, None, None, None, None, 
None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None,
 -1, -1, -1, -1, -1, -1, -1, -1, -4, -2, -3, -5, -6, -3, -2, -4]
"""
0 голосов
/ 27 апреля 2019

Я только что прочитал documntation модуля chess и создал простой реферат Class, как вы хотите.

import chess

class MyChess(chess.Board):

    mapped = {
        'P': 1,     # White Pawn
        'p': -1,    # Black Pawn
        'N': 2,     # White Knight
        'n': -2,    # Black Knight
        'B': 3,     # White Bishop
        'b': -3,    # Black Bishop
        'R': 4,     # White Rook
        'r': -4,    # Black Rook
        'Q': 5,     # White Queen
        'q': -5,    # Black Queen
        'K': 6,     # White King
        'k': -6     # Black King
        }

    def convert_to_int(self):
        epd_string = self.epd()
        list_int = []
        for i in epd_string:
            if i == " ":
                return list_int
            elif i != "/":
                if i in self.mapped:
                    list_int.append(self.mapped[i])
                else:
                    for counter in range(0, int(i)):
                        list_int.append(0)

Примечание:

Прописные буквы предназначены для белых фигур, а строчные буквы - для черных. И 0 для пустых мест на шахматной доске.

...