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')
]