数组索引超出范围,使用多维数组作为游戏板

时间:2013-12-02 23:11:13

标签: java arrays multidimensional-array bounds

此代码将检查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;
                            }
            }
        }
    }

1 个答案:

答案 0 :(得分:1)

您错误地确定了电路板的边缘。这是你的一句话:

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 1}}。

您可以类似地更改其他条件。你说这是最大的11是正确的。

顺便提一下,在每种情况下,在break条件的两种情况下,您通常会ifelse除了break之外什么都不做。它在break

之外只有if看起来更具可读性和简洁性
if (condition) {
    // perform operation
}
break;