Rock Paper Scissors程序无法正常运行

问题描述 投票:-3回答:2

我试图让“按q退出”功能正常工作,但我遇到了一些麻烦。 “无效字符”功能也无法正常工作。我该如何解决这个问题?我的教授建议在我的代码开头加上“按q退出”功能,但没有给我任何进一步的指示。

public static void main(String[] args) {

    char userChar = 0;

    Scanner sc = new Scanner(System.in);
    Random rnd = new Random();

    // Intro/directions/prompting for user input
    System.out.println("Welcome to Rock, Paper, Scissors by Rancid!");
    System.out.println("Choose R for Rock, P for Paper, S for Scissors, or Q to Quit, then press Enter: ");

    // If player chooses to quit
    if (userChar == 'q' || userChar == 'Q') {
        System.out.println("Player chose to quit. Goodbye!");
    }

    // Start of loop
    while (userChar != 'q' && userChar != 'Q') {

        // Prompting computer to generate a random number
        int randomNumber = rnd.nextInt(3) + 1;

        // If computer generates 1 (Rock)
        if (randomNumber == 1) {
            if (userChar == 'r' || userChar == 'R') {
                System.out.println("Rock vs. Rock! It's a tie!");
            } else if (userChar == 'p' || userChar == 'P') {
                System.out.println("Paper covers Rock, you win!");
            } else if (userChar == 's' || userChar == 'S') {
                System.out.println("Rock breaks Scissors, you lose!");
            }
        }

        // If computer generates 2 (Paper)
        else if (randomNumber == 2) {
            if (userChar == 'r' || userChar == 'R') {
                System.out.println("Paper covers Rock, you lose!");
            } else if (userChar == 'p' || userChar == 'P') {
                System.out.println("Paper vs. Paper! It's a tie!");
            } else if (userChar == 's' || userChar == 'S') {
                System.out.println("Scissors cuts Paper, you win!");
            }
        }

        // If computer generates 3 (Scissors)
        else if (randomNumber == 3) {
            if (userChar == 'r' || userChar == 'R') {
                System.out.println("Rock breaks Scissors, you win!");
            } else if (userChar == 'p' || userChar == 'P') {
                System.out.println("Scissors cuts Paper, you lose!");
            } else if (userChar == 's' || userChar == 'S') {
                System.out.println("Scissors vs. Scissors! It's a tie!");
            }
        }

        // If player types an invalid character
        else {
            System.out.println("Invalid input! Please enter a valid character.");
        }

        userChar = sc.next().charAt(0);
        }
    }
}
java
2个回答
0
投票

为了真正处理无效输入,你需要在循环中做第一件事。此外,你不能在你的else声明的if-else块中这样做,因为在那些if-else你检查randomNumber,而不是输入,所以它没有意义,它将永远不会工作。另外,你检查输入是从sc.next().charAt(0)得到的,但是例如,如果用户插入像"R_invalid_something_without_space"这样的字符串,你只看第一个字母是R,你把它当作有效输入。我修改了你的代码,以便你在每个循环迭代中读取一行,如果这行不是q / r / p / s,它将被视为无效输入,如果它的q程序将完成。

 public static void main(String[] args) {

    char userChar = 0;

    Scanner sc = new Scanner(System.in);
    Random rnd = new Random();

    // Intro/directions/prompting for user input
    System.out.println("Welcome to Rock, Paper, Scissors by Rancid!");
    System.out.println("Choose R for Rock, P for Paper, S for Scissors, or Q to Quit, then press Enter: ");

    // Start of loop
    while (true) {
        // what I changed
        // **********************************************************
        String line = sc.nextLine().toLowerCase();
        if(line.equals("q")){
            System.out.println("Player chose to quit. Goodbye!");
            break;
        }
        if(!line.equals("r") && !line.equals("s") && !line.equals("p")) {
            System.out.println("Invalid input! Please enter a valid character.");
            continue;
        }
        userChar = line.charAt(0);
        // **********************************************************

        // Prompting computer to generate a random number
        int randomNumber = rnd.nextInt(3) + 1;

        // If computer generates 1 (Rock)
        if (randomNumber == 1) {
            if (userChar == 'r' || userChar == 'R') {
                System.out.println("Rock vs. Rock! It's a tie!");
            } else if (userChar == 'p' || userChar == 'P') {
                System.out.println("Paper covers Rock, you win!");
            } else if (userChar == 's' || userChar == 'S') {
                System.out.println("Rock breaks Scissors, you lose!");
            }
        }

        // If computer generates 2 (Paper)
        else if (randomNumber == 2) {
            if (userChar == 'r' || userChar == 'R') {
                System.out.println("Paper covers Rock, you lose!");
            } else if (userChar == 'p' || userChar == 'P') {
                System.out.println("Paper vs. Paper! It's a tie!");
            } else if (userChar == 's' || userChar == 'S') {
                System.out.println("Scissors cuts Paper, you win!");
            }
        }

        // If computer generates 3 (Scissors)
        else if (randomNumber == 3) {
            if (userChar == 'r' || userChar == 'R') {
                System.out.println("Rock breaks Scissors, you win!");
            } else if (userChar == 'p' || userChar == 'P') {
                System.out.println("Scissors cuts Paper, you lose!");
            } else if (userChar == 's' || userChar == 'S') {
                System.out.println("Scissors vs. Scissors! It's a tie!");
            }
        }
    }
}

0
投票

好吧,首先你退出的条件超出了while循环的范围,这意味着它永远不会在这个给定的上下文中执行。

其次,while循环中的条件不会为真,除非userChar不是q和Q同时,这没有意义。

我建议稍微重构你的while循环,如下:

while (true) {

    //Your logic here

    if (userChar == 'q' || userChar == 'Q') {
        System.out.println("Player chose to quit. Goodbye!");
        break;
    }


    //Your logic here
}
© www.soinside.com 2019 - 2024. All rights reserved.