Java 试图从“调用”中调用方法;“主菜单”;类,但它被卡住了,但是当从methods类调用时,它工作得非常好

Java 试图从“调用”中调用方法;“主菜单”;类,但它被卡住了,但是当从methods类调用时,它工作得非常好,java,Java,为了应对编码挑战,我决定制作游戏《战舰》。但是,当调用runGameAgainstAi()方法时,它拒绝工作,只绘制网格而不允许使用功能,它可能会陷入while循环,但我无法确定确切的问题。任何想法都值得赞赏 runGameAgainstAI代码: public void runGameAgainstAI() throws IOException, InterruptedException { // create the CPU object and initialize variab

为了应对编码挑战,我决定制作游戏《战舰》。但是,当调用runGameAgainstAi()方法时,它拒绝工作,只绘制网格而不允许使用功能,它可能会陷入while循环,但我无法确定确切的问题。任何想法都值得赞赏

runGameAgainstAI代码:

public void runGameAgainstAI() throws IOException, InterruptedException {

    // create the CPU object and initialize variables for the game
    cpu = new CPU();
    title.setText("Player 1");
    cpuGameTurn = "Picking";
    btnFire.setEnabled(true);

    boolean hasWon = false;
    // game loop
    while (true) {

        sleep(100);

        // this is reserved for when the human player is selecting a cell
        // by firing a valid shot, cpuGameTurn is set to "Picked"
        if (cpuGameTurn.equals("Picking")) {
            servermsg.setText("Select a cell and fire!");
        } 

        // upon shooting, the cpu checks if the shot hit
        // this condition is met when the btnFire is clicked
        // while selecting a valid cell
        else if (cpuGameTurn.equals("Picked")) {
            // check if the shot hit the cpu ships
            boolean hit = cpu.checkHit(eb.getRclick(), eb.getCclick());
            // place a corresponding marker
            if (hit) {
                eb.placeHitMarker(eb.getRclick(), eb.getCclick());
            } else {
                eb.placeMissMarker(eb.getRclick(), eb.getCclick());
            }
            // create the shot record
            sl.insert(new ShotRecord(eb.getRclick(), eb.getCclick(), hit, "You"));
            txaSList.setText(sl.toString());

            // if the cpu lost break, hasWon will be true
            hasWon = cpu.checkLost();
            if (hasWon) {
                break;
            }
            // set the turn to cpu
            cpuGameTurn = "cpu";
        }

        // when it is the cpu turn
        else if (cpuGameTurn.equals("cpu")) {
            // get the cpu shot, and check if it hit
            int shot[] = cpu.shoot();
            boolean hit = pb.checkEnemyShot(shot[0], shot[1]);
            // create the shot record
            sl.insert(new ShotRecord(shot[0], shot[1], hit, "CPU"));
            txaSList.setText(sl.toString());

            // if the cpu won break, hasWon will be false
            if (pb.hasLost()) {
                break;
            }
            // set the turn back to waiting for human to shoot
            cpuGameTurn = "Picking";
        }


    }

    if (hasWon) {
        servermsg.setText("You won!");
    } else {
        servermsg.setText("You lost!");
    }



}
针对ai运行游戏的自我测试主要方法:

 else {
        try {
            cui = new ClientUI();
            cui.runGameAgainstAI();
        }
试图调用runGameAgainstAI方法的单独类中的主菜单代码

        else if (evt.getSource() == btnSinglePlayer) {
        try {
            ClientUI c = new ClientUI();
            c.runGameAgainstAI();


        } catch (IOException | InterruptedException e) {
            e.printStackTrace();
        }

    }

乍一看,代码将无休止地在这个循环中。需要在if中更新cpuGameTurn

cpuGameTurn = "Picking";
while (true) {

    sleep(100);

    if (cpuGameTurn.equals("Picking")) {
        servermsg.setText("Select a cell and fire!");
    } 
.
.
.