5

我正在重新制作扫雷以进行练习,并编写了这段代码以避免出现 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;
4

3 回答 3

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;
于 2013-03-18T04:21:47.003 回答
2

if您可以使用嵌套语句稍微简化代码。(例如,您不需要row > 0多次检查。)

但是,我会让数组 2 在每个维度上都变大,让row1through变化heightcol1through变化width,并忽略边缘发生的事情。

在您的代码中,您似乎rowwidthcol配对height,这对我来说似乎倒退了。

于 2013-03-18T04:18:09.213 回答
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]++;
于 2013-03-18T04:33:33.577 回答