我有一个数组,它对应于棋盘上棋子的位置,就像这样:
['em', 'bn', 'em', 'wr', 'em', 'wp', 'em', 'em']
['br', 'em', 'bp', 'em', 'em', 'bn', 'wn', 'em']
['em', 'em', 'bp', 'bp', 'bp', 'em', 'wp', 'bp']
['bp', 'bp', 'em', 'bp', 'wn', 'em', 'wp', 'em']
....
“ b”和“ w”表示黑白。
n:骑士
r:车
p:典当
b:主教
k:王
q:女王
我想知道是否存在一些实用程序,可以使用此数组或类似的东西并生成棋盘的图片。有很多使用FEN或PGN表示法的板生成器,但我无权使用。我在Google上做了很多搜索,但找不到任何东西。
谢谢!
答案 0 :(得分:3)
将您的表示转换为标准表示并不困难。例如,您可以使用以下功能转换为FEN:
import io
def board_to_fen(board):
# Use StringIO to build string more efficiently than concatenating
with io.StringIO() as s:
for row in board:
empty = 0
for cell in row:
c = cell[0]
if c in ('w', 'b'):
if empty > 0:
s.write(str(empty))
empty = 0
s.write(cell[1].upper() if c == 'w' else cell[1].lower())
else:
empty += 1
if empty > 0:
s.write(str(empty))
s.write('/')
# Move one position back to overwrite last '/'
s.seek(s.tell() - 1)
# If you do not have the additional information choose what to put
s.write(' w KQkq - 0 1')
return s.getvalue()
在某些主板数据上对其进行测试:
board = [
['bk', 'em', 'em', 'em', 'em', 'em', 'em', 'em'],
['em', 'bn', 'em', 'wr', 'em', 'wp', 'em', 'em'],
['br', 'em', 'bp', 'em', 'em', 'bn', 'wn', 'em'],
['em', 'em', 'bp', 'bp', 'bp', 'em', 'wp', 'bp'],
['bp', 'bp', 'em', 'bp', 'wn', 'em', 'wp', 'em'],
['em', 'em', 'em', 'em', 'em', 'em', 'em', 'em'],
['em', 'em', 'em', 'wk', 'em', 'em', 'em', 'em'],
['em', 'em', 'em', 'em', 'em', 'em', 'em', 'em'],
]
print(board_to_fen(board))
# k7/1n1R1P2/r1p2nN1/2ppp1Pp/pp1pN1P1/8/3K4/8 w KQkq - 0 1
可视化Chess.com中的FEN字符串会产生:
答案 1 :(得分:1)
将板子转换为FEN的另一种实用方法:
#!/usr/bin/env python3
from more_itertools import run_length
def convert_cell(value):
if value == 'em':
return None
else:
color, piece = value
return piece.upper() if color == 'w' else piece.lower()
def convert_rank(rank):
return ''.join(
value * count if value else str(count)
for value, count in run_length.encode(map(convert_cell, rank))
)
def fen_from_board(board):
return '/'.join(map(convert_rank, board)) + ' w KQkq - 0 1'
def main():
board = [
['bk', 'em', 'em', 'em', 'em', 'em', 'em', 'em'],
['em', 'bn', 'em', 'wr', 'em', 'wp', 'em', 'em'],
['br', 'em', 'bp', 'em', 'em', 'bn', 'wn', 'em'],
['em', 'em', 'bp', 'bp', 'bp', 'em', 'wp', 'bp'],
['bp', 'bp', 'em', 'bp', 'wn', 'em', 'wp', 'em'],
['em', 'em', 'em', 'em', 'em', 'em', 'em', 'em'],
['em', 'em', 'em', 'wk', 'em', 'em', 'em', 'em'],
['em', 'em', 'em', 'em', 'em', 'em', 'em', 'em'],
]
print(fen_from_board(board))
if __name__ == '__main__':
main()