我正在尝试使用 P5.JS 库在 JS 中创建康威生命游戏( 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;
}
}
我不知道我的错误在哪里,它不断抛出错误“未捕获的类型错误:无法读取未定义的属性 'ckd'”。我究竟做错了什么?
任何帮助深表感谢。
ps:不要标记为重复,使用p5库。