Правила игры жизни Конвея - PullRequest
0 голосов
/ 15 апреля 2019

Я знаю, что это немного расплывчато, но я пытался реализовать правила игры Жизни Конвея в JS, но в результате я получаю путаницу (неправильный фрейм игры Жизни Конвея) , Может кто-нибудь сказать мне, что не так с моей реализацией правил?

      // Update state of selected cell
      if ((neighbours < 2) && (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) && (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) && (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) && (cells[y][x].colour == "black")) {
        // "Any live cell with more than three live neighbours dies, as if by overpopulation."
        cells[y][x].colour = "white";
      }

Примечание: я использую двумерный массив (матрицу) для хранения состояния игры, и каждая ячейка моделируется как простой объект - единственным важным параметром здесь является его состояние (хранится в цвете, в реальном времени "черный") ).

Код в контексте здесь: https://github.com/HughEvans01/GameOfLife

Ответы [ 3 ]

2 голосов
/ 15 апреля 2019

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

Можно выполнить множество оптимизаций, но это даст вам правильную отправную точку.

Кроме того, как отмечали другие, идиома 2 <= neighbours <= 3 не будет оценивать то, как вы думаете, как в JS

1 голос
/ 15 апреля 2019

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

Итак, создайте две сетки, назовите одну 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];
1 голос
/ 15 апреля 2019

Вы рассчитываете количество соседей с теми же данными, которые вы изменяете.Результатом этого является то, что ячейка может изменить состояние между мертвым / живым, и тогда новые данные этой ячейки могут быть использованы при вычислении «соседей» другой ячейки.

...