有没有办法避免这段代码?

时间:2013-03-18 04:11:08

标签: java

我正在重做扫雷练习,并编写了这段代码以避免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;

3 个答案:

答案 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更大,让row1height不等,col从{{1}变化}通过1,忽略边缘发生的事情。

在您的代码中,您似乎将widthrowwidthcol配对,这对我来说似乎是倒退。

答案 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]++;