Как найти возможные ходы в игре реверси на питон?
Игра реверси.
Задача найти какие возможные ходы в текущей позиции могут сделать черные:
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 шт):
При выбранном описании поля (двумерный список не был бы удобнее?) вы можете сканировать горизонталь, вертикаль, или диагональ для данной пары, просто добавляя разницу в паре, примерно так:
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