Игра в жизнь выполнены с петлями и логическое массива


Есть последующие: игра в жизнь переписана на два класса, Петри и клетки

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

Основные реализации:

  • Проверьте старое поколение с петлями
  • Проверить каждого из соседей каждой клетки...с петель
  • Установить статус в поколение
  • Копию нового поколения над старым

Это, кажется, есть некоторые серьезные недостатки, особенно в тяжелых Петель, который заставляет меня немного чешется.

private boolean[] cells; // Will be set at construction
private int width;
private int height;

/**
 * Evolve into the next nextGeneration.
 */
private void doGeneration() {
    boolean[] nextGeneration = new boolean[cells.length];

    for (int x = 1; x < width - 1; x++) {
        for (int y = 1; y < height - 1; y++) {
            int neighbors = 0;

            // Check surrounding cells.
            for (int neighborX = x - 1; neighborX <= x + 1; neighborX++) {
                for (int neighborY = y - 1; neighborY <= y + 1; neighborY++) {
                    if (neighborX != x || neighborY != y) {
                        if (cells[neighborX * width + neighborY]) {
                            neighbors++;
                        }
                    }
                }
            }

            int idx = x * width + y;

            switch (neighbors) {
                case 0:
                case 1:
                    nextGeneration[idx] = false;
                    break;

                case 2:
                    nextGeneration[idx] = cells[idx];
                    break;

                case 3:
                    nextGeneration[idx] = true;
                    break;

                default:
                    nextGeneration[idx] = false;
                    break;
            }
        }
    }

    cells = nextGeneration;
}

Редактировать: весь приложения (пятно на иждивении для ввода и рисования) можно найти на GitHub.

Edit2: есть ошибка в приведенном выше коде. Индекс, конечно, должны быть Г * ширина + х. Я споткнулась, что вчера, когда я пыталась справиться с неквадратными сетях, но я просто поняла, что случилось несколько минут назад, когда ехал в автобусе.



2623
2
задан 6 декабря 2011 в 07:12 Источник Поделиться
Комментарии
1 ответ

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

В любом случае, эта реализация может быть улучшена. Я бы извлечь список getSurroundingCells(инт cellIndex) и Инт countLiveCells(окончательный список cellIndexes) способ. В булевой getNextValue(инт cellIndex, логическое старого значения, инт liveNeighborCount) также может помочь.

2
ответ дан 6 декабря 2011 в 08:12 Источник Поделиться