我的程序由一个由2D数组组成的网格组成。 用户输入删除网格的某些元素,留下空格。 我的问题是让空格上方的元素下降。
原来我有一个数组来检查空格是否为空,如果是空白,则上面的元素将被删除并重新创建曾经空白的地方。
我的问题是,我以前使用的数组是Left-> Right,Top-> Down(i ++,j ++),这让我不得不重复整个代码以获得新建的空白空间。 (例如,如果我从第3行删除了某些内容,则第2行将为空白,但我已经检查了第2行。
由于它会非常无效(包括过度修补错误)我决定做保留,底部>顶部,右侧>左侧阵列(i - ,j--),我的问题是我我得到一个数组越界错误,即使我确定它不可能超出界限。
以下是给出问题的代码
public static void dropBall(){
for (i =Settings.row-1;i>=0;i--){
for (j =Settings.col-1;i>=0 ; j--){
if (i <0||j<0)break;
if (Settings.grid[i+1][j]==666){
//checking if the space below has the 666 ID (666 ID equals to blank)
Settings.grid[i+1][j]=Settings.grid[i][j]; //Deleting the current blank
}
}
}
}
注意:
Settings.row and Settings.col
类似于something.lenght
,这意味着它们具有网格的长度,即使网格从0开始。
在这种情况下如何避免outofBounds错误?
答案 0 :(得分:0)
第3行:
for (j =Settings.col-1;i>=0 ; j--){
更改为:
for (j =Settings.col-1;j>=0 ; j--){
您可以删除if
后的行。
并在i
开始Settings.row-2
而不是
试试这个:
public static void dropBall(){
for (i =Settings.row-1;i>=0;i--){
for (j =Settings.col-1;j>=0 ; j--){
if (Settings.grid[i+1][j]==666){
//checking if the space below has the 666 ID (666 ID equals to blank)
Settings.grid[i+1][j]=Settings.grid[i][j]; //Deleting the current blank
Settings.grid[i][j] = 666;
}
}
}
}
答案 1 :(得分:0)
从底部的第二行开始,而不是从第一行开始(因为它下面没有行):
for (i = Settings.row-2 ... // instead of row-1
删除此行(它是多余的):
if (i <0||j<0)break;