我正在尝试在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}}异常,如果outofbounds
是y
那么它将是4-5并且我将获得超出范围的异常。
我打算做一个4
并为此做单独的陈述,但是当if(y<5)
为y
4
,3
时,我必须这样做。 {1}},2
和1
。
答案 0 :(得分:0)
如果您希望船只部件向左侧包裹,那么您必须在放置零件之前计算y
位置,并且环路不适合它。
通常,您的方法根本不需要遍历网格,因为您一次只放置一条船。
可以使用x
和y
值计算船只位置来替换整个方法,然后直接修改网格。
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] = '>';
}