Meine Lösung bestand darin, eine Schachschrift wie Chess Merida oder Chess Cases zu verwenden .
Mit einer solchen Schriftart wird beispielsweise die Startposition folgendermaßen geschrieben:
1222222223
4tMvWlVmT5
4OoOoOoOo5
4 + + + +5
4+ + + + 5
4 + + + +5
4+ + + + 5
4pPpPpPpP5
4RnBqKbNr5
7888888889
Und (unter der Annahme, dass die Zeilenhöhe auf die Höhe der Schriftart festgelegt ist) sieht es so aus (hier mit Chess Merida als Schriftart):
Also habe ich dieses Python-Skript geschrieben, das von fen in dieses Format konvertiert. Rufen Sie dieses Skript mit (vorausgesetzt, Sie haben es fen2diag.py genannt ) auf, python fen2diag.py "<the fen>"
und es gibt den Diagramm-String aus.
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))
Diese Diagrammschriftarten unterstützen auch Quadrate, die mit Punkten oder Sternen markiert sind, eine andere Art von Rahmen, runde Rahmenecken und Zahlen / Buchstaben am linken / unteren Rand, die die Zeilen / Spalten kennzeichnen. Ich habe dies nicht in das Skript aufgenommen. Fühlen Sie sich frei, meinen Code zu aktualisieren.
Chessbase hat auch eine Schriftfamilie erstellt (beginnend mit 'DiagramTT ...'), die noch mehr Dinge unterstützt (wie um 180 ° gedrehte Teile), aber diese Schrift ordnet Dinge verschiedenen Codepunkten zu, auch für schwarze Quadrate werden zwei Buchstaben verwendet, einer für den Hintergrund und eine für das Stück.