Реализовать игру жизни только с 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[]
массив, но опять же, вы, вероятно, даже не заметите улучшение.