Kann man clone() so verwenden?

Kai008

Erfahrenes Mitglied
Ich teste mit einer Methode, wie viele Felder eine Figur mit einer bestimmten anz. an Bewegungen ziehen kann.
Das läuft in etwa so ab:

Zuerst hohlt sich die Start-Methode mal alle Variablen. Dann wird eine Methode aufgerufen und ihr alles übergeben. Diese markiert das aktuelle Feld als beziehbar, zieht von der Reichweite ab, und ruft die selbe Methode 4 mal auf, dabei werden die x und y - Koordinaten so übergeben, das jeweils die angrenzenden Felder getestet werden. Sobald die Reichweite 0 oder weniger ist returnt die jeweilige Methode, somit hat man am Ende alle beziehbaren Felder markiert.

So weit, so gut.
Nur jetzt wollte ich auch testen, welcher der kürzeste Pfad zwischen 2 Feldern ist.
Dabei wollte ich zuerst eine ArrayList deklarieren, und sie dem ersten Methodenaufruf übergeben. Dann wird jeder Methode die Liste und ein String übergeben. Im String steht "U", "R", "D" oder "L". (Up, right, down, left.)
Dieser wird dann in die Liste eingefügt. Findet ein Methodenaufruf das gesuchte Feld, wird die bisherige Anzahl an Aufrufen und die Liste als Klassenvar. abgespeichert. Findet eine andere das Feld, wird geprüft ob sie mehr oder weniger Züge gebraucht hat, sind es weniger werden die Variablen eben ersetzt. Am Ende wenn alle Methodenaufrufe beendet wurden, und er beim ersten Aufruf weitermacht will ich die Liste dann zurückgeben.
Nur kann ich sie ja nicht direkt übergeben, da sonst ja nur der Verweiß übergeben wird und im Endeffekt alle in die selbe Liste schreiben. Würde das mit ArrayList.clone() hinhauen?

Wem es interessiert, hier ist meine bisherige Prüfungsroutine um festzustellen welche Felder beziehbar sind. Bitte nicht schlagen, ist nicht gerade meine schönste Klasse:

Java:
package ingame.unitmove;

import ingame.Cursor;
import ingame.Terrain;
import ingame.unit.Unit;

import java.util.ArrayList;

import core.JFrame;

public class CheckUnitMoveFields extends Object
{
	public CheckUnitMoveFields()
	{
		super();
	}
	public static void run(Cursor c, ArrayList<Terrain> terrainList,
			ArrayList<Unit> unitList, JFrame jframe)
	{
		final int x = c.getX();
		final int y = c.getY();
		final int reichweite = checkUnit(x, y, unitList).getReichweite();
		final int fortbewegungstyp = checkUnit(x, y, unitList).getFortbewegungstyp();
		final int lvlwidth = 0;
		final int lvlheight = jframe.getUnitMoveVariables().getLevelHeight();
		
		switchAllDark(terrainList);
		loop(x, y, reichweite, fortbewegungstyp, lvlwidth, lvlheight, terrainList, unitList);
	}
	private static Unit checkUnit(int x, int y, ArrayList<Unit> unitList)
	{
		Unit unit = null;
		for(int i = 0; i < unitList.size(); i++)
			if(unitList.get(i).getX() == x && unitList.get(i).getY() == y)
				unit = unitList.get(i);
		return(unit);
	}
	private static void switchAllDark(ArrayList<Terrain> terrainList)
	{
		for(int i = 0; i < terrainList.size(); i++)
			terrainList.get(i).setImageId(1);
	}
	private static void loop(
			int x,
			int y,
			int reichweite,
			int fortbewegungstyp,
			int lvlwidth,
			int lvlheight,
			ArrayList<Terrain> terrainList,
			ArrayList<Unit> unitList)
	{
		Unit unit = checkUnit(x, y, unitList);
		//TODO begrenzung nach rechts!
		if(returnCondition(x, y, 0, lvlheight, unit))
			return;
		
		if(reichweite < 0)
			return;
		
		Terrain t = null;
		for(int i = 0; i < terrainList.size(); i++)
			if(terrainList.get(i).getX() == x && terrainList.get(i).getY() == y)
				t = terrainList.get(i);

		int moveCost = t.getMoveCost(fortbewegungstyp);
		
		if(moveCost == 0)
			return;
		else
			reichweite-= moveCost;

		if(unit == null)
			t.setImageId(0);
		
		loop(x + 32, y, reichweite, fortbewegungstyp, lvlwidth, lvlheight, terrainList, unitList);
		loop(x - 32, y, reichweite, fortbewegungstyp, lvlwidth, lvlheight, terrainList, unitList);
		loop(x, y + 32, reichweite, fortbewegungstyp, lvlwidth, lvlheight, terrainList, unitList);
		loop(x, y - 32, reichweite, fortbewegungstyp, lvlwidth, lvlheight, terrainList, unitList);
	}
	public static boolean returnCondition(int x, int y, int lvlwidth, int lvlheight, Unit unit)
	{
		if(x < 3)
			return(true);
		else if(y < 23)
			return(true);
		else if(y > lvlheight * 32 + 3)
			return(true);
		else if(unit != null && unit.getSpieler() == 1)
			return(true);
		
		return(false);
	}
}
 
Zurück