Wir haben die Aufgabe von der FH einen Schiebefix zu programmieren, dabei ist das meiste schon vorgegeben, wir müssen quasi nur den SchiebefixState programmieren. Hier stellt sich mir aber das Problem, dass die ArrayList mit möglichen Nachbar States in der Methode getNeighbours immer wieder die Daten überschreibt und auch der "UrspungsState" immer überschrieben wird. Ich stehe hier ziemlich auf dem Schlauch und wäre für jede Hilfe dankbar.
Also es geht nur um die Methode getNeighbours() {
Code:
Also es geht nur um die Methode getNeighbours() {
Code:
Java:
import java.util.*;
public class SchiebefixState implements State
{
private final int[][] schiebetafel;
private final int freeX;
private final int freeY;
private final int N;
public SchiebefixState(int[][] tafel, int x, int y){
if (tafel[x][y]!=0)
throw new IllegalArgumentException("Field (" +x+","+y+") must be free (0).");
this.schiebetafel = tafel;
this.freeX = x;
this.freeY = y;
this.N = tafel.length;
}
/**
* Liefert eine Liste mit allen gueltigen Nachfolgezustaenden.
*/
@Override
public List<State> getNeighbours() {
//=============================================
//Züge durch zwei Arrays darstellen
int [] zugX = {0, 1, 0, -1};
int [] zugY = {1, 0, -1, 0};
//Es gibt maximal 4 Zugmöglichkeiten, also maximal 4 Nachbarn
List<State> neighbours = new ArrayList();
for (int i = 0; i < zugX.length; i++) {
//prüfen ob Zielfeld noch im Schiebefeld liegt
int bewX = zugX[i];
int bewY = zugY[i];
if( (freeX + bewX + 1)> 0 && (freeY + bewY + 1)> 0 && (freeX + bewX )< N && (freeX + bewY )< N ) {
// Nun neuen State mit entsprechend vertauschten Feldern
//Erst aktuelle Tafel übernehmen
int[][] neighbour = schiebetafel;
// Felder vertauschen
neighbour[freeX][freeY]= neighbour[freeX + bewX][freeY + bewY];
neighbour[freeX + bewX][freeY + bewY] = 0;
int newX = freeX + bewX;
int newY = freeY + bewY;
neighbours.add(new SchiebefixState(neighbour, newX, newY));
//Änderungen rückgängig machen, damit sich die gespeicherten nicht durchegehend ändern
//new entspricht den alten freeX und freeY
newX = newX - bewX;
newY = newY - bewY;
neighbour[newX + bewX][newY + bewY] = neighbour [newX][newY];
neighbour[newX][newY] = 0;
State versuch = new SchiebefixState (neighbour, newX, newY);
}
}
return neighbours;
//=============================================
}
}
Zuletzt bearbeitet von einem Moderator: