Создание масок битборда для перемещения
Я пытаюсь понять, как работает представление битборта в шахматном программировании, и я не могу найти полезную информацию (или просто не могу правильно ее перевести ^^) об одной детали. Мой вопрос заключается в том, как автоматически генерировать маски для перемещения по каждой позиции каждым элементом. Я предполагаю, что это матрица, в которой каждый тип фигуры определяет каждое поле, которое он может переместить из этой позиции (массив [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 бита для каждой платы).
Это довольно экстремальный метод оптимизации, поэтому подробности его реализации могут стать проблематичными (и отладкой будет сложно).
Я использовал вики- страницу в качестве ссылки.