パスファインダーに問題があります (これは私の初めてのことなので、当然のことでした) : 常に最短の道をたどるとは限りません。たとえば、1 マス下に移動したい場合、パスは 1 マス左、1 マス下、1 右になります。
public void getSquares(){
actPath = new String[Map.x][Map.y];
isDone = new boolean[Map.x][Map.y];
squareListener = new SquareListener[Map.x][Map.y];
getSquares2(x,y,0,new String());
}
public void getSquares2(int x, int y, int movesused, String path){
boolean test1 = false;
boolean test2 = false;
test1 = (x < 0 || y < 0 || x > Map.x || y > Map.y);
if(!test1){
test2 = Map.landTile[y][x].masterID != 11;
}
if(movesused <= 6 && (test1 || test2)){
addMoveSquare2(x,y, path);
getSquares2(x+1,y,movesused+1,path+"r");
getSquares2(x,y+1,movesused+1,path+"d");
getSquares2(x,y-1,movesused+1,path+"u");
getSquares2(x-1,y,movesused+1,path+"l");
}
}
public void addMoveSquare2(int x, int y, String path){
if(x >= 0 && y>=0 && x < Map.x && y < Map.y && (actPath[x][y] == null || actPath[x][y].length() > path.length())){
if(squareListener[x][y] == null){
actPath[x][y] = new String();
actPath[x][y] = path;
JLabel square = new JLabel();
square.setBounds(x*16,y*16,16,16);
square.setIcon(moveSquare);
squareListener[x][y] = new SquareListener(x,y,path);
square.addMouseListener(squareListener[x][y]);
Map.cases.add(square);
}
else{
squareListener[x][y].path = path;
}
}
}
SquareListener は、正方形の位置とそのパスを出力する単純な MouseListener です。Map.x、Map.y はマップ サイズです。getSquares2 は開始点で呼び出され、6 手離れたすべての正方形を描画し、値が "11" のすべてのケースを障害と見なします。
私が間違ったことを見つけるのを手伝ってくれませんか?
結果のスクリーンショットは次のとおりです。 http://img808.imageshack.us/img808/96/screen.gif 赤い四角が可能な目標です。実際のものは、プレーヤーが 1 つの正方形をクリックしたときにのみ定義されます (MouseListener は SquareListener であり、たどるパスを知っているはずです)。家屋は、値が「11」のケースで、障害物です。