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 を各次元 n より大きくし、変化させてから変化させ、row変化させて、端で何が起こるかを無視します。1heightcol1width

あなたのコードでは、 と とペアになっているように見えますがrowwidthこれcolheight私には逆に思えます。

于 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 に答える