Как найти возможные ходы в игре реверси на питон?

Игра реверси.

Задача найти какие возможные ходы в текущей позиции могут сделать черные:

x = [0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 1, 2, 0, 0, 0,
     0, 0, 0, 2, 1, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0,
     0, 0, 0, 0, 0, 0, 0, 0]


def update():
    indices = []
    for i, value in enumerate(x):
        if value == 1:
            if 1 <= i <= 6:
                for z in [i - 1, i + 1, i + 7, i + 8, i + 9]:
                    if x[z] == 0:
                        indices.append((z, i))
            elif 57 <= i <= 62:
                for z in [i - 1, i + 1, i - 7, i - 8, i - 9]:
                    if x[z] == 0:
                        indices.append((z, i))
            elif i % 8 == 0 and 0 < i < 50:
                for z in [i + 1, i + 8, i - 8]:
                    if x[z] == 0:
                        indices.append((z, i))
            elif i in [15, 23, 31, 39, 47, 55]:
                for z in [i - 1, i + 8, i - 8, i + 7, i - 9]:
                    if x[z] == 0:
                        indices.append((z, i))
            elif i == 0:
                for z in [i + 1, i + 8, i + 9]:
                    if x[z] == 0:
                        indices.append((z, i))
            elif i == 7:
                for z in [i - 1, i + 7, i + 8]:
                    if x[z] == 0:
                        indices.append((z, i))
            elif i == 56:
                for z in [i + 1, i - 7, i - 8]:
                    if x[z] == 0:
                        indices.append((z, i))
            elif i == 63:
                for z in [i - 1, i - 8, i - 9]:
                    if x[z] == 0:
                        indices.append((z, i))
            else:
                for z in [i - 1, i + 1, i - 7, i + 7, i - 8, i + 8, i - 9, i + 9]:
                    if x[z] == 0:
                        indices.append((z, i))
    print(indices)

Этот код ищет все зеленые шарики у которых рядом есть пустая клетка в индексы добавляется такие координаты например (18,27) (индекс пустой клетки, индекс шарика).

В итоге получается вот такое:

[(26, 27), (20, 27), (34, 27), (19, 27), (18, 27), (37, 36), (29, 36), (43, 36), (44, 36), (45, 36)]

Теперь надо по этим индексам опредилить ход возможен или нет к примеру (18,27) этот ход не разрешен.

Какую логику придумать?

У меня есть идея создать словарь в ключе будут индексы, а в значениях какую обрезку нужно делать чтобы потом обратится к этому ключу и получить срез.

введите сюда описание изображения


Ответы (1 шт):

Автор решения: MBo

При выбранном описании поля (двумерный список не был бы удобнее?) вы можете сканировать горизонталь, вертикаль, или диагональ для данной пары, просто добавляя разницу в паре, примерно так:

diff = indices[k][1] - indices[k][0]

current = indices[k][1]
while (current >= 0) and (current < 64):   #следим за выходом за поле
    if x[current] == 2:
        #нашли черное, ход возможен
        break
    elif x[current] == 0:
        break  #пустое, ход невозможен
    if (current%8==0 and (diff in [-1, -7, -9])) or (current%8==7 and (diff in [1, 7, 9])):
        break  # левый, правый края
    current += diff

Например, для пары (18,27) diff=9 и будут проверяться поля 36, 45

→ Ссылка