Java Do Пока не работает должным образом

Извините, я новичок в этом сайте, поэтому не уверен, как это будет отображаться. Я пытаюсь сделать простую игру "Камень, ножницы, бумага". После while Если R, P, S не введены, программа просто ничего не делает. Я хочу, чтобы это вернулось к вопросу в начале, чтобы можно было сделать правильный выбор. Кроме того, как бы я мог ввести заявление для печати, например "Invalid Choice Please Retry"?

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 ответа

Решение

Как сказал Эран, вам нужно обернуть цикл 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!");
}

Похоже, ты забыл один do для вашего внутреннего dowhile петля.

Так должно быть:

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 петля с пустым телом.

Другие вопросы по тегам