有没有办法将 python 棋盘转换为整数列表?
Is there a way to convert a python chess board into a list of integers?
我正在尝试创建一个神经网络来下棋,但首先,我需要将棋盘转换为整数列表。我正在为棋盘和游戏使用 python-chess 模块。我目前有一个棋盘 class,但找不到将其转换为列表的方法。
我曾尝试使用 chess_board.epd()
方法,但是 returns 一种难以转换的格式方案。
这是我需要的代码:
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
并且白色可以是正整数,黑色可以是负整数。
我刚刚阅读了 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代表棋盘上的空位。
我已将问题发布到 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]
"""
我创建了一个函数将 chess.Board 对象转换为矩阵
def make_matrix(board): #type(board) == chess.Board()
pgn = board.epd()
foo = [] #Final board
pieces = pgn.split(" ", 1)[0]
rows = pieces.split("/")
for row in rows:
foo2 = [] #This is the row I make
for thing in row:
if thing.isdigit():
for i in range(0, int(thing)):
foo2.append('.')
else:
foo2.append(thing)
foo.append(foo2)
return foo
这个returns矩阵或嵌套列表:
输出:
[['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']]
这是另一个版本,使用 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')
]
我正在尝试创建一个神经网络来下棋,但首先,我需要将棋盘转换为整数列表。我正在为棋盘和游戏使用 python-chess 模块。我目前有一个棋盘 class,但找不到将其转换为列表的方法。
我曾尝试使用 chess_board.epd()
方法,但是 returns 一种难以转换的格式方案。
这是我需要的代码:
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
并且白色可以是正整数,黑色可以是负整数。
我刚刚阅读了 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代表棋盘上的空位。
我已将问题发布到 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]
"""
我创建了一个函数将 chess.Board 对象转换为矩阵
def make_matrix(board): #type(board) == chess.Board()
pgn = board.epd()
foo = [] #Final board
pieces = pgn.split(" ", 1)[0]
rows = pieces.split("/")
for row in rows:
foo2 = [] #This is the row I make
for thing in row:
if thing.isdigit():
for i in range(0, int(thing)):
foo2.append('.')
else:
foo2.append(thing)
foo.append(foo2)
return foo
这个returns矩阵或嵌套列表:
输出:
[['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']]
这是另一个版本,使用 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')
]