Java扫雷程序嵌套for循环出现无限循环问题求助
解决你的Java扫雷程序无限循环问题
嘿,我一眼就揪出了导致无限循环的元凶——你的列循环里犯了个超容易手抖的小错误!
看你这段核心循环代码:
for(int c = 0; c <= (gameBoard[0].length - 1); r++){ //column
这里的循环增量写的是r++,但这明明是列循环啊!你应该用c++来让列变量逐步递增才对。
这个错误直接导致:
- 列变量
c永远停在初始值0,永远满足c <= 9的循环条件 - 而行变量
r却在每次列循环时不断被加1,完全不受控制 - 最终整个嵌套循环变成了无限循环,一直打印“New Cell”和对应的“new item”
修正后的核心代码
把列循环的r++改成c++就行:
public static void assignNumbers(int[][] gameBoard) { for(int r = 0; r <= (gameBoard.length - 1); r++){ //row for(int c = 0; c <= (gameBoard[0].length - 1); c++){ //column 这里改了r++为c++ System.out.print("New Cell "); for(int vR = r+1; vR > r-2; vR --){ //vR is visiting Row for(int vC = c+1; vC > c-2; vC --){ //vC is visiting Column System.out.print("new item "); if (isValid(vR, vC, gameBoard)){ System.out.print("isMine? "); if (isMine(vR, vC, gameBoard)){ gameBoard[r][c] += 1; System.out.print(" MINE "); } else { System.out.print(" NO "); } } } } System.out.println(); } } }
额外小提示(可选优化)
另外注意你的isValid方法里有个逻辑小问题:它会直接排除掉是地雷的单元格,但扫雷游戏中,我们统计相邻地雷时,其实不需要排除当前单元格(因为当前单元格如果是地雷,我们本来就不会给它赋值数字)。不过这个不影响循环问题,只是后续功能优化可以考虑的点。
修正后,你的程序就会正常遍历10×10棋盘的100个单元格,不会再无限循环啦!
内容的提问来源于stack exchange,提问作者Justin Bushfield
相关产品推荐
相关产品推荐

