do-while循环无限运行:修改onGoing变量无效的排查与修复求助
问题排查与修复方案
嘿,我帮你看了下代码,问题不是变量作用域的问题(你声明的onGoing变量在整个do-while循环范围内都能正常访问),而是流程控制的逻辑漏洞:
当玩家1获胜时,你确实把onGoing设为了false,也break了当前的玩家1输入循环,但此时程序会继续执行do-while循环体里剩下的代码——也就是玩家2的整个输入流程。等玩家2的循环跑完之后,才会回到do-while的条件判断while(onGoing)。如果这时候玩家2没触发获胜逻辑,程序就会再次进入下一轮循环,看起来就像是无限运行了。
修复方法(两种可选)
方法1:获胜后立刻终止外层循环
在每个玩家的输入循环结束后,马上检查onGoing的状态,一旦为false就直接跳出外层的do-while循环:
boolean onGoing = true; do { String p1 = "playing"; while (p1.equals("playing")) { // 玩家1的输入与判断逻辑(保持不变) if (status.equals("win")) { System.out.println("PLAYER 1 WINS! YOU SUNK ALL OF YOUR OPPONENT'S SHIPS!"); onGoing = false; printBattleShip(board1); printBattleShip(board2); break; // 跳出玩家1的输入循环 } // 其他逻辑不变 } // 新增:如果已经分出胜负,直接终止外层循环 if (!onGoing) { break; } String p2 = "playing"; while (p2.equals("playing")) { // 玩家2的输入与判断逻辑(保持不变) if (status.equals("win")) { System.out.println("PLAYER 2 WINS! YOU SUNK ALL OF YOUR OPPONENT'S SHIPS!"); onGoing = false; printBattleShip(board2); printBattleShip(board1); break; // 跳出玩家2的输入循环 } // 其他逻辑不变 } // 新增:如果已经分出胜负,直接终止外层循环 if (!onGoing) { break; } } while (onGoing);
方法2:使用带标签的break(更简洁)
给外层的do-while循环加一个标签,当玩家获胜时,直接用带标签的break跳出整个外层循环,一步到位:
boolean onGoing = true; // 给外层循环加标签 gameLoop: do { String p1 = "playing"; while (p1.equals("playing")) { // 玩家1的输入与判断逻辑(保持不变) if (status.equals("win")) { System.out.println("PLAYER 1 WINS! YOU SUNK ALL OF YOUR OPPONENT'S SHIPS!"); onGoing = false; printBattleShip(board1); printBattleShip(board2); break gameLoop; // 直接跳出外层的gameLoop循环 } // 其他逻辑不变 } String p2 = "playing"; while (p2.equals("playing")) { // 玩家2的输入与判断逻辑(保持不变) if (status.equals("win")) { System.out.println("PLAYER 2 WINS! YOU SUNK ALL OF YOUR OPPONENT'S SHIPS!"); onGoing = false; printBattleShip(board2); printBattleShip(board1); break gameLoop; // 直接跳出外层的gameLoop循环 } // 其他逻辑不变 } } while (onGoing);
额外小建议
- 你可以把玩家输入、射击判断的逻辑提取成一个独立方法,因为玩家1和玩家2的逻辑几乎一模一样,只是操作的
board和history数组不同。这样代码会更简洁,后续改需求也更方便。 - 用
p1 += " no more"来结束内部循环的写法有点绕,换成一个boolean标记(比如boolean isTurnActive = true)或者直接在合法射击后break内部循环,逻辑会更清晰易懂。
内容的提问来源于stack exchange,提问作者uwugamer
相关产品推荐
相关产品推荐

