扫雷程序中,对numbers[][]数组赋值的疑问
来源:7-6 为扫雷程序加入交互
甲骨文_0001
2017-10-11
hi, 波波老师,疑问就在上面的图片中,
我的理解是:
private void calculateNumbers(){
for(int i = 0 ; i < N ; i ++)
for(int j = 0 ; j < M ; j ++){
if(mines[i][j]){
numbers[i][j] = -1;
continue;// ********这轮可以先退出******
}
numbers[i][j] = 0;
for(int ii = i-1 ; ii <= i+1 ; ii ++)
for(int jj = j-1 ; jj <= j+1 ; jj ++)
if(inArea(ii, jj) && isMine(ii, jj))
numbers[i][j] ++;
}
return;
}
1回答
-
赞!你说得对!这里要想保证有雷的地方numbers[i][j] == -1,在第一个if判断后应该做continue。我后续会修改一下代码,谢谢你:)
事实上,在我们的扫雷应用中,由于在访问numbers[i][j]前,一定要先看一下mines[i][j]:
* 如果用户点击操作过程中,左键点击有雷的格子,游戏应该直接结束了;
* 在区域扩展的过程,不会扩展minse[i][j]为true的区域;
所以,实际上,我们的逻辑永远不会访问mines[i][j]为true的格子的numbers[i][j]的值。对于mines[i][j]为true的地方,numbers[i][j]是几都无所谓!所以这个问题没有影响我们的逻辑。
但其实,我们可以将mines这个数组和numbers这个数组合二为一。numbers[i][j] == -1表示为雷;numbers[i][j] >= 0表示没有雷,并且表示周围雷的个数。这样做的话,这个问题就会影响我们的逻辑了:)
谢谢你提出的问题。非常抱歉代码有漏洞。如果愿意可以加一下我的微信:liuyubobobo,我会发给你一个小红包:)
012017-10-12