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.
4 Réponses :
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.
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, ...]
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
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') ]