Я думаю, здесь может иметь смысл подсчет свобод.
Идея состоит в том, чтобы вести подсчет количества направлений, в которых могут двигаться ваши коллективные фигуры. Это эквивалентно количеству открытых квадратов или вражеских фигур (доступных квадратов), смежных с вашими подвижными фигурами. Если доступный квадрат затронут более чем одной из ваших фигур, то он считается несколько раз. Мы будем называть каждый доступный квадрат / потенциальное направление движения свободой.
Вы начинаете с подсчета количества начальных свобод. Вы только должны посчитать количество подвижных частей в первом ряду, не касаясь воды. Никакая другая фигура не может двигаться, и у каждой фигуры есть только одно направление, в котором они могут двигаться.
После этого алгоритм обновления количества свобод довольно прост. Вы подсчитываете количество свобод в старой позиции, вычитаете количество блоков, которые она блокирует, и подсчитываете количество свобод в новой позиции, снова вычитая количество фигур, которые она блокирует. Вы добавляете это к общей свободе, и у вас есть новое значение.
Я некоторое время не кодировал java, поэтому мои примеры будут в псевдокоде / python, но идея должна быть перенесена.
directions = [(0,1),(0,-1),(1,0),(-1,0)]
for d in directions:
if (SpaceIsAvailable(oldPosition + d)):
liberties--
if (SpaceIsMovable(oldPosition + d)):
liberties++
if(SpaceIsAvailable(newPosition + d)):
liberties++
if(SpaceIsMovable(newPosition + d)):
liberties--
SpaceIsAvailable
верно, если место пусто или противник. SpaceIsMovable
верно, если пятно является вашей фигурой и является подвижным.
Когда противник перемещает свою фигуру, ваши свободы не могут измениться. Ни SpaceIsAvailable
, ни SpaceIsMovable
не изменят значения.
Если ваш кусок удален, вы просто запускаете тот же алгоритм, но пропускаете раздел newPosition
.
for d in directions:
if (SpaceIsAvailable(position + d)):
liberties--
if (SpaceIsMovable(position + d)):
liberties++
Теперь, если liberties > 0
, у вас есть подвижные части. Все, что вам нужно сделать, это отслеживать целое число для обоих игроков, и вы можете пропустить любые вычисления, определяющие, доступны ли какие-либо фигуры.
Это не совсем работает, если вы применяете правила, предотвращающие повторение ходов. Я не уверен, как вы собираетесь это реализовать. Если вы сделаете это, выяснив, какие фигуры не могут двигаться, вы можете просто сравнить общее количество свобод с их свободами вместо 0
. Если он равен, то ходов не осталось. Если общие свободы ниже, чем свободы частей, которые не могут двигаться, либо в моем алгоритме, либо в вашем коде что-то не так.
Если я правильно прочитал правила для повторения, может быть только одна фигура за раз, которая не может двигаться, и, следовательно, только один набор свобод, которые вы должны учитывать.
frozenLiberties = 0
if (frozenPiece):
for d in directions:
if (SpaceIsAvailable(frozenPiece + d)):
frozenLiberties++
if (liberties > frozenLiberties):
// moves available.
else:
// No moves available.