我正在使用2D阵列制作塔防游戏来绘制地图并为敌人创造路径。编号的节点表示可步行的路径,并告诉另一种方法如何绘制地图。
int[][] map = new int[][]
{
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 5 , 1 , 1 , 1 , 1 , 1 , 1 , 1 },
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{0 , 0 , 0 , 0 , 0 , 0 , 5 , 1 , 1 , 6 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{0 , 0 , 0 , 0 , 0 , 0 , 2 , 0 , 0 , 2 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{0 , 0 , 0 , 0 , 0 , 0 , 2 , 0 , 0 , 2 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{0 , 0 , 0 , 0 , 0 , 0 , 2 , 0 , 0 , 2 , 0 , 0 , 2 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{1 , 1 , 1 , 1 , 1 , 1 , 3 , 0 , 0 , 4 , 1 , 1 , 3 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
{0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 },
};
我现在卡住试图找到一种生成路径的方法。动画部分对我来说是可行的,但我正在尝试创建/找到一个算法,它有助于基本上跟踪路径并给出每个角落的坐标。
我尝试过这几种方式,但我开始变得非常混乱,结果不正常。
for(int x = 0; x < TILE_LENGTH_X; ++x){
for(int y = 0; y < TILE_LENGTH_Y; ++y){
if (map[y][x] > 2 & map[y][x] <7 & y == tempCorner){
pathXY.add(x);
pathXY.add(y);
if(correctOrder){
pathXY.add(tempX);
pathXY.add(tempY);
correctOrder = false;
tempCorner = tempY;
}
}
else if(map[y][x] > 2 & map[y][x] <7 & y != tempCorner){
if(!correctOrder){
pathXY.add(x);
pathXY.add(y);
}
else{
tempX = x;
tempY = y;
correctOrder = true;
}
}
}
}
这是我提出的最好的,但在路径中途失败了。我在这里缺少一些简单的技巧或逻辑吗?我可以想到一些非常混乱的方法来解决这个问题,但如果我改变地图数组,结果将是非常不可预测的。
答案 0 :(得分:0)
我不确定这是否有效,但您应该将++x
和++y
替换为x++
和y++
&# 39; s,因为原始代码将忽略整个第一个子数组和第二个数组中的第一个int
。
答案 1 :(得分:0)
我最终找到了比以前的尝试更清洁的解决方案。
public ArrayList<Coordinate> getPath(){
ArrayList<Coordinate> pathXY = new ArrayList<Coordinate>();
boolean scanSwitch = false;
int previousY = 0;
int previousX = 0;
//searches first column for first tile which is to be spawn location
for(int y = 0; !scanSwitch; y++){
if(map[y][0] > 0){
pathXY.add(new Coordinate(0 , y));
scanSwitch = true;
previousY = y;
}//end if - found first tile
}//end for - found first tile
//searches for corners by switching the search axis after each new corner is added
findpath:
for(int x = 0; scanSwitch; x++){
//adds the final path coordinate before exiting loop
if(x == TILE_LENGTH_X){
pathXY.add(new Coordinate(x - 1 , previousY));
break findpath;
}//end if - no more corners
if (map[previousY][x] > 2 & map[previousY][x] <7 & x != previousX){
pathXY.add(new Coordinate(x , previousY));
scanSwitch = false;
previousX = x;
}// end if - found corner
for(int y = 0; !scanSwitch; y++){
if (map[y][x] > 2 & map[y][x] <7 & y != previousY){
pathXY.add(new Coordinate(x , y));
scanSwitch = true;
previousY = y;
}// end if - found corner
}//end for - column scan
}//end for - row scan
for(Coordinate num : pathXY){
System.out.println(num);
}
return pathXY;
}