【问题标题】:Do While loop gets stuckDo While 循环卡住了
【发布时间】:2015-05-01 01:54:34
【问题描述】:

代码是井字游戏(正在进行中)。当我运行代码时,它会询问 X 的位置编号,然后它会停止。它与 while 循环有关,因为当我在没有它的情况下运行它时,它可以正常工作。但是,我需要循环将 X 设置为 false,以便轮到 O。

import java.util.Scanner;
class TicTacToe


{
public static void main(String[] args)

{
    Scanner scan = new Scanner(System.in);
    int XInput, OInput;
    boolean IfGameOver;
    String []board = {"1","2","3","4","5","6","7","8","9"};
    IfGameOver = false;
    boolean Xturn, Oturn;
    Xturn = true;
    Oturn = false;

    System.out.print("Welcome to Tic-Tac-Toe!\n\n");
do
    {

        {
         System.out.println(" " + board[0] + board[1] + board[2]);
         System.out.println(" " + board[3] + board[4] + board[5]);
         System.out.println(" " + board[6] + board[7] + board[8]);
        }
             if (Xturn)
             System.out.println("It is X's turn, position number?");
             if (Oturn)
             System.out.println("It is O's turn, position number?");

            do
                {
                try
                {
                XInput = scan.nextInt();
                board[XInput-1] = "X";
                Oturn= true;
                Xturn = false;
                }
                catch (NumberFormatException e)
                {
                    System.out.println("Invalid input. Please enter a position number");
                    XInput = scan.nextInt();
                }
                }while(Xturn = true);
            do
                {
                try
                {
                OInput = scan.nextInt();
                board[OInput-1] = "X";
                Oturn = false;
                Xturn = true;
                }
                catch (NumberFormatException e)
                {
                    System.out.println("Invalid input. Please enter a position number");
                    OInput = scan.nextInt();
                }
                }while (Oturn = true);

    } while (!IfGameOver);
}
}

【问题讨论】:

  • “没有它就运行它” - 代词太多!
  • 您可能希望删除 catch 语句中的第二个 scan.nextInt(),因为您会连续两次要求输入。
  • 我建议,你把用户输入循环移动到它自己的方法中,这样你可以进一步降低复杂度

标签: java while-loop


【解决方案1】:

您有多个问题。如前所述,您没有在 while 语句中使用相等检查,但其他问题会覆盖这个问题。您在轮到 X 之后但在轮到 O 的 do-while 循环之前将 Oturn 设置为 true。因此,您将在 X 输入之后立即进入 Oturn do 循环。这应该清理它...

import java.util.Scanner;
class TicTacToe

{
public static void main(String[] args)

{
    Scanner scan = new Scanner(System.in);
    int Input;
    boolean IfGameOver;
    String []board = {"1","2","3","4","5","6","7","8","9"};
    IfGameOver = false;
    boolean Xturn = true;

    System.out.print("Welcome to Tic-Tac-Toe!\n\n");
do
    {

        {
         System.out.println(" " + board[0] + board[1] + board[2]);
         System.out.println(" " + board[3] + board[4] + board[5]);
         System.out.println(" " + board[6] + board[7] + board[8]);
        }
             if (Xturn)
             System.out.println("It is X's turn, position number?");
             else
             System.out.println("It is O's turn, position number?");

             Input = -1;
            do
                {
                try
                {
                Input = scan.nextInt();
                board[Input-1] = (Xturn?"X":"O");
                Xturn = !Xturn;
                }
                catch (Exception e)
                {
                    System.out.println("Invalid input. Please enter a valid position number");
                }
                }while(Input==-1);
    } while (!IfGameOver);
}
}

【讨论】:

    【解决方案2】:

    问题很可能出在这一行:

                }while(Xturn = true);
    

    这不是比较。 = 运算符是 assignment。这会将值true 分配给Xturn,然后继续循环,因为分配的结果始终是分配的值。

    为了比较,您可以使用==。但是由于Xturn 是一个布尔值,你可以简单地写:

                }while(Xturn);
    

    【讨论】:

    • @MadProgrammer 是的,我做到了:s
    • @JustinBeaubien:这可能不是您代码中的唯一错误;我没有彻底检查过。
    【解决方案3】:

    改变

    }while(Xturn = true);
    ...
    }while (Oturn = true);
    

    }while(Xturn);
    ...
    }while (Oturn);
    

    Xturn = true 是一个赋值,不会检查Xturn 是否为真。为此,您必须使用Xturn == true 或简单的XturnOturn 也是如此。

    另外,正如TAsk 所述,您需要IfGameOver 的值在循环内变为真,以便代码退出外部do while 循环。

    【讨论】: