有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

Java执行的循环在工作不正常时执行

对不起,我是这个网站的新手,所以不确定这将如何显示。我想做一个简单的石头,布,剪刀游戏。在while语句之后,如果没有输入R,P,S,则程序什么也不做。我想让它回到问题的开头,这样就可以做出正确的选择。另外,如何输入打印语句,如“无效选择请重试”

package rps.gameapp;

import java.util.Scanner;

public class RPSGameApp
{

    public static void main(String[] args)
    {

    Scanner sc = new Scanner(System.in);
    String userChoice;
    String playAgain;
    int randNum = (int) (Math.random() * 3);

    do
        {
        System.out.println("Welcome to Rock, Paper, Scissors Game.");
        System.out.println("Pick R, P, or S.");
        userChoice = sc.nextLine();
        while (!userChoice.equalsIgnoreCase("P")
                && !userChoice.equalsIgnoreCase("R")
                && !userChoice.equalsIgnoreCase("S"));


            String compChoice = "";
        switch (randNum)
            {
            case 0:
                compChoice = "R";
                break;
            case 1:
                compChoice = "P";
                break;
            case 2:
                compChoice = "S";
                break;
            }

        System.out.println("The computer entered \"" + compChoice + "\".");

        if (compChoice.equalsIgnoreCase(userChoice))
            {
            System.out.println("Draw");
            } else if (userChoice.equalsIgnoreCase(userChoice)
                && compChoice.equalsIgnoreCase("S")
                || userChoice.equalsIgnoreCase("P")
                && compChoice.equalsIgnoreCase("R")
                || userChoice.equalsIgnoreCase("S")
                && compChoice.equalsIgnoreCase("P"))
            {
            System.out.println("User Wins");
            } else
            {
            System.out.println("User Loses");
            }

        System.out.print(
                "Do you want to play again? (Y/N)");
        playAgain = sc.nextLine();

        } while (playAgain.equalsIgnoreCase("Y"));

    System.out.println("Thanks for Playing!");

    }
}

共 (2) 个答案

  1. # 1 楼答案

    看起来你忘记了一个do作为你的内部do{}循环

    应该是:

    do {
        do {
            System.out.println("Welcome to Rock, Paper, Scissors Game.");
            System.out.println("Pick R, P, or S.");
            userChoice = sc.nextLine();
        } while (!userChoice.equalsIgnoreCase("P") && !userChoice.equalsIgnoreCase("R") && !userChoice.equalsIgnoreCase("S")); 
        ...
    } while (playAgain.equalsIgnoreCase("Y"));
    

    如果没有内部do(以及环绕该循环体的花括号),内部循环将变成一个带有空体的while循环

  2. # 2 楼答案

    正如Eran所说,您需要将do while循环包装到另一个循环中,这将不断要求用户输入正确的内容。这是完全有效的代码。一件可能更好的事情是用户输入错误的字母后的消息

    编辑:还要确保每次迭代都画出随机数

    编辑2:要根据用户输入更改消息,可以引入一个新变量,该变量将跟踪您请求用户正确输入的次数。如果为0,则表示第一次询问用户,我们应该打印“欢迎”消息。它不是0-您需要向用户请求正确的输入。在每一轮之后,我们再次给变量赋值零,循环重复。我已经在代码中实现了这个更改。请注意,此变量也可以是布尔值

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String userChoice;
        String playAgain;
        int iterationNumber;
    
        while (true) {
            iterationNumber = 0;
            do {
                if (iterationNumber == 0) {
                    System.out.println("Welcome to Rock, Paper, Scissors Game.");
                    System.out.println("Pick R, P, or S.");
    
                } else {
                    System.out.println("Please enter valid letter.");
                    System.out.println("Pick R, P, or S.");
                }
                iterationNumber++;
                userChoice = sc.nextLine();
            } while (!userChoice.equalsIgnoreCase("P")
                    && !userChoice.equalsIgnoreCase("R")
                    && !userChoice.equalsIgnoreCase("S"));
            String compChoice = "";
            int randNum = (int) (Math.random() * 3);
            switch (randNum) {
                case 0:
                    compChoice = "R";
                    break;
                case 1:
                    compChoice = "P";
                    break;
                case 2:
                    compChoice = "S";
                    break;
            }
    
            System.out.println("The computer entered \"" + compChoice + "\".");
    
            if (compChoice.equalsIgnoreCase(userChoice)) {
                System.out.println("Draw");
            } else if (userChoice.equalsIgnoreCase("R")
                    && compChoice.equalsIgnoreCase("S")
                    || userChoice.equalsIgnoreCase("P")
                    && compChoice.equalsIgnoreCase("R")
                    || userChoice.equalsIgnoreCase("S")
                    && compChoice.equalsIgnoreCase("P")) {
                System.out.println("User Wins");
            } else {
                System.out.println("User Loses");
            }
    
            System.out.print(
                    "Do you want to play again? (Y/N)");
            playAgain = sc.nextLine();
            if (playAgain.equalsIgnoreCase("N")) {
                break;
            }
            iterationNumber = 0;
        }
        System.out.println("Thanks for Playing!");
    }