1

我是一个完整的java菜鸟。我仍然真的不知道如何编码。我的迷宫有问题。我现在可以从 start(2) 转到 end(3),但问题是 (start) 的图标。我试图打印出我们迷宫(mazePlan)的值,这很好。唯一的问题是图标。只有在递归函数完成后图标才会更改(我使用了 setIcons)。我需要获取这些图标以开始移动。谢谢!我真的需要一些帮助。谢谢!

 class solveButton implements ActionListener{
    private boolean goal;
    public void actionPerformed(ActionEvent e1)
    {  
        int i,j, a = 0,b = 0;
        goal = false;

        //Find 2/start
        for(i = 0; i<10; i++){
            for ( j = 0; j<10; j++){
                if (getMazePlan()[i][j] == 2){
                    a= i; b = j;
                }       
            }
        }   

        function(a,b);

        //print only
        for (i=0;i<10;i++){
            for(j = 0; j < 10; j++){
                System.out.print(getMazePlan()[i][j] + " ");
            }
            System.out.println();
        }

    }

    public void function(int y, int x){

        int ctr = 0,b ,a;

        //CHECKING FOR WALLS
        //LEFT
            if(x-1 >= 0 && x-1 <= 9){
                if(getMazeBoolean()[y][x-1] == false) 
                    ctr++;
            }
        //UP
            if(y-1 >= 0 && y-1 <= 9){
                if(getMazeBoolean()[y-1][x] == false) 
                    ctr++;
            }
        //RIGHT
            if(x+1 >= 0 && x+1 <= 9){
                if(getMazeBoolean()[y][x+1] == false) 
                    ctr++;
            }
        //DOWN
            if(y+1 >= 0 && y+1 <= 9){
                if(getMazeBoolean()[y+1][x] == false) 
                    ctr++;
            }

        try{
            Thread.sleep(1000);
        }catch(Exception e){}

            //print only
        System.out.println("Move");
        for (int i=0;i<10;i++){
            for(int j = 0; j < 10; j++){
                System.out.print(getMazePlan()[i][j] + " ");
            }
            System.out.println();
        }

        stack1.push(x);
        stack1.push(y);
        setMazePlan1(0, y, x);
        maze[y][x].setIcon(end);
        setMazeBoolean(true, y , x);


        //LEFT
        if(ctr > 0 && goal == false){
        if(x-1 >= 0 && x-1 <= 9){
            if(getMazeBoolean()[y][x-1] == false && getMazePlan()[y][x-1] != 3){
                setMazePlan1(2, y, x-1);
                function(y, x-1);
                ctr--;

                if(ctr != 0  && goal == false){
                    b = stack1.pop();
                    a = stack1.pop();
                    setMazePlan1(2, b , a);
                    stack1.push(a);
                    stack1.push(b);

                    try{
                        Thread.sleep(1000);
                    }catch(Exception e){}

                    setMazePlan1(0, b , a);
                }
            }
            else if(getMazePlan()[y][x-1] == 3){
                System.out.println("FINISH");
                goal = true;
            }
        }
        }
        //UP
        if(ctr > 0 && goal == false){
        if(y-1 >= 0 && y-1 <= 9){
            if(getMazeBoolean()[y-1][x] == false && getMazePlan()[y-1][x] != 3){
                setMazePlan1(2, y-1, x);
                function(y-1, x);
                ctr--;

            if(ctr != 0  && goal == false){
                b = stack1.pop();
                a = stack1.pop();
                setMazePlan1(2, b , a);
                stack1.push(a);
                stack1.push(b);

                try{
                    Thread.sleep(1000);
                }catch(Exception e){}

                setMazePlan1(0, b , a);
            }
            }
            else if(getMazePlan()[y-1][x] == 3){
                System.out.println("FINISH");
                goal = true;
            }
        }
        }
        //RIGHT
        if(ctr > 0 && goal == false){
        if(x+1 >= 0 && x+1 <= 9){
            if(getMazeBoolean()[y][x+1] == false && getMazePlan()[y][x+1] != 3 ){
                setMazePlan1(2, y, x+1);
                function(y, x+1);
                ctr--;

            if(ctr != 0  && goal == false){
                b = stack1.pop();
                a = stack1.pop();
                setMazePlan1(2, b , a);
                stack1.push(a);
                stack1.push(b);

                try{
                    Thread.sleep(1000);
                }catch(Exception e){}

                setMazePlan1(0, b , a);
            }
            }
            else if(getMazePlan()[y][x+1] == 3){
                System.out.println("FINISH");
                goal = true;
            }
        }
        }
        //DOWN
        if(ctr > 0 && goal == false){
        if(y+1 >= 0 && y+1 <= 9){
            if(getMazeBoolean()[y+1][x] == false && getMazePlan()[y+1][x] != 3){
                setMazePlan1(2, y+1, x);
                function(y+1, x);
                ctr--;

            if(ctr != 0  && goal == false){
                b = stack1.pop();
                a = stack1.pop();
                setMazePlan1(2, b , a);
                stack1.push(a);
                stack1.push(b);

                try{
                    Thread.sleep(1000);
                }catch(Exception e){}

                setMazePlan1(0, b , a);
            }
            }
            else if(getMazePlan()[y+1][x] == 3){
                System.out.println("FINISH");
                goal = true;
            }
        }
        }
        //DEADEND
        if(goal == false && ctr == 0){

            b = stack1.pop();
            a = stack1.pop();
            setMazePlan1(0, b , a);
            try{
            b = stack1.pop();
            a = stack1.pop();
            stack1.push(a);
            stack1.push(b);
            setMazePlan1(2, b , a);
            }
            catch(Exception e){

            }

            try{
                Thread.sleep(1000);
            }catch(Exception e){}

            //print only
            System.out.println("Pop");
            for (int i=0;i<10;i++){
                for(int j = 0; j < 10; j++){
                    System.out.print(getMazePlan()[i][j] + " ");
                }
                System.out.println();
            } 
        }

    }
}
4

2 回答 2

1

不要阻塞 EDT(事件调度线程)——当这种情况发生时,GUI 将“冻结”。而不是调用 实现重复任务Thread.sleep(n)的 Swing或长时间运行的任务。有关更多详细信息,请参阅Swing 中的并发。TimerSwingWorker

于 2012-04-08T07:28:56.530 回答
0

在不尝试破译您的大量代码的情况下,听起来好像需要在设置图标后强制重绘/绘制。

这里实际上没有足够的代码知道如何调用 repaint()...

您可能还想看看 Java GUI 应用程序/GUI 线程(即,如果可能需要一段时间,您不应该在 GUI 线程上做所有“迷宫”工作)

于 2012-04-05T03:15:02.593 回答