2

我正在为类的扫雷项目编写代码,一种方法是 numAdjMines,它计算数组中一个单元格周围的地雷,每种类型的单元格都有不同的值,比如地雷是-2,而地雷上有一个标志是-4。我只想写一个 if 语句,但我最终不得不写两次相同的代码,最后使用不同的值。

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 语句。外层包含一般条件,内层包含特定条件。

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

您可以使用括号对条件进行分组

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 回答
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
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 回答