Problem mit Größenänderung eines Arrays

  • Themenstarter Themenstarter Guest
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo!

Sitze an einem Game of Life-Spiel und habe ein Problem bei der Größenänderung eines Arrays.

Am Anfang des Spiels wird ein Array erzeugt, mit dessen Hilfe ich die neuen Generationen berechne und ausgebe.

Nun soll aber das vorhandene Array vergrößert/verkleinert werden. In der Benutzerschnittstelle rufe ich daher die resize-Methode meiner Spielklasse auf. Die sieht so aus:

Code:
public void resize(int cellCols, int cellRows) {
		int[][] actField = actField();
		GameOfLife resizedGame = new GameOfLife(actField, cellCols, cellRows);
		resizedGame.getPopulation();
	}[\code]

actField() soll das aktuelle Spielfeld liefern:

[code]int[][] actField() {
		return field;
	}

Dann wird der ein Konstruktor GameOfLife aufgerufen, der das aktuelle Spielfeld in ein neues Array kopiert:

Code:
public GameOfLife(int[][] field, int cellCols, int cellRows) {
		resizedField = new int[cellCols][cellRows];
		resizedField = copy(field);
		fieldCreated(true);
	}
	
	int[][] copy (int[][] field) {
		int colOld = field.length;
		int[][] newField = new int[colOld][];
		for(int i = 0; i < field.length; i++) {
			int rowOld = field[i].length;
			newField[i] = new int[rowOld];
			System.arraycopy(field[i], 0, newField[i], 0, rowOld);
		}
		return newField;
	}

Mein Problem ist jetzt, dass wenn ich nach dem resize-Aufruf in der Benutzerschnittstelle das nunmehr aktuelle Spielfeld ausgeben möchte, dieses immer noch genauso aussieht, wie das alte. Irgendwie stimmt da doch was mit dem kopieren nicht, oder?

Meine Ausgabe funktioniert so, dass Zellen, die in einer Liste mit lebenden Zellen enthalten ist, markiert werden.

Sieht da jemand meinen Denkfehler im Ablauf? Hab mir schon überlegt, ob ich vielleicht einen Counter brauche, der der Ausgabe-Methode sagt, dass ein neues Spielfeld vorliegt. Kommt mir aber ein bischen komisch vor...
 
Code:
public void resize(int cellCols, int cellRows) {
int[][] actField = actField();
GameOfLife resizedGame = new GameOfLife(actField, cellCols, cellRows);
resizedGame.getPopulation();
}

Hier wird eine neue, lokale Variable "GameOfLife resizedGame" erstellt - falls irgendwoanders eine liegt, kriegt die davon nichts mit.

Aber vielleicht sieht man den Fahler, nachdem ein Mod die Codetags repariert hat...
 
Danke für den Hinweis. Stimmt natürlich, dass resizedGame nur lokal ist...

Während des Spielstart wird ja ein neues GameOfLife-Objekt erzeugt. Hierzu benutze ich jedoch einen anderen Konstruktor. Das Spiel arbeitet dann mit diesen Objekt. An der Stelle resize() soll nun ja ein neues GameOfLife-Objekt mit obigem Konstruktor erzeugt werden. Jetzt muss ich also nur schauen, dass das erste Objekt durch das zweite ersetzt wird, oder?

Hab irgendwie keinen Durchblick mehr. Mein erster Konstruktor wird in der Klasse der Benutzerschnittstelle erzeugt. In der Benutzerschnittstelle rufe ich dann resize() der GameOfLife-Klasse auf, die dann wiederrum den Konstruktor aufruft. Wie schaff ich jetzt die Ersetzung ???:L ?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben