3
votes

Existe-t-il un moyen de convertir un échiquier python en une liste d'entiers?

J'essaie de créer un réseau neuronal pour jouer aux échecs, mais d'abord, je dois convertir l'échiquier en une liste d'entiers. J'utilise le module python-chess pour l'échiquier et le jeu. J'ai actuellement une classe d'échiquier, mais je ne trouve pas de méthode pour la convertir en liste.

J'ai essayé d'utiliser la méthode chess_board.epd () , mais cela renvoie un schéma de formatage qui est difficile à convertir.

Voici le code dont j'ai besoin:

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

En ce moment, avec le code .epd () > méthode J'obtiens "rnbqkbnr / pppppppp / 8/8/8 / 5P2 / PPPPP1PP / RNBQKBNR b KQkq -"

Comme vous pouvez le voir, il est très difficile d'analyser et convertissez en une liste d'entiers car il y a des / 8 / et /5P2/.

La sortie attendue est quelque chose comme ceci (va à la ligne par ligne):

[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] code>

Par exemple, voici ce que les entiers mappent aux paires:

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

Et le blanc peut être des entiers positifs et le noir peut être des entiers négatifs.


0 commentaires

4 Réponses :


0
votes

Je viens de lire la documentation du module échecs et j'ai créé une classe abstraite simple comme vous le souhaitez.

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)

Remarque:

Les lettres majuscules correspondent aux pièces blanches et les lettres minuscules aux pièces noires. Et 0 correspond aux espaces vides de l'échiquier.


0 commentaires

-1
votes

J'ai publié la question sur Github , et j'ai trouvé que j'avais une solution plus élégante là-bas. C'était le suivant:

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]
"""

Notez que la version ci-dessus n'inclut pas les négatifs, voici donc la version importée:

>>> 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, ...]


0 commentaires

0
votes

J'ai créé une fonction pour convertir l'objet échecs.Board en une matrice

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

Cela renvoie une matrice ou des listes imbriquées:

Sortie:

XXX


0 commentaires

0
votes

Voici une autre version, utilisant la méthode unicode ():

def convert_to_int(board):
    indices = '♚♛♜♝♞♟⭘♙♘♗♖♕♔'
    unicode = board.unicode()
    return [
        [indices.index(c)-6 for c in row.split()]
        for row in unicode.split('\n')
    ]


0 commentaires