Solusi saya adalah menggunakan font catur seperti Chess Merida atau Chess Cases .
Dengan font seperti misalnya posisi awal ditulis seperti ini:
1222222223
4tMvWlVmT5
4OoOoOoOo5
4 + + + +5
4+ + + + 5
4 + + + +5
4+ + + + 5
4pPpPpPpP5
4RnBqKbNr5
7888888889
Dan (dengan asumsi ketinggian garis diatur ke ketinggian font) terlihat seperti ini (Di sini menggunakan font Catur Merida ):
Jadi saya menulis skrip Python ini yang mengubah dari fen ke format ini. Panggil skrip ini (dengan asumsi Anda menamainya fen2diag.py ) dengan python fen2diag.py "<the fen>"
dan mencetak string diagram.
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))
Font Diagram ini juga mendukung kotak yang ditandai dengan titik atau bintang, jenis perbatasan lainnya, sudut perbatasan bundar, angka / huruf pada batas kiri / bawah yang menunjukkan baris / kolom. Saya belum memasukkan ini ke dalam skrip. Jangan ragu untuk memperbarui kode saya.
Chessbase juga telah membuat keluarga font (dimulai dengan 'DiagramTT ...') yang mendukung lebih banyak barang (seperti potongan yang diputar 180 °) tetapi font ini memetakan berbagai hal ke titik kode yang berbeda, juga untuk kotak hitam dua huruf diambil, satu untuk latar belakang dan satu untuk bagian.