Начните с записи правил на простом английском языке:
- Умирает любая живая клетка, у которой меньше двух живых соседей, как если бы она была из-за недостаточного населения.
- Любая живая клетка с двумя илитри живых соседа живут в следующем поколении.
- любая живая клетка с более чем тремя живыми соседями умирает, как если бы она была перенаселена.
- любая мертвая клетка с ровно тремя живыми соседями становится живой клеткойКак при воспроизведении.
Теперь ваша задача - преобразовать эти простые английские выражения в код.Чтобы код работал, вы должны знать, какие входные данные ему нужны.Таким образом, нам нужно просмотреть операторы, чтобы увидеть, что он вычисляет:
- Любая живая ячейка с менее чем двумя живыми соседями умирает, как если бымалонаселенность.
- Любая живая клетка с двумя или тремя живыми соседями живет для следующего поколения.
- Любая жива ячейка с более чем тремя живыми соседями умирает, как будто из-за перенаселения.
- любая мертвая клетка с ровно тремя живыми соседями становится живой клеткойкак при воспроизведении.
Основываясь на этом анализе, теперь мы знаем, что нашему коду потребуются два ввода:
- Нужно знать, жива ли текущая ячейка
- Нужно знать, сколько соседних клеток живы.
Чтобы вычислить, жива ли клетка, я предполагаю, что вы посмотрите на currentgeneration[r,c]
.
Чтобы вычислить, сколько соседних ячеек живы, вы должны посмотреть на все следующее:
currentgeneration[r-1,c-1]
currentgeneration[r-1,c ]
currentgeneration[r-1,c+1]
currentgeneration[r ,c-1]
currentgeneration[r ,c ]
currentgeneration[r ,c+1]
currentgeneration[r+1,c-1]
currentgeneration[r+1,c ]
currentgeneration[r+1,c+1]
Итак, ваш кодНужно проверить все эти элементы и сосчитать те, которые активны.
Затем вы можете написать функцию, которая принимает два входа и определяет, жива ли ячейка:
bool IsAlive(bool wasAlive, int count)
{
if (wasAlive && count<2) return false; // Any live cell with fewer than two live neighbors dies, as if by underpopulation.
if (wasAlive && (count==2 || count == 3)) return true; // Any live cell with two or three live neighbors lives on to the next generation.
if (wasAlive && count>=3) return false; // Any live cell with more than three live neighbors dies, as if by overpopulation.
if (!wasAlive && count == 3) return true; // Any dead cell with exactly three live neighbors becomes a live cell, as if by reproduction.
}
И теперь мы можем написать метод, который извлекает данные для передачи в функцию:
bool IsAlive(int r, int c)
{
var count = currentgeneration[r-1,c-1]
+ currentgeneration[r-1,c ]
+ currentgeneration[r-1,c+1]
+ currentgeneration[r ,c-1]
+ currentgeneration[r ,c ]
+ currentgeneration[r ,c+1]
+ currentgeneration[r+1,c-1]
+ currentgeneration[r+1,c ]
+ currentgeneration[r+1,c+1];
var isAlive = ( currentgeneration[r,c] == 1);
return IsAlive(isAlive, count);
}