Реализовать игру жизни только с 2 массивом

Я хочу эффективно использовать память (игра кода жизни Шиффмана в виде книги кодов). как можно изменить приведенный ниже код так, чтобы он имел только два массива и постоянно менял их, записывая следующий набор состояний в тот, который не является текущим массивом?

class GOL {
  int w = 8;
  int columns, rows;
  int[][] board;

  GOL() {
    // Initialize rows, columns and set-up arrays
    columns = width / w;
    rows = height / w;
    board = new int[columns][rows];
    //next = new int[columns][rows];
    // Call function to fill array with random values 0 or 1
    init();
  }

  void init() {
    for (int i = 1; i < columns - 1; i++) {
      for (int j = 1; j < rows - 1; j++) {
        board[i][j] = (int) random(2);
      }
    }
  }

  // The process of creating the new generation
  void generate() {

    int[][] next = new int[columns][rows];

    // Loop through every spot in our 2D array and check spots neighbors
    for (int x = 1; x < columns - 1; x++) {
      for (int y = 1; y < rows - 1; y++) {

        // Add up all the states in a 3x3 surrounding grid
        int neighbors = 0;
        for (int i = -1; i <= 1; i++) {
          for (int j = -1; j <= 1; j++) {
            neighbors += board[x + i][y + j];
          }
        }

        // A little trick to subtract the current cell's state since
        // we added it in the above loop
        neighbors -= board[x][y];

        // Rules of Life
        if ((board[x][y] == 1) && (neighbors < 2)) next[x][y] = 0;
        else if ((board[x][y] == 1) && (neighbors > 3)) next[x][y] = 0;
        else if ((board[x][y] == 0) && (neighbors == 3)) next[x][y] = 1;
        else next[x][y] = board[x][y];
      }
    }

    // Next is now our board
    board = next;
  }

  // This is the easy part, just draw the cells, fill 255 for '1', fill 0 for '0'
  void display() {
    for (int i = 0; i < columns; i++) {
      for (int j = 0; j < rows; j++) {
        if ((board[i][j] == 1)) fill(0);
        else fill(255);
        stroke(0);
        rect(i * w, j * w, w, w);
      }
    }
  }
}

1 ответ

Возможно, вам это не понравится, но честный ответ таков: не беспокойтесь.

Как можно изменить приведенный ниже код, чтобы иметь только два массива и постоянно менять их, записывая следующий набор состояний в тот, который не является текущим массивом

Это уже именно то, что делает код.

Игра жизни требует двух массивов. Если вы сталкиваетесь с реальными проблемами производительности, то ищите другие области для улучшения. Сосредоточение на массиве является красная сельдь.

Есть старая поговорка: преждевременная оптимизация - корень всего зла. Другими словами, вы не должны тратить время на попытки исправить код до того, как он сломается.

Одна очевидная вещь, которую вы могли бы улучшить: почему вы используете int[] массив вместо boolean[] массив? Вам нужно хранить только два состояния: живое или мертвое, поэтому используйте int значения кажутся ненужными. Вы сэкономите немного памяти, если переключитесь на boolean[] массив, но опять же, вы, вероятно, даже не заметите улучшение.

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