我的(康威的游戏)生活出了什么问题?

What's wrong with my (Conway's Game Of) life?

我试图在处理中编写康威生命游戏的 OOP 实现。然而,它似乎是某种其他类型的自动机。有趣,但不是我想要的。我没有发现我的代码有任何问题,这就是我希望你能帮助解决的问题。

    class Cell {
    int state;
    int x;
    int y;

    Cell update()
  {
    try {

      int neighbors = 0;
      for (int i = -1; i <= 1; i++) {
        for (int j = -1; j <= 1; j++) {
          neighbors += currentBoard[x+i][y+j].state;
        }
      }
      if      ((state == 1) && (neighbors <  2))return new Cell(x, y, 0);
      else if ((state == 1) && (neighbors >  3))return new Cell(x, y, 0); 
      else if ((state == 0) && (neighbors == 3))return new Cell(x, y, 1); 
      else return new Cell(x, y, state);
    }
    catch(ArrayIndexOutOfBoundsException exception) {
      return new Cell(x, y, 0);
    }
  }

  Cell( int _x, int _y, int _s)
  {
    state = _s;
    x = _x;
    y = _y;
  }
}

Cell[][] currentBoard;
Cell[][] newBoard;

void setup() {
  fullScreen();
  //frameRate(100);
  currentBoard = new Cell[width][height];
  newBoard = new Cell[width][height];
  for (int i = 0; i < width; i++)
  {
    for (int j = 0; j < height; j++)
    {
      currentBoard[i][j] = new Cell(i, j, int(random(2)));
    }
  }
}

void draw() {
  print(frameCount);
  for (int i = 0; i < width; i++)
  {
    for (int j = 0; j < height; j++)
    {
      try {
        newBoard[i][j] = currentBoard[i][j].update();
      }
      catch(ArrayIndexOutOfBoundsException exception) {
      }
    }
  }


  for (int i = 0; i < width; i++)
  {
    for (int j = 0; j < height; j++)
    {
      color setCol = color(255, 0, 0);
      if (newBoard[i][j].state == 1)
      {
        setCol = color(0, 0, 0);
      } else if (newBoard[i][j].state == 0)
      {
        setCol = color(255, 255, 255);
      }


      set(i, j, setCol);
    }
  }
  currentBoard = newBoard;
}

怎么了?另外,关于我不小心创建的自动机的任何信息都会很酷,它会创建一些漂亮的图案。

让我们看看您的这部分代码:

try {

  int neighbors = 0;
  for (int i = -1; i <= 1; i++) {
    for (int j = -1; j <= 1; j++) {
      neighbors += currentBoard[x+i][y+j].state;
    }
  }
  if      ((state == 1) && (neighbors <  2))return new Cell(x, y, 0);
  else if ((state == 1) && (neighbors >  3))return new Cell(x, y, 0); 
  else if ((state == 0) && (neighbors == 3))return new Cell(x, y, 1); 
  else return new Cell(x, y, state);
}
catch(ArrayIndexOutOfBoundsException exception) {
  return new Cell(x, y, 0);
}

这里有几处似乎不对劲。首先,当 ij 都是 0 时会发生什么?您要将每个单元格都算作自己的邻居,这是不正确的。

其次,如果你处于优势地位会怎样?你将遇到一个 ArrayIndexOutOfBoundsException 和 return 一个死细胞。同样,这可能不是您想要做的。像这样的静默捕获块是导致错误的秘诀,在您看到无法解释的行为之前,您不会检测到这些错误。

退一步说,你真的需要养成debugging your code的习惯。您可以通过创建一个较小的示例(例如,一个 3x3 的单元格网格)并使用一张纸和一支铅笔或 Processing 编辑器附带的调试器逐步完成上述所有操作。这应该永远是你做的第一件事。