# Conways Game of Life



## vigol13 (18. Jan 2014)

Regeln für das Spiel des Lebens:
Hat ein lebendes Feld mehr als 3 oder weniger als 2 lebende Nachbarn stirbt es.
Hat ein totes Feld genau 3 lebende Nachbarn wird es lebendig.

Ich habe einen Fehler in meinem Code und kann ich einfach nicht finden. Hab schon tagelang gesucht. Das Problem ist, dass bei der Methode berechneMatrix, während der Berechnung, die durch jedes Feld geht, schon das berechnete eingetragen wird. 
Das Programm sollte eigentlich jedes einzelne Feld in der Matrix1 durchgehen, prüfen ob Leben beim nächsten Durchgang entsteht oder stirbt, und das "berechnete" in Matrix2 eintragen. Jedoch wird schon während der Berechnung in Matrix1 eingetragen und so die Berechnung gefälscht.
Danke fürs Helfen.
MfG Vigol13


```
boolean[][] matrix1 = new boolean[ANZAHL_ZEILEN][ANZAHL_SPALTEN];
	boolean[][] matrix2 = matrix1.clone();
	
	public void paint(Graphics g) {
                //füllt in die Matrix zufällig Leben
		fuellenMatrix(matrix2); 
		int schritte = 0;
		do {
			ausgebenMatrix(matrix2);
			 matrix1 = matrix2.clone();
			 berechneMatrix(matrix1, matrix2);
 			schritte++;
                         //PAUSE 3 SEK
 			bremse(3000); 
			 System.out.println(schritte);
		} while (schritte < MAX_SCHRITTE && existierenUnterschiede(matrix1, matrix2));
	}

	public static void berechneMatrix(boolean[][] matrix1, boolean [][] matrix2) {
	
		for(int i = 0; i < matrix1.length; i++)
			for(int j = 0; j < matrix1[i].length; j++){
				if(matrix1[i][j] == false)
					if(anzLebendeNachbarn(matrix1, i, j) == 3)
						matrix2[i][j] = true;
					else
						matrix2[i][j] = false;
				else 
					if(anzLebendeNachbarn(matrix1, i, j) > 3 ||      anzLebendeNachbarn(matrix1, i, j) < 2)
						matrix2[i][j] = false;
					else
						matrix2[i][j] = true;
				}  
		}
	
	public static int anzLebendeNachbarn(boolean [][]matrix, int zeile, int spalte){
		int ret = 0;
		for(int i = zeile-1; i <= zeile+1; i++)
			for(int j = spalte-1; j <= spalte+1; j++)
				if(i>=0 && i<matrix.length && j>=0 && j<matrix[i].length)
					if(matrix[i][j] == true && !(i == zeile && j == spalte))
						ret++;
				
		return ret;
	}
}
```


----------



## Machareder (21. Jan 2014)

Ich Blick deinen Code grad mal überhaupt nicht 
Probier einfach mal diesen:
Hoffe das, dass der Richtige ist. ;D
Kurze Erklärung:
oben wo boolen[][] feld steht einfach dein GameofLive eintragen.
false = tote Zelle;
true = lebende Zelle

```
public class GameOfLife {
    boolean[][] feld ={{ false, false, false, false, false, false, false, false },
           { false, true, false, true, false, false, false, false },
           { false, true, true, false, false, true, true, false },
           { false, true, false, true, false, false, false, false },
           { false, false, false, true, false, true, false, false },
           { false, false, false, true, false, false, false, false },
           { false, false, false, false, false, false, false, false }};
 
    public static void main(String[] args) {
        GameOfLife myGame = new GameOfLife();
        for (int i = 0; i < 10; i++) {
            myGame.print();
            System.out.println();
            myGame.nextGeneration();
        }
    }
 
    public void print() {
        for (int i = 0; i < feld.length; i++) {
            for (int j = 0; j < feld[i].length; j++) {
                if (feld[i][j] == true)
                    System.out.print("o ");
                else
                    System.out.print(". ");
            }
            System.out.println();
        }
    }
 
 public void nextGeneration() {
 
  boolean[][] unsichtbaresFeld = new boolean[feld.length][feld[0].length];
  for (int n = 1; n < feld.length - 1; n++) {
 
   for (int m = 1; m < feld[n].length - 1; m++) {
    unsichtbaresFeld[n][m] = feld[n][m];
   }
  }
 
  for (int i = 1; i < feld.length-1; i++) {
 
   for (int j = 1; j < feld[i].length-1; j++) {
 
    int speichern = 0;
    
 
     if (unsichtbaresFeld[i + 1][j] == true) {
      speichern++;
     }if (unsichtbaresFeld[i + 1][j - 1] == true) {
      speichern++;
     }if (unsichtbaresFeld[i][j - 1] == true) {
      speichern++;
     }if (unsichtbaresFeld[i - 1][j - 1] == true) {
      speichern++;
     }if (unsichtbaresFeld[i - 1][j] == true) {
      speichern++;
     }if (unsichtbaresFeld[i - 1][j + 1] == true) {
      speichern++;
     }if (unsichtbaresFeld[i][j + 1] == true) {
      speichern++;
     }if (unsichtbaresFeld[i + 1][j + 1] == true) {
      speichern++;
     }
    
    if (unsichtbaresFeld[i][j] == true
      && (speichern == 2 || speichern == 3)) {
     feld[i][j] = true;
    } else if (unsichtbaresFeld[i][j] == true
      && (speichern < 2 || speichern > 3)) {
     feld[i][j] = false;
    } else if (unsichtbaresFeld[i][j] == false && speichern == 3) {
     feld[i][j] = true;
    }
   }
    
  }
 }
}
```


----------

