You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 22:47:44