0

私は2D int配列の2つのオブジェクトを持っています.originalMapとrendedMapは、パズルゲームのマップに対応する数字を含んでいます。スレッド クラスから、クラス呼び出し Puzzle.java からマップ配列を取得し、それを変更します。

   int [][] rendedMap = Puzzle.getRendedMap().getMap();
   int [][] originalMap = Puzzle.getMapObj().getMap();

これは私のスレッドループです:

drawPuzzle(キャンバス、マップ); キャンバスと配列を受け取り、マップを描画します。

    while(running){
            if(!holder.getSurface().isValid())
                continue;

                    canvas = holder.lockCanvas();

                    if(runSolution && movements.size()>0){                      
                        executeSolution();
                        drawPuzzle(canvas, rendedMap);
                        if(finished){//checks if the execution finished
                            runSolution=false;
                        }
                    if(message.equals("No more actions") ||
                                    message.equals("Out of bounds, try again!")){
                            System.out.println(message);
                            drawPuzzle(canvas, originalMap);
                    }
                    }else{
                        drawPuzzle(canvas, originalMap);
                    }

                    drawMovements(canvas);
                    holder.unlockCanvasAndPost(canvas); 
    }
}

そして、これは私が配列を変更する方法です:

public void executeSolution(){

    numOfPlanets = 2;

    for(int x=0;x<rendedMap.length-1; x++){
        for(int y=0;y<rendedMap[x].length-1; y++){
            //Checks where the robot is and saves its initial position 
            if(rendedMap[x][y]>=7 && rendedMap[x][y]<=9){
                initX=x; initY=y; initial=true;
                System.out.println("Initial X: "+initX +" Y: "+initY );
                direction = rendedMap[x][rendedMap[x].length-1];
                System.out.println("Direction: "+direction );
            }
        }//end inner for
    }//end for

    if(movements.size()>0){
        for(int i=0; i<movements.size();i++){

            if(movements.get(i).getColour().equals("none")){
                if(movements.get(i).getMotion().equals("straight")){
                    if(direction==RIGHT){
                        if(rendedMap[initX][initY+1]==0){
                            finished=true;
                            message = "Out of bounds, try again!";
                            return;
                        }else{
                            rendedMap[initX][initY+1]= rendedMap[initX][initY+1]+6;
                            rendedMap[initX][initY]=rendedMap[initX][initY]-6;
                        }
                    }   
                }//action if
            }//color if 
        }//movements for loop

        if(numOfPlanets > 0 ){
            finished = true;

            message ="No more actions";
        }
    }//movements if statement
}

私の問題は、何らかの理由でrenderMap配列をレンダリングするとoriginalMapも変更され、originalMapを引き戻そうとすると元に戻らないことです。私はそれらを印刷して行ごとにチェックしましたが、それらは同じです。

これを引き起こす可能性のあるヒントはありますか?私はそれを理解するのに何日も費やします。

4

2 に答える 2

0
if(direction==RIGHT) {
    if(rendedMap[initX][initY+1]==0) {
        finished=true;
        message = "Out of bounds, try again!";
        return;
    } else {
        rendedMap[initX][initY+1]= rendedMap[initX][initY+1]+6;
        rendedMap[initX][initY]=rendedMap[initX][initY]-6;
    }
}

配列が初期化されていることを確認してください。rendedMapこれは、特に Android IDE 内でコンテキスト エラーにつながることが多いためです。

于 2013-02-06T18:56:48.397 に答える
0
if(!holder.getSurface().isValid())
                continue;

                    canvas = holder.lockCanvas();

                    if(runSolution && movements.size()>0){                      
                        executeSolution();
                        drawPuzzle(canvas, rendedMap);
                        if(finished){//checks if the execution finished
                            runSolution=false;
                        }
                    if(message.equals("No more actions") ||
                                    message.equals("Out of bounds, try again!")){
                            System.out.println(message);
                            drawPuzzle(canvas, originalMap);
                    }
                    }else{
                        drawPuzzle(canvas, originalMap);
                    }

                    drawMovements(canvas);

drawPuzzle の前にサーフェス ビューがロックされていることを思い出してください。それ以外の場合は、そのコンテキスト ループで実行されない可能性があるためです。これは、私たちの組織アプリに共通の問題です。

お役に立てれば!もっと助けを求めることをためらう

英語でごめんなさい私はインド人です

于 2013-02-06T19:19:32.160 に答える