Итак, я делаю программу, которая имитирует клеточные автоматы, похожие на живые, но у меня возникли проблемы с методом, используемым для подсчета живых соседей клетки. Проблема в том, что я хочу иметь возможность изменять способ обтекания сетки, т. е. оборачиваться ли она слева направо (т. е. цилиндрически), сверху вниз< /strong> и слева направо (т. е. тороидальный) или вовсе нет (т. е. плоский) — и я не могу понять, как сделать мой метод учитывать это. Вот что у меня есть до сих пор:
public int getLiveNeighbors(int row, int col)
{
int count = 0;
// "topology" is an int that represents wraparound:
// 0 = flat; 1 = cylindrical; 2 = toroidal
int top = topology != 2 ? row - 1 : (row + ROWS - 1) % ROWS;
int bottom = topology != 2 ? row + 1 : (row + 1) % ROWS;
int left = topology != 0 ? (col + COLS - 1) % COLS : col - 1;
int right = topology != 0 ? (col + 1) % COLS : col + 1;
for (int r = top; r < bottom + 1; r++)
for (int c = left; c < right + 1; c++)
if (!(r == row && c == col) && getCell(r, c).equals(LIVE))
count++;
}
Я думаю, что ключевым является оператор if
в цикле for
— должен быть какой-то способ проверить, находятся ли r
и c
в пределах сетки, при этом помня, что определение «границы» будет варьируются в зависимости от того, закручивается ли сетка. В прошлом я обходил это, имея три разных набора (по одному для каждой настройки циклического перехода) из восьми разных if
-операторов для индивидуальной проверки каждой из восьми ячеек, составляющих окрестности исходной ячейки; как вы понимаете, это было не очень красиво, но, по крайней мере, работало.
Я не так хорош в объяснении собственного кода, поэтому надеюсь, что это не слишком запутало — я сам чувствую себя немного запутанным (ха). Если у кого-то есть какие-либо вопросы, не стесняйтесь спрашивать!