2016-11-03 9 views
0

Ich habe ein ziemlich einfaches Problem, aber ich kann nicht scheinen, es herauszufinden. Ich glaube, dass es ein logischer Fehler ist, der mit der Überprüfung von Nachbarn in zellulären Automaten zu tun hat. Hier ist mein Code, der einmal läuft eine zweite für den Anbau und die Überprüfung Nachbarn:Zelluläre Automaten, die Nachbarn überprüfen

public void grow(){ 
    Cell[][] next = new Cell[100][100]; 
    for(int row = 0; row < (SIZE_X/SIZE); row++){ 
     for(int col = 0; col < (SIZE_Y/SIZE); col++){ 
      Cell cell = grid[row][col]; 
      Cell nCell = grid[row][col]; // gets 

      if(cell != null){ 
       int amount = neighbors(row, col); // find out how many neighbors are ALIVE/ON 

       if(cell.isOn() == true && amount != 3) // if the current cell is on but doesnt have 3 alive neighbors, it gets turned off 
        nCell.onOff(false); 
       else if(cell.isOn() == false && (amount >= 1 && amount <= 4)) // if it is off and has 1-5 alive neighbors it gets turned on 
        nCell.onOff(true); 

       next[row][col] = nCell; 
      } 
     } 
    } 
    grid = next; 
} 

public int neighbors(int row, int col){ // checks the amount of neighbors that are ALIVE/ON 
    int amount = 0; 

    for(int r = row-1; r <= row+1; r++){ // stepping through a 3x3 area of the grid, which surrounds the selected block 
     for(int c = col-1; c <= col+1; c++){ 

      // clamp 
      if((r > 0 && r < 99) && (c > 0 && c < 99)){ 
       if(grid[r][c].isOn() == true && (r != row && c != col)) // checks if the current neighbor is ALIVE/ON 
        amount++; // if it is then add one to the count 
      } 
     } 
    } 
    return amount; 
} 

Im ein einfaches 12345/3 (Überleben/Geburt) Regel in meiner Cellular Automata verwenden.

Das Problem ist derzeit Ich habe ein 100x100 Gitter mit einem 10x10 Raum von ALIVE/ON Zellen in der Mitte. Nachdem mein Code einmal ausgeführt wurde, sterben alle Zellen.

Wenn jemand mehr Informationen benötigt, zögern Sie nicht zu fragen. Danke im Voraus!

Antwort

0

Es gibt einige Probleme, aber ich bin mir nicht sicher, wie alles als Ergebnis tot ist.

Erstes Problem:

if(cell.isOn() == true && amount != 3) // if the current cell is on but doesnt have 3 alive neighbors, it gets turned off 
    cell.onOff(false); 
if(cell.isOn() == false && (amount >=1 && amount <= 5)) // if it is off and has 1-5 alive neighbors it gets turned on 
    cell.onOff(true); 

Lassen Sie sich die Zelle übernehmen hat 1 Live-Nachbarn. Dann schaltet die erste Klausel aus und dann die zweite, um sie wieder einzuschalten. Die "Todes" -Regel funktioniert also nicht. Lösung: Verwenden Sie else if.

Zweites Problem:

Sie überprüfen alles in der gleichen Stelle. Zum Beispiel ist das Feld:

**. 
*.* 

Wir überprüfen Zelle (0,0) und dann Feld ist. *. .

Dann schließlich erste Zeile das Feld überprüft wird, ist: ... . Dann sterben alle. :) Lösung: Überprüfen Sie zuerst die Nachbarnummer für jede Zelle und speichern Sie sie in jeder Zelle. Erst danach schalten Sie sie nach den Regeln ein und aus.

Und drittes Problem: auf Feldkanten werden einige Nachbarn zweimal überprüft. Zum Beispiel ist die Zelle (0,0) eingeschaltet und wir überprüfen die Nachbarn für die Zelle (0,1). Zuerst versuchen wir (-1, 0), das zu (0,0) geändert wird und zu Menge hinzugefügt wird. Später wird wieder (0,0) als linker Nachbar angekreuzt und erneut zur Menge addiert.

+0

Entschuldigung für die späte Antwort. Also habe ich einige Änderungen implementiert, die die Probleme, über die Sie gesprochen haben, gelöst haben. Ein anderes Problem ist aufgetaucht, das ist jetzt eine massive Pyramide rechts von den Startblöcken und langsam wächst mit scheinbar keinen Reim oder Grund. Iv hat meinen Code aktualisiert –

0
if(grid[r][c].isOn() == true && (r != row && c != col)) 

Hier betrachten Sie nur Nachbarn, die nicht in der gleichen Zeile UND Spalte wie Ihre Center-Zelle sind. Als Ergebnis Youre Berücksichtigung 4 Zellen statt 8. du wohl gemeint:

if(grid[r][c].isOn() == true && (r != row || c != col) 
-1

So implementiert ich einige geändert, welche die Probleme, die Sie über gesprochen gelöst. Ein weiteres Problem ist jedoch aufgetaucht, welches nun eine massive Pyramide rechts von den Startblöcken macht und langsam rauskommt mit scheinbar keinem Reim oder Grund. Iv aktualisiert meinen Code

Ist Cell eine Klasse? Weil Sie nCell direkt aus dem Raster zuweisen.Wenn Sie dies als Referenz tun, ändern Sie auch den Wert der Zelle in der alten Gridview. Dadurch werden Muster erzeugt, die dazu neigen, sich in der unteren rechten Ecke des Rasters auszubreiten.

EDIT: Nur erkannte dies ist Java, und die oben kann es nicht wahr sein. Ignoriere dies, wenn es der Fall ist.

EDIT2: auch:

    if(cell.isOn() == true && amount != 3) // if the current cell is on but doesnt have 3 alive neighbors, it gets turned 
off 
        nCell.onOff(false); 
       else if(cell.isOn() == false && (amount >= 1 && amount <= 4)) // if it is off and has 1-5 alive neighbors it gets turned on 
        nCell.onOff(true); 

Dieses Netz nicht mit 1-5 Überleben 3 Geburt Regel.