Создание движений в Отелло с помощью битовых досок
Я сделал два очень похожих ИИ Отелло. В первом плата представлена в виде массива длиной 100, где плата 8x8 представлена "серединой" платы, а остальное - буферными пространствами по краю (индекс 11 - верхний левый угол доски 8x8, индекс 88 - нижний правый угол). Сделать ход на позицииindex
, Я использую следующий код
changed = [index]
for direction in (1, 9, 10, 11):
shift = index-direction
while board[shift] == opp:
shift -= direction
if board[shift] == player:
changed += [*range(shift+direction, index, direction)]
for direction in (1, 9, 10, 11):
shift = index+direction
while board[shift] == opp:
shift += direction
if board[shift] == player:
changed += [*range(index+direction, shift, direction)]
Чтобы сгенерировать ходы, я затем просматриваю возможные индексы (должен быть внутренний 8x8 и эта плитка пуста) и проверяю, есть ли len(changed) > 1
. Если это так, я устанавливаю элементыboard
в changed
к player
.
Во втором ИИ (который, как я надеялся, будет быстрее делать ходы) доска представлена в виде двух 64-битных битовых досок - одна для игрока, стремящегося максимизировать счет, а другая для игрока, пытающегося минимизировать счет. Чтобы сделать ход, я использую тот же код, что и [здесь] (https://www.hanshq.net/othello.html), только что преобразованный в Python.
new_disk = 1 << index
captured = 0
newmy_disks = my_disks|new_disk
for direction in range(8):
x = shift(new_disk, direction) & opp_disks
for i in range(5):
x |= shift(x, direction) & opp_disks
bounding_disk = shift(x, direction) & my_disks
if bounding_disk != 0:
captured_disks |= x
newmy_disks = newmy_disks^captured_disks
newopp_disks = opp_disks^captured_disks
С представлением битовой доски воспроизведение 1000 случайных игр занимает около 7 секунд, а представление массива - 4 секунды.
Мои вопросы: Как сделать так, чтобы изображение на битовой доске выполнялось быстрее? Можно ли будет одновременно проверить возможные ходы и вернуть новые битборды?