如何包装像侧滚动游戏?

时间:2017-09-11 16:54:02

标签: java indexoutofboundsexception

我正在尝试在2d屏幕上创建一个带有船只的游戏,如果要离开屏幕,我们想让它们换行。

public static void placeBoat (char [][] boat,int x, int y ){
    for(int row = 0; row < boat.length; row++){
        if(row==x){
            for(int column = 0; column < boat[row].length; column++){
                if(column==y){boat [x][y] = '>';
                boat [x][y-1] = '=';
                boat [x][y-2] = '|';
                boat [x][y-3] = '|';
                boat [x][y-4] = '=';
                boat [x][y-5] = '<';
                }
            }
        }
    }


}

所以作为一个例子,当我得到这些坐标时会发生这种情况,这就是它打印的内容。坐标引用船的前部打印,然后船的其余部分打印在它的左边。 / p>

1,18,
6,19,
2,6,
5,8,
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~<=||=>~~~~~~~~~~~~~
~<=||=>~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
~~~<=||=>~~~~~~~~~~~~~~~~~~~~~~~
~~~~~~~~~~~~~~<=||=>~~~~~~~~~~~~

我遇到的问题是试图找出如何做到这一点,如果其中一个坐标的y值小于5,因为那时船的其他部分将离开屏幕而我得到{{ 1}}异常,如果outofboundsy那么它将是4-5并且我将获得超出范围的异常。

我打算做一个4并为此做单独的陈述,但是当if(y<5)y 43时,我必须这样做。 {1}},21

2 个答案:

答案 0 :(得分:0)

如果您希望船只部件向左侧包裹,那么您必须在放置零件之前计算y位置,并且环路不适合它。

通常,您的方法根本不需要遍历网格,因为您一次只放置一条船。

可以使用xy值计算船只位置来替换整个方法,然后直接修改网格。

public static void placeBoat(char [][] boat, int x, int y){
    // the first part is at y
    boat [x][y] = '>';

    // size is 5 because there 5 more parts to the boat
    int[] nextYs = new int[5];

    for (int j = 0; j < nextYs.length; j++) {
        // next y is at y - 1
        int nextY = y - 1;

        // next y is to the left
        if (nextY >= 0) {
            // set y to - 1
            y = y - 1;
        // next Y is to the right
        } else {
            // next y and y itself should be set to the last column
            nextY = y = boat[x].length - 1;
        }

        nextYs[j] = nextY;
    }

    // print the other parts                
    boat [x][nextYs[0]] = '=';
    boat [x][nextYs[1]] = '|';
    boat [x][nextYs[2]] = '|';
    boat [x][nextYs[3]] = '=';
    boat [x][nextYs[4]] = '<';
}

答案 1 :(得分:0)

我认为最干净的解决方案是使用模运算符。

为简化解决方案,我建议稍微更改功能-而不是将y作为船的右端的位置,现在将其设为船的左端的位置。

如果您有一个长度为n = 5的数组,并且要从位置p = 4开始放置3个字符,则希望这些字符位于位置4、0、1:

BCxxA
01234

因此,无需包装代码即可:

array[p]     = 'A' // 4 + 0 = 4
array[p + 1] = 'A' // 4 + 1 = 5 - IndexOutOfBoundsException
array[p + 2] = 'A' // 4 + 2 = 6 - IndexOutOfBoundsException

请注意,位置4、5、6,模5会给您4、0、1,这正是您所需要的:

array[p]           = 'A' // 4 + 0               = 4
array[(p + 1) % n] = 'A' // (4 + 1) % 5 = 5 % 5 = 0
array[(p + 2) % n] = 'A' // (4 + 2) % 5 = 6 % 5 = 1

因此,您的情况应该是:

public static void placeBoat(char[][] boat, int x, int y) {
    boat[x][y] = '<';
    boat[x][(y + 1) % boat[x].length] = '=';
    boat[x][(y + 2) % boat[x].length] = '|';
    boat[x][(y + 3) % boat[x].length] = '|';
    boat[x][(y + 4) % boat[x].length] = '=';
    boat[x][(y + 5) % boat[x].length] = '>';
}