0

この最初のコードは、あなたが見る必要があると私が信じているすべてです。コードの残りの部分は、何か不足している場合に備えています。

編集:実際、その2番目の j を ak に変更すると、問題が解決します。j を 2 回ループしていて、配列に対して値が大きくなりすぎていました。ありがとうございました!

public static void makeMove(){
    char[] path = new char[TicTacToeArray.length];
    int[][] DefensiveOppsArray = new int[TicTacToeArray.length][TicTacToeArray.length];

    for(int i=0; i < DefensiveOppsArray.length; i++){
        for(int j=0; j < DefensiveOppsArray.length; j++){
            DefensiveOppsArray[i][j] = 0;
        }
    }   

    for(int i=0; i < DefensiveOppsArray.length; i++){
        for(int j=0; j < DefensiveOppsArray.length; j++){
            //path for straight down
            for(j=0; j < DefensiveOppsArray.length; j++){
                path[j] = TicTacToeArray[i][j];}

                DefensiveOppsArray[i][j]=DefensiveOppsArray[i][j] + 1;


            }
        }
    }

私は三目並べ Java ゲームのこの割り当てに取り組んできましたが、"Exception in thread "main" java.lang.ArrayIndexOutofBoundsException: 3. This error comes from the line でスタックしてしまいましたDefensiveOppsArray[i][j]=DefensiveOppsArray[i][j] + 1;。私のDefensiveOppsArrayのサイズを適切に定義しました。

TicTacToeArray は UserTicTacToe から継承されます。テストクラスは単純です

public class Test3{

public static void main(String[] args){
    IntelligentTicTacToe2.promptUserTTT();
    }
}

TicTacToeArray と同じ長さの DefenseOppsArray を作成する必要があります。これにより、数字を操作して最適な動きを判断できるようになります。残念ながら、DefenceOppsArray 内の数値を作成して操作するだけで苦労しています。

public class IntelligentTicTacToe2 extends UserTicTacToe{

public static void promptUserTTT(){

    //read the input size
    System.out.print("Enter TicTacToe Array Size: ");
    int size = UserInput.readInt();
    System.out.println("");

    //start the game
    UserTicTacToe.startTTT(size);

    //keep track of consecutive errors
    int consecutiveErrors = 0;

    //display the initial game board
    UserTicTacToe.displayTTT();

    //let the user keep playing forever if they want to
    while(true){
        //get the input symbol from the user
        System.out.print("Enter Symbol (X or O): ");
        String symbol = UserInput.readString();
        System.out.println("");
        //hopefully the string is just one character - if not get just
        //the first character
        char sym = '*';
        if(symbol.length() > 0){
            sym = symbol.charAt(0);
        }

        //if the symbol was a Q, then quit
        if(sym == 'Q'){
            break ;
        }

        //get the row and column
        System.out.print("Enter Row to Place Symbol: ");
        int row = UserInput.readInt();
        System.out.println("");
        System.out.print("Enter Col to Place Symbol: ");
        int col = UserInput.readInt();
        System.out.println("");

        //update the game board and see if input was valid
        boolean inputValid = UserTicTacToe.updateTTT(sym,row,col);

        //re-display the game board if input was accepted
        if(inputValid){
            UserTicTacToe.scoreTTT();
            UserTicTacToe.displayTTT();
            consecutiveErrors = 0;
        }
        //if input was rejected, print a message, increment error count,
        //and quit if we are on the 5th error
        else{
            System.out.println("Invalid Input!");
            if(consecutiveErrors >= 4){
                break ;
            }
            consecutiveErrors++;
        }
        makeMove();



    }
}
4

3 に答える 3

2

問題はj、ネストされたループでカウンターとして 2 回使用することです

これが間違っているところです:

for(int i=0; i < DefensiveOppsArray.length; i++){
    for(int j=0; j < DefensiveOppsArray.length; j++){
        //path for straight down
        for(j=0; j < DefensiveOppsArray.length; j++){ // << here you use j again as counter
            path[j] = TicTacToeArray[i][j];
            DefensiveOppsArray[i][j]=DefensiveOppsArray[i][j] + 1;
        }
     }
}

おそらく、1 つのループをコーディングしすぎたのではないでしょうか?

于 2013-04-10T22:27:39.297 に答える
1

int j を 2 回インクリメントしています。

于 2013-04-10T22:30:01.597 に答える
1

問題は、変数として再利用されるネストされたforループです。jコードのその部分は、次のようにフォーマットする必要があります。

for(int i=0; i < DefensiveOppsArray.length; i++){
    for(int j=0; j < DefensiveOppsArray.length; j++){
        //path for straight down
        for(j=0; j < DefensiveOppsArray.length; j++){
            path[j] = TicTacToeArray[i][j];
        }

        DefensiveOppsArray[i][j]=DefensiveOppsArray[i][j] + 1;
    }
}

これにより、何が起こっているかが明確になります。j内側のforループで 3 に増加しているため、次の行に到達すると例外がスローされます。あなたがラインを意図しているかどうかはわかりません

DefensiveOppsArray[i][j]=DefensiveOppsArray[i][j] + 1;

その内側のforループにあるかどうかにかかわらず、ループが本当に必要な場合でもj、その内側のループで再利用しないでください。for

于 2013-04-10T22:39:23.117 に答える