วิธีการแก้ปัญหาของฉันได้รับที่จะใช้ตัวอักษรเช่นหมากรุกหมากรุก Meridaหรือหมากรุกกรณี
ด้วยแบบอักษรเช่นตำแหน่งเริ่มต้นจะถูกเขียนดังนี้:
1222222223
4tMvWlVmT5
4OoOoOoOo5
4 + + + +5
4+ + + + 5
4 + + + +5
4+ + + + 5
4pPpPpPpP5
4RnBqKbNr5
7888888889
และ (สมมติว่า line-height ถูกตั้งค่าเป็นความสูงของแบบอักษร) ดูเหมือนว่านี้ (ที่นี่ใช้Chess Meridaเป็นแบบอักษร):
ดังนั้นฉันจึงเขียนสคริปต์ Python นี้ซึ่งแปลงจาก fen เป็นรูปแบบนี้ เรียกสคริปต์นี้ (สมมติว่าคุณชื่อfen2diag.py ) ด้วยpython fen2diag.py "<the fen>"
และจะพิมพ์สตริงแผนภาพ
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))
แบบอักษรไดอะแกรมเหล่านี้ยังสนับสนุนสี่เหลี่ยมที่ทำเครื่องหมายด้วยจุดหรือดาวเส้นขอบอีกประเภทหนึ่ง ฉันไม่ได้รวมสิ่งนี้ไว้ในสคริปต์ โปรดอัปเดตโค้ดของฉัน
Chessbase ได้สร้างตระกูลตัวอักษร (เริ่มต้นด้วย 'DiagramTT ... ') ซึ่งรองรับสิ่งต่าง ๆ ได้มากขึ้น (เช่นชิ้นส่วนหันหลัง 180 °) แต่ตัวอักษรนี้แมปสิ่งต่าง ๆ ไปยังจุดรหัสที่แตกต่างกันเช่นสำหรับสี่เหลี่ยมสีดำสองตัวอักษร สำหรับพื้นหลังและอีกอันสำหรับชิ้นงาน