Game of Life Randproblematik

Java xyrse123

Bekanntes Mitglied
Hallo,
bei meinem Game of Life, werden die Regeln für die nächste Generation auf alle Zellen bis auf den äußeren Rand angewendet(auf das 99*99 große Quadrat im Inneren des 100*100 Feldes). Ich wollte ein "unendlich" großes Feld haben damit z.B der Gleiter aus dem sichtbaren Teil verschwindet und nicht am Rand hängenbleibt. Wie könnte ich das umsetzten?
Schonmal danke im Vorraus.
 

Java xyrse123

Bekanntes Mitglied
Aber wie soll das gehen? Ich kann ja nicht die Nachbarn von den Randfeldern bestimmen, weil ich dann eine ArrayIndexoutofBounds Exception bekomme.
Gut, das mit dem unendlich großen Feld war Blödsinn.
 

Javinner

Top Contributor
Ich gehe davon aus, dass dein Gleiter eine Position im Raum hat. Wenn der Gleiter bis zum Dato die Grenzen des Raumes nicht überschreiten dürfte, dann waren die Grenzen des Gleiters die des Raumes.
Wenn aber ein Gleiter die Werte über die des Raumes einnehmen kann, dann ist er ja außerhalb des Fensters, oder nicht? Oder der Raum darf den Gleiter nur dann abbilden, wenn dieser innerhalb der eigenen (Raum) Grenzen liegt.
 

Java xyrse123

Bekanntes Mitglied
Also meinst du bei der wendeRegeln Methode ein größeres Array zunehmen als das sichtbare 100*100 Feld?
Ich hatte das jetzt so gemacht:
Java:
private int[][] wendeRegelnAn(int Welt[][]) { // Populationregeln
  int Welt_neu[][] = new int[200][200]; // zwischengepeicherte Welt
  for (int a = 1; a < 199; a++) {
   for (int b = 1; b < 199; b++) {
   
if (a < 99 && b < 99) {
     int nachbarn = Nachbarn(Welt, a, b);
     if (Welt[a][b] == 1) { // zur Zeit t lebendig
     
if ((nachbarn < 2) || (nachbarn > 3)) {
       Welt_neu[a][b] = 0; // Zelle tot
      }
   
  if (nachbarn == 2 || nachbarn == 3) {
       Welt_neu[a][b] = 1;
      }
     }
   
 if (Welt[a][b] == 0 && nachbarn == 3) { // zur Zeit t tot
      Welt_neu[a][b] = 1;
     }
    }     
   return Welt_neu;
 }
 

Meniskusschaden

Top Contributor
Also meinst du bei der wendeRegeln Methode ein größeres Array zunehmen als das sichtbare 100*100 Feld?
Das wäre jedenfalls eine Möglichkeit, die für deine Zwecke vielleicht ausreicht. Es kann dann aber natürlich passieren, dass im nicht sichtbaren Bereich lebende Zellen existieren, mit denen der Gleiter dann so kollidieren könnte, dass am Rand scheinbar aus dem Nichts neues Leben entsteht.
Vielleicht wäre auch eine "runde" Welt eine Alternative, bei der ein rechts verschwindender Gleiter, links wieder auftaucht.
 

Javinner

Top Contributor
In etwa so gemeint? Irgendwie weicht dein Code von der Frage ab..
Java:
public class Universe
{

 
    public static void main(String[] args)
    {
        Orbiter voyagerOne = new Orbiter("O");
        voyagerOne.setLocation(10, 5);
        Orbiter voyagerTwo = new Orbiter("T");
        voyagerTwo.setLocation(9, 7);
        Space milkyWay = new Space(20, 10);
        milkyWay.printSpace(voyagerOne, voyagerTwo);
        voyagerOne.warp(100, 100);
        System.out.println();
        milkyWay.printSpace(voyagerOne, voyagerTwo);
      
    }
  
}
/** Konsolenausgabe */
........................................
........................................
........................................
........................................
........................................
....................O...................
........................................
...................T....................
........................................
........................................

........................................
........................................
........................................
........................................
........................................
........................................
........................................
...................T....................
........................................
........................................
 

Meniskusschaden

Top Contributor
Ich hatte das jetzt so gemacht:
Deinen Code hatte ich mir noch gar nicht angesehen. Den finde ich ziemlich seltsam. Wie groß ist deine Welt denn nun? 200x200 oder 100x100? Da passen Array-Größe und Randabfragen doch nicht zusammen.
Ich würde mal ausprobieren, die Regeln auf die gesamte Welt anzuwenden, aber den äußeren Rand in der Visualisierung einfach weg lassen. Den Rand würde ich dabei so groß wählen, dass ein vollständiger Gleiter hinein passt. Das wäre zwar nicht perfekt, aber vielleicht gut genug.
In etwa so gemeint? Irgendwie weicht dein Code von der Frage ab.
Entweder habe ich dein Posting nicht verstanden oder du beziehst dich nicht auf das, was man bei Conways Game of Life normalerweise mit einem Gleiter meint.;)
 

Java xyrse123

Bekanntes Mitglied
Die sichtbare Welt ist nur 100*100 Zellen gross.
Wieso weicht das Programm den ab? Der Gleiter war nur als Beispiel, andere Zellen sollen auch am Rand verschwinden.
 

Java xyrse123

Bekanntes Mitglied
Ich habe die Welt jetzt 200*200 Zellen groß gemacht, wobei der sichtbare Teil nur 100*100 Zellen groß ist und jetzt funktioniert es.
Sorry Javinner, ich glaube ich habe dich mit meiner Frage etwas verwirrt, es ging um eine grafische Oberfläche(du hattest ja ein Konsolenprogramm als Beispiel), ich hatte es nur in diese Topic getan, weil es nicht direkt mit awt ,swing usw. zutun hatte.
Und so ganz verstehe ich dein Beispiel nicht, ein Gleiter bei Conways Game of Life besteht nämlich aus 5 lebenden Zellen und dreht sich dann immer um sich selbst(unendlich lange).
 

Ähnliche Java Themen

Neue Themen


Oben