Сотовые автоматы, реализованные в JavaScript и HTML5 Canvas - PullRequest
2 голосов
/ 20 декабря 2011

Я реализовал «Игру жизни» Конвея в JavaScript, но я не вижу таких же паттернов, как у Gosper's Glider Gun. Я сею сетку так, как это изображено в статье в Википедии, но пистолета никогда не бывает.

Кто-нибудь посмотрит на мой код и увидит, что с ним что-то не так, какие-нибудь предложения по реализации?

https://github.com/DiegoSalazar/ConwaysGameOfLife

1 Ответ

4 голосов
/ 20 декабря 2011

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

Создайте новое свойство willBeAlive и используйте его для хранения нового вычисленного живого состояния ячейки.После того, как все вычисления для этого поколения выполнены, установите для свойства каждой ячейки живое значение свойства willBeAlive и перерисовайте.

Вот изменения:

Automaton.prototype.update = function() {
  for (var x = 0; x < this.w; x++) {
    for (var y = 0; y < this.h; y++) {
      this.grid[x][y].killYourselfMaybe();
    }
  }
  // set the alive property to willBeAlive
  for (var x = 0; x < this.w; x++) {
    for (var y = 0; y < this.h; y++) {
            this.grid[x][y].alive = this.grid[x][y].willBeAlive;
        }
    }  
}


Cell.prototype.killYourselfMaybe = function(grid) {
  var num = this.numLiveNeighbors();

  this.willBeAlive = false;

  if (this.alive) {
    // 1. Any live cell with fewer than two live neighbours dies, as if caused by under-population.
    if (num < 2) this.willBeAlive = false;
    // 2. Any live cell with two or three live neighbours lives on to the next generation.
    if (num == 2 || num == 3) { this.willBeAlive = true}
    // 3. Any live cell with more than three live neighbours dies, as if by overcrowding.
    if (num > 3) this.willBeAlive = false;
  } else {
    // 4. Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.
    if (num == 3) this.willBeAlive = true;
  }
}

, а вот начальный массив для "Gosper's Glider Gun ":

[[2,6],[2,7],[3,6],[3,7],[12,6],[12,7],[12,8],[13,5],[13,9],[14,4],[14,10],[15,4],[15,10],[16,7],[17,5],[17,9],[18,6],[18,7],[18,8],[19,7],[22,4],[22,5],[22,6],[23,4],[23,5],[23,6],[24,3],[24,7],[26,2],[26,3],[26,7],[26,8],[36,4],[36,5],[37,4],[37,5]]
...