我正在为类的扫雷项目编写代码,一个方法是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在第一个结束时,但是然后忽略了检查行和列的开头。我有一个简短的方法来编写这段代码吗?
答案 0 :(得分: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
}
}
答案 1 :(得分:2)
为避免重复,您可以使用嵌套的if语句,即两个条件都依赖于row& col is> = 1,所以把它拉进它自己的陈述中。
然后我猜你想避免多次从数组中拉出值,所以最好的办法是将它分配给变量。这可能在运行时效率不高,但是看起来更好。
if (row >= 1 && col >= 1)
{
int value = boardArray[row - 1][col - 1];
if (value == MINE || value == FLAGGED_MINE)
{
adjMines = adjMines + 1;
}
}
答案 2 :(得分:0)
您可以使用括号对条件进行分组
if(row >= 1 && col >= 1 &&
(boardArray[row - 1][col - 1] == MINE
|| boardArray[row - 1][col - 1] == FLAGGED_MINE))
{
adjMines = adjMines + 1;
}
答案 3 :(得分: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语句成为一个方法调用。
答案 4 :(得分:0)
我不确定我是否完全理解这个问题,但以下代码更紧凑并实现了相同的目标:
if (row >= 1 && col >= 1 &&
(boardArray[row - 1][col - 1] == MINE || boardArray[row - 1][col - 1] == FLAGGED_MINE)) {
adjMines++;
}
我不确定写入主阵列是否对标记的地雷是一个好主意。我想一个玩家可以错误地标记一个自由单元格,这会将单元格标记为标记为我的标记,你不会知道是否真的存在了一个地雷。也许你有处理这个问题的逻辑,但是让你的原始板(数据结构)安全以备将来参考总是好的。
答案 5 :(得分: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矿井......