康威的生命游戏 - JS

时间:2017-01-21 23:34:44

标签: javascript conways-game-of-life p5.js codepen

我试图在JS中使用P5.JS库创建Conways Game of Life(https://en.wikipedia.org/wiki/Conway%27s_Game_of_Life),但我遇到了一些麻烦。继承人代码:

var winSize = 50;
var cellSize = 10;
var cells = [];
var but;

var gen = 0;
var popl;

function setup() {
  createCanvas(cellSize * winSize + winSize + 1, cellSize * winSize + winSize + 1);
  //create grid
  for (var b = (cellSize / 2) + 1; b < height; b += cellSize + 1) {
    for (var a = (cellSize / 2) + 1; a < width; a += cellSize + 1) {
      cells.push(new Cell(a, b));
    }
  }
  but = createButton("RUN");
  but.mouseClicked(run);
}

function draw() {
  background(50);
  for (var a = 0; a < cells.length; a++) {
    cells[a].show();
  }
}

function Cell(a, b) {
  this.x = a;
  this.y = b;
  this.clr = 0;
  // true when alive, false when dead
  this.ckd = false;

  this.show = function() {
    rectMode(CENTER);
    noStroke();
    fill(this.clr);
    rect(this.x, this.y, cellSize, cellSize);
  }

  //if cell is dead, it comes to life, if cell is alive, it dies
  this.chk = function() {
    if (this.ckd) {
      this.ckd = false;
    } else this.ckd = true;

    if (this.ckd) {
      this.clr = 255;
    } else this.clr = 0;
  }
}

function mousePressed() {
  for (var a = 0; a < cells.length; a++) {
    if (mouseX >= cells[a].x - cellSize / 2 && mouseX <= cells[a].x - cellSize / 2 + cellSize && mouseY >= cells[a].y - cellSize / 2 && mouseY <= cells[a].y - cellSize / 2 + cellSize) {
      console.log("clicked " + a + " at " + cells[a].x + " , " + cells[a].y);
      cells[a].chk();
    }
  }
}

function run() {
  gen++;
  for (var a = 0; a < cells.length; a++) {
    // look for all cells that are alive
    if (cells[a].ckd) {
      //calculate its neighbors
      if (clcn(a) == 1 || clcn(a) == 4) {
        cells[a].chk();
      }
    } else { //all cells that are dead and calculate its neighbors
      if (clcn(a) == 3) {
        cells[a].chk();
      }
    }
  }
  popl = cells.length;
  //once done, run again
  run();
}

//function that calculates neighbors, takes index as arg
function clcn(a) {

  //first it looks for all cells that are corners (0, 49, 2499, 2450), then for all cells that are on edges, and then for the ones in the center (this is to avoid checking cells that dont exist)
  if (a === 0) {
    if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a + winSize + 1].ckd) {
      if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a + winSize + 1].ckd) {
        if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a + winSize + 1].ckd) {
          if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a + winSize + 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (a == 49) {
    if (cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize].ckd) {
      if (cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize].ckd) {
        if (cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize].ckd) {
          if (cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (a == 2499) {
    if (cells[a - 1].ckd || cells[a - winSize].ckd || cells[a - winSize - 1].ckd) {
      if (cells[a - 1].ckd || cells[a - winSize].ckd || cells[a - winSize - 1].ckd) {
        if (cells[a - 1].ckd || cells[a - winSize].ckd || cells[a - winSize - 1].ckd) {
          if (cells[a - 1].ckd || cells[a - winSize].ckd || cells[a - winSize - 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (a == 2450) {
    if (cells[a + 1].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd) {
      if (cells[a + 1].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd) {
        if (cells[a + 1].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd) {
          if (cells[a + 1].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (cells[a].y == 6) {
    if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
      if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
        if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
          if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (cells[a].x == 545) {
    if (cells[a - winSize].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a + winSize - 1].ckd) {
      if (cells[a - winSize].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a + winSize - 1].ckd) {
        if (cells[a - winSize].ckd || cells[a + winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a + winSize - 1].ckd) {
          if (cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a + winSize - 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (cells[a].y == 545) {
    if (cells[a - winSize].ckd || cells[a + 1].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd) {
      if (cells[a - winSize].ckd || cells[a + 1].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd) {
        if (cells[a - winSize].ckd || cells[a + 1].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd) {
          if (cells[a - winSize].ckd || cells[a + 1].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (cells[a].x == 6) {
    if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd || cells[a + winSize + 1].ckd) {
      if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd || cells[a + winSize + 1].ckd) {
        if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd || cells[a + winSize + 1].ckd) {
          if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - winSize + 1].ckd || cells[a + winSize + 1].ckd) {
            return 4;
          }
          return 3;
        }
        return 2;
      }
      return 1;
    }
  }

  if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
    if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
      if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
        if (cells[a + 1].ckd || cells[a + winSize].ckd || cells[a - winSize].ckd || cells[a - 1].ckd || cells[a - winSize - 1].ckd || cells[a - winSize + 1].ckd || cells[a + winSize - 1].ckd || cells[a + winSize + 1].ckd) {
          return 4;
        }
        return 3;
      }
      return 2;
    }
    return 1;
  }
}

我不知道我的错误在哪里,它一直在抛出错误&#34; Uncaught TypeError:无法读取属性&#39; ckd&#39;未定义&#34;。我究竟做错了什么?

非常感谢任何帮助。

ps:不要使用p5库标记为重复。

1 个答案:

答案 0 :(得分:2)

如果您不希望关闭您的问题,那么尝试在发布之前将问题范围缩小到MCVE。我们很难为您调试整个项目。你还应该准确地告诉我们错误在哪一行,并以某种方式指出这一行,以便我们不必计算行数。

话虽如此,您的错误有点不言自明:您正试图访问不存在的对象的ckd属性。如果您使用的是您尚未定义的变量,就会发生这种情况。

但是看看你的代码,我的猜测是你正在访问那些不存在的数组索引。

你需要做一些调试。发生错误时您访问了什么确切的索引?该数组有多少个索引?由于某些原因,两者之间存在不匹配,因此您应该追踪的是什么。请注意,我没有问过这个问题,所以你告诉我。这是你应该问自己的问题。这应该开始调试和追踪错误的过程。

我还要注意,如果你在更小的块中工作,你会有更好的运气。我的猜测是你编写了大部分代码,并且只是在编写完所有代码之后才尝试运行它。这种方法会给你带来很多麻烦。您需要在小块中工作,经常运行代码(每次添加一行),并在发生错误时立即调试错误,而不是在您添加了大量其他代码之后。

最后一点说明:这似乎是计算细胞邻居的一种非常迂回的方式。为什么不使用for循环而不是百万个嵌套if语句?