2

私はクラスのマインスイーパ プロジェクトのコードを書いています。1 つのメソッドは numAdjMines です。これは、配列内のセルの周りの地雷をカウントします。地雷は -2 のように、セルの種類ごとに異なる値があり、地雷にはフラグが付いています-4 です。if ステートメントを 1 つだけ書きたいのですが、同じコードを 2 回、最後に異なる値で記述しなければならなくなります。

if (row >= 1 && col >= 1 && boardArray[row - 1][col - 1] == MINE)
    {
        adjMines = adjMines + 1;
    }
if (row >= 1 && col >= 1 &&
            boardArray[row - 1][col - 1] == FLAGGED_MINE)
    {
        adjMines = adjMines + 1;
    }

|| を使ってみた またはおよび書き込み用 || boardArray[row-1][col-1] == FLAGGED_MINE 最初のものの最後に、しかしそれは行と列をチェックして最初を無視しました。このコードを書くための短いコンパクトな方法はありますか?

4

6 に答える 6

4

上記のコードは実際には単一の IF ステートメントに圧縮できますが、実際のコードにはさらに多くのステートメントが含まれていると思います。

このようなコードを単純化する最も簡単な方法は、IF ステートメントの 2 つの層に分割することです。外側のものには共通の条件が含まれ、内側のものには特定の条件が含まれます。

if (row >= 1 && col >= 1 ){

    int cell = boardArray[row - 1][col - 1];

    if( cell == MINE ){
        // Code here
    }

    else if( cell == FLAGGED_MINE )
    {
        // Code here
    }

}
于 2011-02-14T03:47:04.687 に答える
2

繰り返しを避けるために、ネストされた if ステートメントを使用できます。つまり、両方の条件が row & col >= 1 であることに依存しているため、それを独自のステートメントに引き出します。

次に、配列から値を複数回引き出すことを避けたいと思うので、変数に割り当てるのが最善の方法です。これはおそらく実行時に効率的ではありませんが、見た目は良くなります。

if (row >= 1 && col >= 1)
{
    int value = boardArray[row - 1][col - 1];
    if (value == MINE || value == FLAGGED_MINE)
    {
        adjMines = adjMines + 1;
    }
}
于 2011-02-14T03:49:30.770 に答える
0
for(    int r : array( row-1, row, row+1 ))
    for(int c : array( col-1, col, col+1 ))
    {
        if(r==row && c==col) // center
            continue; 

        if(0<=r&&r<ROWS && 0<=c&&c<COLS) // within bounds
        {
            int state = boardArray[r][c];
            if(state==MINE||state==FLAGGED_MINE)
                adjMines++;
        }
     }

int[] array(int... ints){ return ints; }

したがって、8つの個別のケースを作成する必要はありません。ここではそれほど大したことではありませんが、3D鉱山がある場合は...

于 2011-02-14T06:43:27.677 に答える
0

質問を完全に理解しているかどうかはわかりませんが、次のコードはよりコンパクトで、同じ目標を達成しています。

if (row >= 1 && col >= 1 && 
    (boardArray[row - 1][col - 1] == MINE || boardArray[row - 1][col - 1] == FLAGGED_MINE)) {
    adjMines++;
}

メイン配列への書き込みが、フラグが立てられた鉱山にとって良い考えかどうかはわかりません。プレイヤーが誤ってフリー セルにフラグを立てると、そのセルがフラグ付きの地雷としてマークされ、地雷が実際にそこにあったかどうかわからなくなると思います。これを処理するためのロジックがあるかもしれませんが、元のボード (データ構造) を後で参照できるようにしておくことは常に良いことです。

于 2011-02-14T03:54:05.020 に答える
0

括弧を使用して条件をグループ化できます

if(row >= 1 && col >= 1 && 
  (boardArray[row - 1][col - 1] == MINE
    || boardArray[row - 1][col - 1] == FLAGGED_MINE))
{
    adjMines = adjMines + 1;
}
于 2011-02-14T03:46:29.020 に答える
0

どの部分の繰り返しを避けようとしているのかはわかりませんが、if ステートメントをネストすることで、最初の部分の繰り返しを避けることができます。

if( row >= 1 && col >= 1 ) {
    if( boardArray[row - 1][col - 1] == MINE || 
        boardArray[row - 1][col - 1] == FLAGGED_MINE ) {

        adjMines = adjMines + 1;
    }
}

さらに一歩進んで、内側の if ステートメントをメソッド呼び出しにします。

于 2011-02-14T03:47:53.807 に答える