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 (Event Dispatch Thread) をブロックしないでください。ブロックすると、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 に答える