Я создал алгоритм, чтобы определить, какие фигуры были убиты в игре Go. Для моего алгоритма фигуры хранятся в двумерном массиве строк и столбцов (от 0
- 8
, так как я использую доску 9x9). Каждая часть также является массивом, где:
piece[0]
- это цвет части, либо "empty"
, "black"
, либо "white"
. piece[1]
не имеет значения. piece[2]
является логическим значением того, имеет ли он свободу (изначально установлен на true
, если пустой квадрат, и false
, если там есть кусок). piece[3]
- это было ли оно итерировано в алгоритме или нет. Все фигуры начинаются с этого как true
.
Вот алгоритм для определения того, какие фигуры имеют свободу:
let oldBoard = 0;
while (board != oldBoard) {
oldBoard = board;
for (let row = 0; row < 9; row++) {
for (let col = 0; col < 9; col++) {
if (board[row][col][2] && !board[row][col][3]) {
board[row][col][3] = true;
if (row != 0 && (board[row][col][0] == "empty" || board[row][col][0] == board[row-1][col][0])) { board[row-1][col][2] = true; }
if (row != 8 && (board[row][col][0] == "empty" || board[row][col][0] == board[row+1][col][0])) { board[row+1][col][2] = true; }
if (col != 0 && (board[row][col][0] == "empty" || board[row][col][0] == board[row][col-1][0])) { board[row][col-1][2] = true; }
if (col != 8 && (board[row][col][0] == "empty" || board[row][col][0] == board[row][col+1][0])) { board[row][col+1][2] = true; }
}
}
}
}
После этого удаляются все фигуры, помеченные как не Имея свободу (piece[2] == false
).
Все работает нормально, если только воздушные пространства не находятся внизу / справа. Например, если вы запишете эту конфигурацию:

Тогда часть X-ed будет захвачена, чего не должно быть. Но, если вы отложите эту конфигурацию:

, тогда ни один фрагмент не будет захвачен, что является ожидаемым результатом.
As Насколько я могу судить по моим исследованиям ошибки, кажется, что любая фигура, отмеченная как имеющая свободу от фигуры к ее нижней или правой части, не может дать свободу смежным фигурам.
Вы можете найти полное хранилище здесь .