#javascript #conways-game-of-life
#javascript #конвей — игра жизни
Вопрос:
Я знаю, что это довольно расплывчато, но я пытался реализовать правила для игры Конвея в жизнь в JS, но результат, который я получаю, — это беспорядок (это неправильный фрейм игры жизни Конвея). Кто-нибудь может сказать мне, что не так с моей реализацией правил?
// Update state of selected cell
if ((neighbours < 2) amp;amp; (cells[y][x].colour == "black")) {
// "Any live cell with fewer than two live neighbours dies, as if by underpopulation."
cells[y][x].colour = "white";
} else if ((2 <= neighbours <= 3) amp;amp; (cells[y][x].colour == "black")) {
// "Any live cell with two or three live neighbours lives on to the next generation."
cells[y][x].colour = "black";
} else if ((neighbours == 3) amp;amp; (cells[y][x].colour == "white")) {
// "Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction."
cells[y][x].colour = "black";
} else if ((3 < neighbours) amp;amp; (cells[y][x].colour == "black")) {
// "Any live cell with more than three live neighbours dies, as if by overpopulation."
cells[y][x].colour = "white";
}
Примечание: я использую 2D-массив (матрицу) для хранения состояния игры, и каждая ячейка моделируется как простой объект — единственным релевантным параметром здесь является его состояние (сохраняется как цвет, live — «черный»).
Код в контексте здесь: https://github.com/HughEvans01/GameOfLife
Комментарии:
1. Возможно, стоит объяснить, что такое «Игра жизни Конвея», чтобы предоставить контекст для вопроса.
2. Это вообще неприемлемый ответ, но это то, что я сделал, и может вам помочь: codepen.io/ArthyFiciel/pen/LBWZrM . Проверьте «ПРАВИЛА ЯЧЕЕК» и обновите FN для правила Конвея
3. javascript — это не python,
2 <= neighbours <= 3
он не делает то, что вы думаете.
Ответ №1:
Вы обновляете ту же сетку, которую читаете. Возможно, вы захотите начать с двух сеток, текущего состояния и нового состояния. Выполните итерацию по ячейкам в текущем состоянии, чтобы вычислить новое состояние, затем используйте новое состояние для следующей итерации и так далее.
Вы можете выполнить множество оптимизаций, но это даст вам правильную отправную точку.
Кроме того, как отмечали другие, идиома 2 <= neighbours <= 3
не будет оценивать так, как вы думаете, в JS
Ответ №2:
Вы вычисляете количество соседей с теми же данными, которые вы изменяете. Результатом этого является то, что ячейка может менять состояние между мертвым / живым, а затем новые данные этой ячейки могут использоваться при вычислении «соседей» другой ячейки.
Ответ №3:
Вам нужны две копии сетки, чтобы сделать это правильно. Когда вы вычисляете новое поколение ячейки, вы должны использовать значение всех соседних ячеек из предыдущего поколения. Но вы перезаписываете каждую ячейку во время цикла, поэтому некоторые из соседей будут иметь свои новые значения вместо старых значений.
Итак, создайте две сетки, вызовите одну current_cells
и другую next_cells
. Используйте current_cells
, когда вы вычисляете, каким должен быть новый цвет, и назначаете его next_cells[x][y].colour
. У вас также должно быть else
предложение, которое просто копирует
next_cells[x][y].colour = current_cells[x][y].colour;
В конце цикла поменяйте местами их роли:
[next_cells, current_cells] = [current_cells, next_cells];