La mia soluzione è stata quella di utilizzare un font di scacchi come Chess Merida o Chess Cases .
Con un tale font, ad esempio, la posizione iniziale è scritta in questo modo:
1222222223
4tMvWlVmT5
4OoOoOoOo5
4 + + + +5
4+ + + + 5
4 + + + +5
4+ + + + 5
4pPpPpPpP5
4RnBqKbNr5
7888888889
E (supponendo che l'altezza della linea sia impostata sull'altezza del carattere) assomiglia a questo (qui usando Chess Merida come carattere):
Quindi ho scritto questo script Python che converte da fen a questo formato. Chiama questo script (supponendo che tu lo abbia chiamato fen2diag.py ) con python fen2diag.py "<the fen>"
e stampa la stringa del diagramma.
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))
Questi caratteri Diagramma supportano anche i quadrati contrassegnati da punti o stelle, un altro tipo di bordo, angoli arrotondati del bordo, numeri / lettere sui bordi inferiore / sinistro che indicano le righe / colonne. Non l'ho incluso nella sceneggiatura. Sentiti libero di aggiornare il mio codice.
Chessbase ha anche creato una famiglia di font (a partire da 'DiagramTT ...') che supporta ancora più cose (come pezzi ruotati di 180 °) ma questo font mappa le cose su punti di codice diversi, anche per i quadrati neri vengono prese due lettere, una per lo sfondo e uno per il pezzo.