Игра правил жизни не работает должным образом

У меня есть следующий логический код для моего приложения Game of Life на Java. У меня проблема в том, что правила не действуют как стандартные правила игры жизни Конвея. Я читал о них в Википедии, и они следующие;

  • Любая живая клетка с менее чем двумя живыми соседями умирает, как если бы она была вызвана недостаточным населением.
  • Любая живая клетка с двумя или тремя живыми соседями живет для следующего поколения.
  • Любая живая клетка с более чем тремя живыми соседями умирает, как будто из-за переполненности.
  • Любая мертвая клетка с ровно тремя живыми соседями становится живой клеткой, как будто путем размножения.

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

int surroundingLife = 0;
if (lifeMap[cX+1][cY]) { //Right
    surroundingLife++;
}
if (lifeMap[cX-1][cY]) { // Left
    surroundingLife++;
}
if (lifeMap[cX][cY+1]) { // Above
    surroundingLife++;
}
if (lifeMap[cX][cY-1]) { // Below
    surroundingLife++;
}
if (lifeMap[cX-1][cY-1]) { // Bottom left
    surroundingLife++;
}
if (lifeMap[cX+1][cY+1]) { // Top Right
    surroundingLife++;
}
if (lifeMap[cX-1][cY+1]) { // Some other corner (I don't know which one)
    surroundingLife++;
}
if (lifeMap[cX+1][cY-1]) { // Yet another corner (I don't know which one)
    surroundingLife++;
}
if (running) {
    // Logic for life
    if (surroundingLife < 2 && lifeMap[cX][cY]) {// Rule 1. Any live cell with fewer than two live neighbours dies, as if caused by under-population.
        lifeMap[cX][cY] = false;
    } else if (surroundingLife == 2 && lifeMap[cX][cY]) { // Rule 2. Any live cell with two or three live neighbours lives on to the next generation.
        lifeMap[cX][cY] = true;
    } else if (surroundingLife == 3 && lifeMap[cX][cY]) { // Rule 3. Same as above
        lifeMap[cX][cY] = true;
    } else if (surroundingLife > 3 && lifeMap[cX][cY]) { // Rule 4. Any live cell with more than three live neighbours dies, as if by overcrowding.
        lifeMap[cX][cY] = false;
    } else if (surroundingLife == 3 && !lifeMap[cX][cY]) { // Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction.
        lifeMap[cX][cY] = true;
    }
}   

Вот как это выглядит после нескольких поколений;

GameOfBugs или BugsOfLife

Это напоминает мне набор правил "лабиринт", что странно.

Я не верю, что с моим калькулятором roundLife произошла ошибка, так как он возвращает 8, когда сущности окружают 8 других. Проблема из-за того, что я перебираю Y и X?

1 ответ

Решение

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

Вам нужно сделать копию сетки. Всегда проверяйте (читайте) из этой копии и применяйте изменения (пишите) к оригиналу.

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