我正在重做扫雷练习,并编写了这段代码以避免IndexOutOfBounds错误。有没有办法避免这种情况,所以我不必明确写出每个可能出错的if语句?我想让每个数组2索引更大,只是忽略第一个和最后一个索引。我错过了一些明显的东西吗?
if (row > 0 && col > 0)
ray[row - 1][col - 1] += 1;
if (row > 0)
ray[row - 1][col] += 1;
if (row > 0 && col < height - 1)
ray[row - 1][col + 1] += 1;
if (col > 0)
ray[row][col - 1] += 1;
if (col < height - 1)
ray[row][col + 1] += 1;
if (row < width - 1 && col > 0)
ray[row + 1][col - 1] += 1;
if (row < width - 1)
ray[row + 1][col] += 1;
if (row < width - 1 && col < height - 1)
ray[row + 1][col + 1] += 1;
答案 0 :(得分:5)
您可以使用循环来定义边界一次。类似的东西:
int startRow = max(row - 1, 0);
int endRow = min(row + 1, width - 1);
int startCol = max(col - 1, 0);
int endCol = min(col + 1, height - 1);
for (int r = startRow; r <= endRow; r++)
for (int c = startCol; c <= endCol; c++)
if (r != row || c != col) //it looks like you want to skip this cell
ray[r][c] += 1;
或者,如果操作是可逆的(如在此代码中,您添加1),则可以在循环后简单地反转中间单元格的操作。这将更有效,因为它消除了(最多)12次比较,前提是操作本身很简单:
int startRow = max(row - 1, 0);
int endRow = min(row + 1, width - 1);
int startCol = max(col - 1, 0);
int endCol = min(col + 1, height - 1);
for (int r = startRow; r <= endRow; r++)
for (int c = startCol; c <= endCol; c++)
ray[r][c] += 1;
//reverse the operation for the middle cell
ray[row][col] -= 1;
答案 1 :(得分:2)
您可以使用嵌套的if
语句简化代码。 (例如,您不需要多次检查row > 0
。)
但是,我要在每个维度上使数组2更大,让row
从1
到height
不等,col
从{{1}变化}通过1
,忽略边缘发生的事情。
在您的代码中,您似乎将width
与row
和width
与col
配对,这对我来说似乎是倒退。
答案 2 :(得分:0)
是的,可以使用for循环
完成for(int r=row-1; r<=row+1; r++)
for(int c=col-1; c<=col+1; c++)
if( r>=0 && r<ROWS && c>=0 && c<COLS && !(r==row && c==col) )
ray[r][c]++;