我的(康威游戏)生活有什么不对?

时间:2017-09-01 19:49:23

标签: java algorithm processing cellular-automata

我试图在处理过程中编写Conway的生命游戏的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;
}

出了什么问题?此外,我意外创建的自动机的任何信息都很酷,它会产生一些漂亮的图案。

1 个答案:

答案 0 :(得分:3)

让我们看一下代码的这一部分:

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,并返回一个死细胞。同样,这可能不是你想要做的。像这样的无声捕获块是一个错误的配方,除非你看到无法解释的行为,否则你无法检测到这些错误。

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