使用角在2D阵列中创建路径

时间:2014-04-29 23:51:43

标签: java algorithm javafx

我正在使用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;
                }
            }
        }
    }

这是我提出的最好的,但在路径中途失败了。我在这里缺少一些简单的技巧或逻辑吗?我可以想到一些非常混乱的方法来解决这个问题,但如果我改变地图数组,结果将是非常不可预测的。

2 个答案:

答案 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;
}