Создать схему шахматной доски из массива позиций в Python? - PullRequest
0 голосов
/ 25 июня 2019

У меня есть массив, который соответствует позициям фигур на шахматной доске, например:

['em', 'bn', 'em', 'wr', 'em', 'wp', 'em', 'em']
['br', 'em', 'bp', 'em', 'em', 'bn', 'wn', 'em']
['em', 'em', 'bp', 'bp', 'bp', 'em', 'wp', 'bp']
['bp', 'bp', 'em', 'bp', 'wn', 'em', 'wp', 'em']
....

'b' и 'w' означают черный и белый.

n: рыцарь
r: ладья
p: пешка
b: слон
k: король
q: королева

Я хочу знать, еслисуществует какая-то утилита, которая может взять этот массив или что-то подобное и создать изображение шахматной доски.Существует множество генераторов плат, которые работают с нотацией FEN или PGN, но у меня нет доступа к этому.Я много занимался поиском в Google, но ничего не смог найти.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 25 июня 2019

Нетрудно преобразовать ваше представление в стандартное.Например, вы можете преобразовать в FEN с помощью такой функции:

import io

def board_to_fen(board):
    # Use StringIO to build string more efficiently than concatenating
    with io.StringIO() as s:
        for row in board:
            empty = 0
            for cell in row:
                c = cell[0]
                if c in ('w', 'b'):
                    if empty > 0:
                        s.write(str(empty))
                        empty = 0
                    s.write(cell[1].upper() if c == 'w' else cell[1].lower())
                else:
                    empty += 1
            if empty > 0:
                s.write(str(empty))
            s.write('/')
        # Move one position back to overwrite last '/'
        s.seek(s.tell() - 1)
        # If you do not have the additional information choose what to put
        s.write(' w KQkq - 0 1')
        return s.getvalue()

Тестирование на некоторых данных платы:

board = [
    ['bk', 'em', 'em', 'em', 'em', 'em', 'em', 'em'],
    ['em', 'bn', 'em', 'wr', 'em', 'wp', 'em', 'em'],
    ['br', 'em', 'bp', 'em', 'em', 'bn', 'wn', 'em'],
    ['em', 'em', 'bp', 'bp', 'bp', 'em', 'wp', 'bp'],
    ['bp', 'bp', 'em', 'bp', 'wn', 'em', 'wp', 'em'],
    ['em', 'em', 'em', 'em', 'em', 'em', 'em', 'em'],
    ['em', 'em', 'em', 'wk', 'em', 'em', 'em', 'em'],
    ['em', 'em', 'em', 'em', 'em', 'em', 'em', 'em'],
]
print(board_to_fen(board))
# k7/1n1R1P2/r1p2nN1/2ppp1Pp/pp1pN1P1/8/3K4/8 w KQkq - 0 1

Визуализация строки FEN, например, в Шахматы.com производит:

Board

1 голос
/ 25 июня 2019

Альтернативный, немного более функциональный подход к преобразованию платы в FEN:

#!/usr/bin/env python3
from more_itertools import run_length


def convert_cell(value):
    if value == 'em':
        return None
    else:
        color, piece = value
        return piece.upper() if color == 'w' else piece.lower()


def convert_rank(rank):
    return ''.join(
        value * count if value else str(count)
        for value, count in run_length.encode(map(convert_cell, rank))
    )


def fen_from_board(board):
    return '/'.join(map(convert_rank, board)) + ' w KQkq - 0 1'


def main():
    board = [
        ['bk', 'em', 'em', 'em', 'em', 'em', 'em', 'em'],
        ['em', 'bn', 'em', 'wr', 'em', 'wp', 'em', 'em'],
        ['br', 'em', 'bp', 'em', 'em', 'bn', 'wn', 'em'],
        ['em', 'em', 'bp', 'bp', 'bp', 'em', 'wp', 'bp'],
        ['bp', 'bp', 'em', 'bp', 'wn', 'em', 'wp', 'em'],
        ['em', 'em', 'em', 'em', 'em', 'em', 'em', 'em'],
        ['em', 'em', 'em', 'wk', 'em', 'em', 'em', 'em'],
        ['em', 'em', 'em', 'em', 'em', 'em', 'em', 'em'],
    ]
    print(fen_from_board(board))


if __name__ == '__main__':
    main()
...