0

ブロック「0」に隣接するすべてのタイルを開く再帰的な方法を使用して掃海艇を作成しています。

タイトルで述べた例外が発生するまで、すべてがうまくいきます。で例外が発生しif(removalList[num1][num2] == 1){return;}ますが、削除リストのすべての初期値をゼロに設定してください。(参考までに、は後で削除1するためにアイテムが既に に追加されていることを意味します)。removalList

また、 を実行して範囲内かどうかを確認しましたif(num1 > gameWidth || num2 > gameHeight || num1 < 0 || num2 < 0){return;}. (gameHeight and width are both 10)が、何らかの理由で範囲外であると考えられます。

ご協力いただきありがとうございます!

private void function(int c5, int r5)
{
    int num1 = c5;
    int num2 = r5;

    if(num1 > gameWidth || num2 > gameHeight || num1 < 0 || num2 < 0)
    {
        return;
    }
    if(removalList[num1][num2] == 1)
    {
        return;
    }
    if(blocks[num1][num2] == 0)
    {       
        System.out.println("Added (" + num1 + ", " + num2 + ") to removal list.");
        removalList[num1][num2] = 1;

        function(num1-1, num2);
        function(num1, num2-1);
        function(num1+1, num2);
        function(num1, num2+1);

    }
    else if(blocks[num1][num2] > 0 && blocks[num1][num2] < 9)
    {
        removalList[num1][num2] = 1;
        return;
    }
    else
    {
        return;
    }
}
4

2 に答える 2

1

配列のサイズが の場合、配列10内でアクセス可能な最大のインデックスは になりますarray[size-1]。サイズ以上のインデックスにアクセスしようとすると、 と呼ばれるものが得られますArrayIndexOutOfBoundsException

例えば:-

int[] test = new int[5];
test[0] = 1; // Allowed
test[1] = 2; // Allowed
test[2] = 3; // Allowed
test[3] = 4; // Allowed
test[4] = 5; // Allowed
test[5] = 6; // NOT Allowed - You'll get the ArrayIndexOutOfBoundsException here.

したがって、あなたの場合、

removalList[9][9]許可されremovalList[10][10]ますが、ArrayIndexOutOfBoundsExceptionが発生します。

于 2013-04-23T05:57:35.950 に答える
1

さらなるコード、特に の宣言を見なければ、removalList推測することしかできません。私の推測では、それremovalListにはgameWidth * gameHeight要素があります。したがって、インデックスは から0までgameWidth - 1および から0まで実行されgameHeight - 1ます。gameWidthあなたのチェックでは、とまでのインデックスが許可されてgameHeightいます。これにより、取得している例外が発生します。

于 2013-04-23T05:59:25.680 に答える