Отладка игры Life, Java

Я пытаюсь воспроизвести Игру в жизнь, но обнаружил ошибку. Клетки рождаются по замыслу, но не умирают. Это меня смущает, потому что моя стратегия уничтожения клеток такая же, как и их рождения. Вот сегмент вывода консоли, «x» представляет живые клетки, «-» представляет мертвые клетки.

---------
---------
---------
---xx----
----x----
----x----
----xx---
---------
---------

---------
---------
---------
---xx----
----xx---
---xx----
----xx---
---------
---------

---------
---------
---------
---xxx---
----xx---
---xx----
---xxx---
---------
---------

И соответствующий фрагмент кода:

public class Life {

final static int WIDTH = 9, HEIGHT = 9;

void start(){

    // scanning input file

    char[][][] board =  new char[WIDTH][HEIGHT][maxAllowedGenerations];
    board = getInitialBoard(initialBoardString, maxAllowedGenerations, board);

    for (int generation = 1; generation < maxAllowedGenerations; generation++){
        for (int y = 0; y < HEIGHT; y++)
            for (int x = 0; x < WIDTH; x++){

                int numberOfNeighbours = getNumberOfNeighbours(x, y, generation - 1 , board);

                if (board[x][y][generation - 1] == '-' && numberOfNeighbours == 3)
                    board[x][y][generation] = 'x';

                else if (board[x][y][generation - 1] == 'x' && numberOfNeighbours < 2)
                    board[x][y][generation] = '-';

                else board[x][y][generation] = board[x][y][generation - 1];


                if (board[x][y][generation] == 'x')
                    ui.place(x, y, LifeUserInterface.ALIVE);
                else
                    ui.place(x, y, LifeUserInterface.DEAD);

                out.print(board[x][y][generation]);
            }
            out.println();
        }
    }
    out.println("Max number of generations reached");
    System.exit(0);             
}

person user2979713    schedule 12.12.2013    source источник
comment
вам следует использовать перечисления — это повысит читабельность код.   -  person elyashiv    schedule 12.12.2013
comment
Что вы имеете в виду, говоря, что клеточная смерть не передается следующему поколению?   -  person Clément    schedule 12.12.2013
comment
Можете ли вы сузить область кода, где, по вашему мнению, проблема?   -  person StormeHawke    schedule 13.12.2013
comment
Вопрос отредактирован в соответствии с просьбой.   -  person user2979713    schedule 13.12.2013
comment
Пожалуйста, не портите себе вопросы. Если вы хотите удалить вопрос, удалите его, в противном случае сохраните его в читаемом/понятном состоянии.   -  person Sinkingpoint    schedule 16.12.2013


Ответы (2)


Я согласен с @elyashiv - если вы измените char[][][] board на SomeEnum[][][] board, а SomeEnum будет определено со значениями LIVE_CELL и DEAD_CELL, это сделает текст более читабельным.

Кроме того, не бывает пустого символа ''. Пустой String — это просто String нулевой длины (т.е. без символов), но '' не имеет смысла. Вы могли использовать null, но тогда вам пришлось бы отказаться от объявления примитива char и использовать вместо него Character, поскольку примитивы не могут быть null.

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

public enum SomeEnum {
    LIVE_CELL("X"),
    DEAD_CELL("");

    public final displayString;

    SomeEnum(String displayString) {
        this.displayString = displayString;
    }    
}

Затем для вашего дисплея вы можете ссылаться на SomeEnum.LIVE_CELL.displayString в своем коде.

person StormeHawke    schedule 12.12.2013
comment
Я согласен с тем, что использование перечислений сделало бы мой код более читабельным и во всех смыслах лучше. Но если я правильно понимаю, для функциональности программы не имеет значения, использую ли я char или enum. Верно? Вы подразумеваете, что проблема в том, что я использовал пустые символы. У меня нет, это пробелы. Это не ['']. - person user2979713; 12.12.2013
comment
Извините, я неправильно прочитал ваш исходный вопрос. Можете ли вы опубликовать свою конкретную ошибку? - person StormeHawke; 13.12.2013

Нашел две ошибки! Одну из них вы не смогли обнаружить, потому что я не опубликовал код, в котором она содержалась: я — ячейка в [x][y][g]. Я рассматривал [x][y][g - 1] как соседа, но это, конечно же, я! Я не мой собственный сосед.

Другая ошибка была немного смущающей на самом деле. Я пропустил правило номер 2... >.‹

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

Правила:

  1. Живые клетки с ‹ 2 живыми соседями умирают, как бы от одиночества.
  2. Живые клетки с > 3 живыми соседями умирают, как будто от перенаселения.
  3. Живые клетки с 2 || 3 живых соседа доживают до следующего поколения.
  4. Мертвые клетки с 3-мя живыми соседями оживают, как бы путем размножения.

Благодарим вас за все комментарии!

person user2979713    schedule 13.12.2013
comment
Я думаю, что большинство из нас знает их... Я имею в виду, кто не кодировал Игру жизни? Кто мог сопротивляться? :) - person tilpner; 14.12.2013