Welt in GameOfLife klonen

JanFausO

Mitglied
Hallo, ich habe folgendes problem:
Ich muss in GameOfLife eine vom Original kopierte Welt in ein aktuelles Array kopieren und mir fällt nicht so recht ein wie ich das lösen kann.
Im Code unten soll jetzt w1 in das Array CellState [][] worldarray überschrieben werden, leider weiß ich nicht recht wie.
Ich hoffe ihr könnt mir helfen, im Voraus besten Dank!!

Java:
   /**
     * Erstellt eine Welt als Kopie.
     *
     * @param w1;w2
     * @return
     *
     */
    public World(World other) throws IllegalWorldSizeException {
        this.width = other.getWidth();
        this.height = other.getHeight();
       
        World w1 = new World(width, height);
        for (int hoehe = 0; hoehe < this.getHeight(); hoehe++) {
            for (int laenge = 0; laenge < this.getWidth(); laenge++) {
                w1.set(laenge, hoehe, this.getField(laenge, hoehe));
              
            }
     
        }
       
    }
 
Hier sind drei World-Objekte im Spiel:
  1. Die aktuelle Welt (this), die gerade erzeugt wird (dein Code-Ausschnitt ist ja ein Konstruktor).
  2. Die dem Konstruktor übergebene Welt other.
  3. Die im Konstruktor erzeugte Welt w1.
Zu welchem Zweck erstellst du w1? Du könntest doch einfach die Daten aus other in this kopieren.
 
Also in der Aufgabenstellung steht es Folgendermaßen:
public World (World other)
Erstellt eine Welt als Kopie von other. Diesen Kopie-Konstruktor benötigen Sie im späteren Verlauf für die Spiellogik.
Achten Sie darauf, dass keine Referenzen zu Inhalten von other bestehen, sprich Änderungen nur in der neuen Welt auftreten.

Deswegen dachte ich, dass ich wenn ich keine neue Welt erstellen würde, ja stets die Daten in beiden Welten ändern würde und das ja laut Aufgabenstellung verboten ist.
 
Durch den Aufruf deines Konstruktors erstellst du ja bereits eine Welt. Wenn du innerhalb des Konstruktors dann noch eine erstellst, hast du eben eine zuviel. Den Code deines zweiten Konstruktors hast du nicht gepostet, aber falls der ähnlich arbeitet, kommt es sogar zu einer Endlos-Rekursion und schließlich zu einem Stack-Überlauf.
Hier findest du Infos zu Kopier-Konstruktoren.
 
Wird aber problematisch sobald mutable Objects verwendet werden. Jedenfalls mit dem da erwähnten Beispiel.
Stimmt. Aber soweit ich es sehe, führt das doch noch nicht zu Problemen, wenn das zu kopierende Objekt mutable ist, sondern erst, wenn es Attribute mit mutable Objects enthält? Das wäre im Buch und im bisher gezeigten World-Code ja (noch?) nicht der Fall. Im Buch wäre ein entsprechender Hinweis vielleicht auch angebracht.
 
Also in der Aufgabenstellung steht es Folgendermaßen:
public World (World other)
Erstellt eine Welt als Kopie von other. Diesen Kopie-Konstruktor benötigen Sie im späteren Verlauf für die Spiellogik.
Achten Sie darauf, dass keine Referenzen zu Inhalten von other bestehen, sprich Änderungen nur in der neuen Welt auftreten.

Deswegen dachte ich, dass ich wenn ich keine neue Welt erstellen würde, ja stets die Daten in beiden Welten ändern würde und das ja laut Aufgabenstellung verboten ist.

Du hast ja eine Instanz-Variable, die den Zustand der Welt darstellt : CellState [][] worldarray
Statt eine neue Welt (w1) zu erstellen, musst du nur das Array worldarray anlegen und befüllen.
Das müsstest du im anderen Konstruktor ja bereits gemacht haben.
 
Statt eine neue Welt (w1) zu erstellen, musst du nur das Array worldarray anlegen und befüllen.
Laut Aufgabenstellung soll er aber einen Copy-Konstruktor erstellen ... also schon eine neue Welt.

Edit: Vielleicht meintest du aber dass er in diesem Copy-Konstruktor eine neues
CellState[][] worldarray anlegen und befüllen muss.
 
Edit: Vielleicht meintest du aber dass er in diesem Copy-Konstruktor eine neues
CellState[][] worldarray anlegen und befüllen muss.

Genau das meinte ich. Der Copy-Konstruktor erstellt ja bereits die Welt.
Die World-Klasse hat 3 Instanzvariablen (width, height und worldarray).
2 davon wurden bereits richtig belegt. Es fehlte also nur mehr die Behandlund der Instanzvariablen worldarray.

P.S.: Ich kenne das Beispiel, da ich vor ein paar Tagen jemandem bei der Lösung geholfen habe. ;-)
 

Zurück
Oben