import java.util.Random; // erläutern wir später

public class GameOfLife{
   public static void gebeAus(boolean[][] m){
      // Ein "X" symbolisiert eine lebendige Zelle
      for (int i=0; i<10; i++){
         for (int j=0; j<10; j++){                       
            if (m[i][j]) System.out.print("X");
            else         System.out.print(" ");                                 
         }
         System.out.println();
      }
  }
  
   // Diese Methode lässt sich sicherlich schöner schreiben - wir 
   // nutzen hier die Tatsache aus, dass Java einen Fehler erzeugt,
   // wenn wir auf ein Element außerhalb der Matrix zugreifen
   public static int zaehleUmgebung(boolean[][] m, int x, int y){         
      int ret = 0;
      for (int i=(x-1);i<(x+2);++i){
         for (int j=(y-1);j<(y+2);++j){
            try{
               if (m[i][j])
                  ret += 1;
            }
            catch (IndexOutOfBoundsException e){}
         }
      }
      // einen zuviel mitgezaehlt?
      if (m[x][y])
         ret -= 1;
                                        
      return ret;     
   }   
  
   public static void main(String[] args){
      // unsere Welt soll aus 10x10 Elemente bestehen
      boolean[][] welt     = new boolean[10][10];     
      boolean[][] welt_neu = new boolean[10][10];

      // **********************************************************
      // Erzeugt eine zufällige Konstellation von Einsen und Nullen
      // in der Matrix welt. Die Chancen liegen bei 50%, dass eine
      // Zelle lebendig ist.            
      Random generator = new Random();
      double zufallswert;                     
      for (int i=0; i<10; i++){
         for (int j=0; j<10; j++){                       
            zufallswert = generator.nextDouble();
            if (zufallswert>=0.5) 
               welt[i][j] = true;
         }
      }
      // **********************************************************
                        
      // Ausgabe der ersten Generation
      System.out.println("Generation 1");
      GameOfLife.gebeAus(welt);
          
      int nachbarn;
      for (int i=0; i<10; i++){
         for (int j=0; j<10; j++){                       
            // Zaehle die Nachbarn
            nachbarn = zaehleUmgebung(welt, i, j);
                        
           if (welt[i][j]){
               // Regel 1, 2:
               if ((nachbarn<2) || (nachbarn>3))
                  welt_neu[i][j] = false;         
                                                
               // Regel 3:
               if ((nachbarn==2) || (nachbarn==3))
                  welt_neu[i][j] = true;
            }
            else {
               // Regel 4:
               if (nachbarn==3)
                  welt_neu[i][j] = true;
            }
         }
      }         
      // Ausgabe der zweiten Generation
      System.out.println("Generation 2");
      GameOfLife.gebeAus(welt_neu);
   }
}   
