Giải pháp của tôi là sử dụng một phông chữ cờ như Chess Merida hoặc Chess Case .
Với một phông chữ như vậy, ví dụ, vị trí bắt đầu được viết như thế này:
1222222223
4tMvWlVmT5
4OoOoOoOo5
4 + + + +5
4+ + + + 5
4 + + + +5
4+ + + + 5
4pPpPpPpP5
4RnBqKbNr5
7888888889
Và (giả sử chiều cao của dòng được đặt thành chiều cao của phông chữ) trông giống như thế này (Ở đây sử dụng Chess Merida làm phông chữ):
Vì vậy, tôi đã viết kịch bản Python này chuyển đổi từ fen sang định dạng này. Gọi tập lệnh này (giả sử bạn đặt tên cho nó là fen2diag.py ) python fen2diag.py "<the fen>"
và nó in ra chuỗi sơ đồ.
import sys
def fen2diag(fen, borders=False):
"""
Convert a fen to a diagram string used by fonts like
'Chess Merida' and 'Chess Cases'.
fen: The fen. For example the fen for the startposition is
'rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1'.
borders: If the returned diagram string shall have borders.
Returns the diagram string.
"""
# We dont need anything except the piece positions.
fen = fen[:fen.find(' ')]
# Transposition table for the black pieces.
# White pieces are the same in both formats.
t = {'k': 'l', 'q': 'w', 'r': 't', 'b': 'v', 'n': 'm', 'p': 'o'}
# If the current square is a white square or not.
w = False
def todiagletter(fenletter):
""""
Return the diagram letter corresponding to the letter in the fen.
"""
nonlocal borders, w
w = not w
if fenletter == '/':
# In the diagram font these are the characters for the diagram borders:
# '1' upper left, '2' upper, '3' upper right,
# '4' left, '5' right,
# '7' bottom left, '8' bottom, '9' bottom right
return '5\n4' if borders else '\n'
else:
# this code handles numbers in the fen, denoting empty squares.
try:
# this is a number between 1 and 8.
n = int(fenletter)
# This will be a string denoting empty squares.
# Would be eg. ' + + + +' for an empty eight rank.
spaces = []
while n > 0:
# In the diagram font ' ' denotes a white square
# and '+' denotes a black square.
spaces.append(' ' if w else '+')
w = not w
n -= 1
w = not w
return ''.join(spaces)
# this code handles piece letters in the fen.
except ValueError:
# a black piece
if fenletter in t:
fenletter = t[fenletter]
# In the diagram font lowercase letters denote
# pieces on white squares and uppercase letters
# denote pieces on black squares.
return fenletter.lower() if w else fenletter.upper()
diagram = ''.join(map(todiagletter, fen))
if borders:
return f'1222222223\n4{diagram}5\n7888888889'
else:
return diagram
if __name__ == '__main__':
print(fen2diag(sys.argv[1], borders=True))
Các phông chữ Sơ đồ này cũng hỗ trợ các ô vuông được đánh dấu bằng dấu chấm hoặc ngôi sao, một loại đường viền khác, góc viền tròn, số / chữ cái ở viền trái / đáy biểu thị các hàng / cột. Tôi đã không bao gồm điều này trong kịch bản. Hãy cập nhật mã của tôi.
Chessbase cũng đã tạo một họ phông chữ (bắt đầu bằng 'Sơ đồ ...') hỗ trợ nhiều nội dung hơn (như các mảnh được quay 180 °) nhưng phông chữ này ánh xạ mọi thứ đến các điểm mã khác nhau, cũng cho các ô vuông màu đen, hai chữ cái được lấy cho nền và một cho mảnh.