数组索引越界,使用多维数组作为游戏板



此代码将检查12x12网格中的每个单元格,看看它们的值是否可以扩展或移动。x是标准地砖,P是球员,我是感染者。感染可以复制到任何相邻的瓦片,而玩家显然会从一个瓦片移动到另一个瓦片。出于某种原因,每当我达到一定的圈数时,我总是会收到java.lang.ArrayIndexOutOfBoundsException:-1错误。

有什么想法吗?(请保存调整代码,直到问题解决后,伙计们,谢谢。:)

public static void tileMovement(char t, int i, int j) {
        Random rand = new Random();
        int dir = rand.nextInt(3);
        //System.out.println(t);
        if(t == 'x') {
        }
        else if(t == 'I') {
            double chance = Math.random();
            //System.out.println(chance);
            if(chance < 0.35) {
                myGrid[i][j] = t;
                switch(dir) {
                    case 0:
                        if(myGrid[i-1][j] == 'x'||i != 1){
                            myGrid[i-1][j] = t;
                            break;
                        }
                        else {
                            break;
                        }
                    case 1:
                        if(myGrid[i+1][j] == 'x'||i != 11){
                            myGrid[i+1][j] = t;
                            break;
                        }
                        else {
                            break;
                        }
                    case 2:
                        if(myGrid[i][j-1] == 'x'||j != 1){
                            myGrid[i][j-1] = t;
                            break;
                        }
                        else {
                            break;
                        }
                    case 3:
                        if(myGrid[i][j+1] == 'x'||j != 11){
                            myGrid[i][j+1] = t;
                            break;
                        }
                        else {
                            break;
                        }
                }
            }
        }
        else if(t == 'P'){
            myGrid[i][j] = 'x';                         // j = sideways, i = vertical
            switch(dir) {
                    case 0:
                            if(myGrid[i-1][j] == 'x'||myGrid[i-1][j] == 'I'||i != 1){
                                myGrid[i-1][j] = t;
                                break;
                            }
                            else {
                                break;
                            }
                    case 1:
                            if(myGrid[i+1][j] == 'x'||myGrid[i+1][j] == 'I'||i != 11){
                                myGrid[i+1][j] = t;
                                break;
                            }
                            else {
                                break;
                            }
                    case 2:
                            if(myGrid[i][j-1] == 'x'||myGrid[i][j-1] == 'I'||j != 1){
                                myGrid[i][j-1] = t;
                                break;
                            }
                            else {
                                break;
                            }
                    case 3:
                            if(myGrid[i][j+1] == 'x'||myGrid[i][j+1] == 'I'||j != 11){
                                myGrid[i][j+1] = t;
                                break;
                            }
                            else {
                                break;
                            }
            }
        }
    }

您错误地确定了板的边缘。这是你的一行:

if(myGrid[i-1][j] == 'x'||i != 1){

首先,索引从0开始。其次,在尝试访问数组之前,请先检查您是否在左边缘。利用"短路"评估:

if (i != 0 && myGrid[i - 1][j] == 'x') {

这里,如果i0,则条件是false,并且myGrid[i - 1][j] == 'x'从不被求值,并且它没有机会抛出ArrayIndexOutOfBoundsException

你可以类似地改变你的其他条件。你说得对,11是这里的最大值。

顺便说一句,在每种情况下,通常在if条件的两种情况下都是break,而else只做break。在if:之外仅使用break看起来更可读、更简洁

if (condition) {
    // perform operation
}
break;

最新更新