-1

我正在尝试使用 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库。

4

1 回答 1

2

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

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

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

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

我还要指出,如果你以更小的块工作,你会有更好的运气。我的猜测是您编写了大部分代码,并且仅在全部编写后才尝试运行它。这种方法会让你头疼不已。您需要分小块工作,经常运行代码(每次添加一行),并在错误发生时立即调试,而不是在添加大量其他代码之后进行调试。

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

于 2017-01-21T23:43:12.697 回答