Создание масок битборда для перемещения

Я пытаюсь понять, как работает представление битборта в шахматном программировании, и я не могу найти полезную информацию (или просто не могу правильно ее перевести ^^) об одной детали. Мой вопрос заключается в том, как автоматически генерировать маски для перемещения по каждой позиции каждым элементом. Я предполагаю, что это матрица, в которой каждый тип фигуры определяет каждое поле, которое он может переместить из этой позиции (массив [5][64] для wP, bP, K, R, N, B). Например, для Ладьи на позиции ниже разрешены только следующие позиции:

0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
1 1 R 1 1 1 1 1
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0
0 0 1 0 0 0 0 0

Я предполагаю, что мне нужно создать что-то подобное для каждого типа фрагмента и для каждого фрагмента, на который он может перейти, но мне нужно вручную закодировать его для создания массива или есть какая-то возможность автоматизировать этот процесс и предварительно вычислить его после запуска программы?

1 ответ

Вы можете довольно легко предварительно вычислить все нужные вам битборды, так как правила игры в шахматы четко определены. Например, вот функция (в python), которая вычисляет допустимые ходы для ладьи:

import sys

def rook(x, y):
    for i in range (1, 8):
        for j in range (1, 8):
            if x == i or y == j:
                sys.stdout.write("1")
            else:
                sys.stdout.write("0")
        sys.stdout.write("\n")

print "Bit board of legal moves for a rook at 1, 3:"
rook(1, 3)

Вместо того, чтобы распечатывать битовую доску, вы, скорее всего, сохраните ее в компактном формате, таком как массив 64-битных значений (поскольку плате 8x8 требуется 64 бита для каждой платы).

Это довольно экстремальный метод оптимизации, поэтому подробности его реализации могут стать проблематичными (и отладкой будет сложно).

Я использовал вики- страницу в качестве ссылки.

Другие вопросы по тегам