Что не так с моей (игрой Конвея) жизнью?

Я пытался написать ООП реализацию игры жизни Конвея в процессе обработки. Однако, похоже, это какой-то другой автомат. Интересно, но не то, что я собирался. Я не могу найти никаких проблем с моим кодом, это то, что я надеюсь, вы можете помочь с.

    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 ответ

Решение

Давайте посмотрим на этот раздел вашего кода:

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);
}

Есть пара вещей, которые здесь кажутся неправильными. Во-первых, что происходит, когда оба i а также j являются 0? Вы будете считать каждую клетку своим соседом, что неверно.

Во-вторых, что произойдет, если вы на грани? Вы собираетесь встретить ArrayIndexOutOfBoundsExceptionи вернуть мертвую клетку. Опять же, это, вероятно, не то, что вы хотите сделать. Подобные блоки тихого улова - это рецепт ошибок, которые вы не обнаружите, пока не увидите необъяснимое поведение.

Сделав шаг назад, вам действительно нужно привыкнуть к отладке кода. Вы могли бы разобраться во всем вышеперечисленном, создав меньший пример (скажем, сетку ячеек 3х3) и пройдясь по нему с помощью листа бумаги и карандаша, или отладчика, который поставляется с редактором обработки. Это всегда должно быть первым, что вы делаете.

Другие вопросы по тегам