2016-08-03 7 views
-2

Ich versuche ein Programm zu entwickeln, das Conways Spiel des Lebens demonstriert. Der Algorithmus, den ich geschrieben habe, sieht für mich einfach und bedeutungsvoll aus, obwohl die JRE anscheinend nicht mit mir übereinstimmt. Jedes Zellenobjekt hat zwei Zustände, die anzeigen, ob es lebendig ist und aktiv ist. Die Aktivierung einer Zelle erfolgt einfach nur, wenn der Algorithmus über alle Elemente des zweidimensionalen Arrays aus Zelle iteriert. Dies ist der wichtigste Aspekt des Programms, da das Programm wissen muss, was der vorherige Zustand aller Zellen ist. Und schließlich tritt die Geburt einer neuen Zelle auf, wenn Nachbarüberprüfungsalgorithmus herausfindet, dass eine Zelle (lebendig oder nicht) mit 3 Zellen umgeben ist.Warum funktioniert meine Implementierung von Conways Game of Life in Java nicht?

Ich berechne die Anzahl der Nachbarn einer einzelnen Zelle, indem ich suche, ob die umgebende Zelle aktiv ist oder nicht. Wenn also eine neue Zelle geboren wurde, wird sie nicht berücksichtigt. Es funktioniert wie erwartet.

Was ist das Problem mit meinem Algorithmus sehe ich nicht?

UPDATE

ich diese Nachbarn herausgefunden habe Algorithmus erzeugen Überprüfung fehlerhafte Daten in meinem neuen Prozess() -Methode. Außerdem habe ich den grundlegenden Algorithmus hinter dem Spiel geändert. Anstatt ein einzelnes Array zu haben, das zwei Zustände gleichzeitig hält, habe ich zwei separate 2D-Boolesche Arrays verwendet. Es hat die Dinge viel einfacher gemacht. Dennoch liefert das Programm weiterhin interessante und unwillkommene Daten.

private void process(){ 
    boolean[][] temp = new boolean[BOARD_LENGTH][BOARD_LENGTH]; 

    for(int i=0; i<cells.length; i++) 
     for(int j=0; j<cells[i].length; j++){ 
      if(i == 5 && j == 5) 
       System.out.println(getNeighborNumbers(i,j));//THIS IS WHERE I NOTICED THE PROBLEM. OUTSIDE THİS process() method, getNeighborNumbers() method works flawlessly, though when it comes here, things get interesting. 
      if(getNeighborNumbers(i,j) < 2 || getNeighborNumbers(i,j) > 3) 
       temp[i][j] = false; 
      else if(cells[i][j] = true && getNeighborNumbers(i,j) == 2) 
       temp[i][j] = true; 
      else if(getNeighborNumbers(i,j) == 3) 
       temp[i][j] = true; 
     } 


    for(int i=0; i<cells.length; i++) 
     for(int j=0; j<cells.length; j++) 
      cells[i][j] = temp[i][j]; 

    /* 
    System.out.println("5,4 " + getNeighborNumbers(5,4) +" "+ cells[5][4]); 
    System.out.println("5,5 " + getNeighborNumbers(5,5) +" "+ cells[5][5]); 
    System.out.println("5,6 " + getNeighborNumbers(5,6) +" "+ cells[5][6]); 
    System.out.println("6,5 " + getNeighborNumbers(6,5) +" "+ cells[6][5]); 
    System.out.println("6,6 " + getNeighborNumbers(6,6) +" "+ cells[6][6]); 
    */ 

} 


private int getNeighborNumbers(int i, int j){ 
    int neighbors = 0; 

    if(i>0 && j>0 && cells[i-1][j-1] == true) 
     neighbors++; 
    if(i>0 && cells[i-1][j] == true) 
     neighbors++; 
    if(i>0 && j+1< BOARD_LENGTH && cells[i-1][j+1] == true) 
     neighbors++; 
    if(j>0 && cells[i][j-1] == true) 
     neighbors++; 
    if(j+1<BOARD_LENGTH && cells[i][j+1] == true) 
     neighbors++; 
    if(i+1<BOARD_LENGTH && j>0 && cells[i+1][j-1] == true) 
     neighbors++; 
    if(i+1 <BOARD_LENGTH && cells[i+1][j] == true) 
     neighbors++; 
    if(i+1<BOARD_LENGTH && j+1<BOARD_LENGTH && cells[i+1][j+1] == true) 
     neighbors++; 

    return neighbors; 
} 

Was könnte das Problem sein, dass getNeighborNumbers falsche Daten erzeugt? Ich glaube mein Algorithmus ist so einfach wie es nur sein kann.

AKTUELLES UPDATE Nun, anscheinend statt schreiben ==, habe ich = geschrieben. Ich hätte niemals gedacht, dass diese Art von fehlerhaften Aussagen mich Stunden kosten würden.

+0

viel Code; absolut nicht erwähnt, was es ist oder nicht richtig macht? –

+0

die Bearbeitung entfernt etwa 90% der Code-Dump, die nicht verwandt war, ermutigen nicht nutzlos beheben meine Code-Dumps wie diese –

+1

"Einfach, Aktivierung einer Zelle tritt nur auf, wenn der Algorithmus über alle Mitglieder der Zelle zweidimensionalen Array iteriert . " - Die Aktivierung erfolgt nur basierend auf den vorherigen Zuständen. Maarten hat Recht, wenn Ihr Code den Status ändert, dann verwendet das nächste Bit diesen geänderten Zustand und nicht den vorherigen Zustand einer Kopie. Sie erstellen eine Kopie und erstellen dann den neuen Aktivierungsstatus des Boards. Anstatt einfach über die Karte in einer Scanzeile zu iterieren, wird der Zustand jedes Mal beschädigt. – Tatarize

Antwort

2

Sie ändern die Zellen so, wie Sie gehen, also verwenden Sie nicht den Zustand der Zellen der vorherigen Iteration.

Mit anderen Worten, Sie müssen den Zustand der vorherigen "Platine" speichern und verwenden, um eine neue Platine zu erstellen.

+0

Ich verwende den Zustand der vorherigen Iteration in gewisser Weise. Nachbar-Zählalgorithmus berücksichtigt nur ** aktive Zellen ** und eine Zelle wird nur dann aktiv, wenn Algorithmen ihre Arbeit abgeschlossen haben. –

+0

Eigentlich @ BurakGünes, von dem, was ich sehen kann, ist das nicht wahr. Sie rufen 'getNeighbourNumbers' auf, die Sie uns nicht zeigen, ändern dann den Status der Zelle, rufen dann diese anonyme Methode erneut auf, ändern dann den Status, ... Es sei denn,' getNeighbourNumbers' hat eine defensive Kopie des Boards behalten, nicht in diesem Post gezeigt, der Ärger macht. Sie zeigen auch keine 'refreshStates', also glaube ich nicht wirklich, dass jemand helfen kann. –

+1

@ BurakGüneş, yeah, angesichts Ihrer jetzt bearbeiteten Maartens Antwort ist eindeutig richtig.Conways Spiel des Lebens muss mit einer Kopie des Brettes beim letzten Mal und der neuen Kopie des Brettes getan werden. Ähnlich einer Faltungsoperation. Sie können nur tun, was Sie dort tun, indem Sie auf seltsame Weise nach oben und nach rechts schieben. Aber natürlich korrumpieren Sie die Daten mit einer Scanzeileninformation. – Tatarize