Границы не обрабатываются, поэтому всегда есть 8 соседей.
Можно обрабатывать все позиции массива и определять соседей.Они могут быть встроены в ячейку при инициализации или, как показано ниже, определены динамически.
Для этого я использую вектор смещения с дельтой x и дельтой y в -1, 0, 1.
private static final int[][] MIDDLE_NEIGHBORS =
{
{-1, -1}, {-1, 0}, {-1, 1},
{0, -1}, {0, 1},
{1, -1}, {1, 0}, {1, 1}
};
private static final int[][] LEFT_TOP_NEIGHBORS =
{
{0, 1},
{1, 0}, {1, 1}
};
...
int[][] neighborDeltaXY(int x, int y, int col, int row) {
if (1 < x && x < col-1 && 1 < y && y < row-1) {
return MIDDLE_NEIGHBORS;
}
if (x == 0 && row == 0) {
return LEFT_TOP_NEIGHBORS;
}
...
}
Или вам может быть удобнее использовать вложенные условия:
int[][] neighborDeltaXY(int x, int y, int col, int row) {
if (x == 0) {
if (y == 0) {
return LEFT_TOP_NEIGHBORS;
} else if (y == row - 1) {
return ...;
} else {
return ...;
}
} else if (x == col - 1) {
if (y == 0) {
return ...;
} else if (y == row - 1) {
return ...;
} else {
return ...;
}
} else {
if (y == 0) {
return ...;
} else if (y == row - 1) {
return ...;
} else {
return MIDDLE_NEIGHBORS;
}
}
}
Полезно иметь метод, выполняющий фактический подсчет на доске:
int countNeighborsAlive(Cell[][] old, int x, int y, int col, int row) {
int numNeighborsAlive = 0;
int[][] neighbors = neighborDeltaXY(x, y, col, row);
for (int[] neighbor : neighbors) {
int xn = x + neighbor[0];
int yn = y + neighbor[1];
if (old[xn][yn].getState()) {
++numNeighborsAlive;
}
}
return numNeighborsAlive;
}
Итак, времяцикл становится проще:
for (int x = 0; x < col; x++) {
for (int y= 0; y < row; y++) {
int numNeighborsAlive = countNeighborAlive(arraycopy, x, y, col, row);
... numNeighborsAlive
В игре жизни можно создавать разные геометрии, имея y == 0 в строке y == - 1, так что мир обходит границы.
Также возможно взять оригинальную доску и поместить ее в большую сетку, чтобы видимые ячейки были в [1, столбец - 1), [1, рядок - 1).В этом случае невидимые границы всегда остаются равными 0. Не очень хорошо для игры в жизнь, но другие игры, основанные на сетке, настолько замурованы.
Instead Do Or
x += 1; ++x; x++
if (c == true) if (c)
if (d == false) if (!d)