2013-12-12 2 views
1

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

--------- 
--------- 
--------- 
---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);    
} 
+1

вы должны использовать [перечисления] (http://docs.oracle.com/javase/tutorial/java/javaOO/enum.html) - это увеличит читаемость кода. – elyashiv

+0

Что вы подразумеваете под «клеточной смертью не хранится в следующем поколении»? –

+0

Можете ли вы сузить область раздела, где, по вашему мнению, проблема? – StormeHawke

ответ

1

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

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

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

Правила:

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

Благодарим вас за ввод!

+0

Я думаю, что большинство из нас знает их ... Я имею в виду, кто не закодировал Игру жизни? Кто может сопротивляться? :) – tilpner

2

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

Также нет такой вещи, как пустой символ ''. Пусто String - это просто String с нулевой длиной (то есть без символов), но «нет смысла». You может использовать 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 в коде

+0

Я согласен с тем, что использование перечислений сделает мой код более удобочитаемым и что он в каком-то смысле превосходит. Но если я правильно понимаю, это не имеет значения для функциональности программы, я использую char или enum. Правильно? Вы подразумеваете, что проблема заключается в том, что я использовал пустые символы. Я не знаю, это пробелы. Это не ['']. – user2979713

+0

Извиняюсь, я неправильно прочитал ваш первоначальный вопрос. Можете ли вы опубликовать свою конкретную ошибку? – StormeHawke