2013-02-20 2 views
0

Я не уверен, что я собираюсь сделать это правильно, я создал свой код, который работает для всех механизмов «натюрморта», т.е. Улей, Блок, Лодка и Лофту. Тем не менее, для механизмов, которые, как предполагается, нужно манипулировать и включать в себя смерть и рождение клеток, у меня проблемы.Game Of Life Problems

Прямо сейчас я создаю ячейки сначала, а затем убиваю кого-либо, которые попадают в правила (если окружающие соседи являются суммарными, меньше или равными единице, равной или больше четырех).

Что я сейчас делаю, не работает, как это должно быть. Я буду включать некоторые изображения под мой код:

public class Untitled { 
    public static void main(String[] params){ 
     Life life = new Life(); 
     String[][] list = life.readGame(); 

     life.print(list); 
     System.out.println(); 

     for(int i = 1; i <= 5; i++){ 
      list = life.run(list); 
      life.print(list); 
      System.out.println(); 
     } 
    } 
} 

class Life { 
    public String[][] readGame(){ 
     String[][] array = { 
       { "-","-", "-", "-", "-", "-","-"}, 
       { "-","-", "-", "-", "-", "-","-"}, 
       { "-","-", "-", "x", "-", "-","-"}, 
       { "-","-", "-", "x", "-", "-","-"}, 
       { "-","-", "-", "x", "-", "-","-"}, 
       { "-","-", "-", "-", "-", "-","-"}, 
       { "-","-", "-", "-", "-", "-","-"} 
     }; 
     return array; 
    } 

    public void print(String[][] array){ 
     for(int x = 0; x < array.length; x++){ 
      for(int y = 0; y < array[x].length; y++){ 
       System.out.print(array[x][y]); 
      } 
      System.out.println(); 
     } 
    } 

    public String[][] run(String[][] array){ 
     populateCells(array); 
     System.out.println("Populated:\n"); 
     print(array); 
     killCells(array); 
     System.out.println("Killed:\n"); 
     print(array); 
     return array; 
    } 

    public int amountOfNeighbors(String[][] array, int x, int y){ 
     int amount = 0; 

     for(int x1 = -1; x1 <= 1; x1++){ 
      if(x + x1 >= 0 && x + x1 < array.length){ 
       for(int y1 = -1; y1 <= 1; y1++){ 
        if(y + y1 >= 0 && y + y1 < array[x1 + x].length){ 
         if(!(x1 == 0 && y1 == 0) && !array[x1 + x][y1 + y].equals("-")){ 
          amount++; 
         } 
        } 
       } 
      } 
     } 
     return amount; 
    } 

    public void populateCells(String[][] array){ 
     int neighbours; 

     for(int x = 0; x < array.length; x++){ 
      for(int y = 0; y < array[x].length; y++){ 
       neighbours = amountOfNeighbors(array,x,y); 

       if(neighbours == 3){ 
        array[x][y] = "x"; 
       } 
      } 
     } 
    } 

    public void killCells(String[][] array){ 
     int neighbours; 

     for(int x = 0; x < array.length; x++){ 
      for(int y = 0; y < array[x].length; y++){ 
       neighbours = amountOfNeighbors(array,x,y); 

       if(neighbours <= 1 || neighbours >= 4){ 
        array[x][y] = "-"; 
       } 
      } 
     } 
    } 
} 

Что касается изображений, то вот простая структура мигалки и то, что происходит после того, как население и удаления клеток:

1

2

3

+0

возможно дубликат [Игра жизни (игры Конвея) - как проверьте соседей по ячейкам] (http://stackoverflow.com/questions/8364301/the-game-of-lifeconways-game-how-to-check-for-cell-neighbours) –

ответ

4

Каждый раз, когда вы звоните run(), вам нужно cr используйте копию оригинальной доски и используйте эту копию, чтобы проверить состояние каждой ячейки при изменении ячеек на исходной плате.

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

Это довольно распространенная ошибка в моделировании, которые включают игровые платы, как игра в жизни - так что теперь вы знаете, чтобы следить за ним :)

+3

Или на 3-м и 4-м штатах на доске для указания следует удалить или добавить. – Dukeling

+1

^Это также будет работать и в основном эквивалентно (+1). Я бы по-прежнему поощрял копирование вместо нескольких состояний, потому что тогда вы можете использовать встроенную функцию копирования массива вместо того, чтобы писать собственный код свопинга. – Cam

+0

Можете ли вы уточнить, что вы подразумеваете под «проверять состояние каждой ячейки при изменении ячеек на исходной плате»? – user123