【发布时间】:2015-01-15 01:37:33
【问题描述】:
我的任务是编写一个程序,让用户在电脑上玩石头、剪子布游戏。
说明:
main 方法应该有两个嵌套循环,其中外层循环允许用户根据需要经常玩游戏,而内层循环将在出现平局时玩游戏。在 userChoice() 方法的 while 循环中调用方法 isValidChoice() 以验证用户输入的选项必须是“rock”、“paper”或“scissors”。如果输入了无效的字符串,isValidChoice() 将返回 false,并且程序应该要求新的输入,直到给出有效的输入。
情况:
当用户输入有效输入时,程序运行良好。但是,一旦它不是有效的输入,就会出现一个小问题。
结果:
Enter rock, paper, or scissors: rocky
Invalid input, enter rock, paper, or scissors: roc
Invalid input, enter rock, paper, or scissors: rock
The computer's choice was paper
The user's choice was rocky
Play again? (y/n)
如您所见,程序识别出无效输入。用户最终输入了一个有效的 第三次输入。但是,它显示用户的首选“rocky”是无效的。 因此程序无法显示谁获胜。
问题
我需要你的帮助。
我希望我的程序像这样运行:
当用户输入多个无效输入,但一次
输入了有效的输入,我的程序应该仍然能够显示用户的有效输入并显示获胜者。
import java.util.Scanner;
import java.util.Random;
public class RockPaperScissorsGame
{
public static void main (String[] args)
{
Scanner keyboard = new Scanner(System.in);
String computer, user;
char keepPlaying;
do
{
computer = computerChoice();
user = userChoice();
System.out.println("The computer's choice was " + computer);
System.out.println("The user's choice was " + user);
determineWinner(computer, user);
while (computer.equals(user))
{
computer = computerChoice();
user = userChoice();
System.out.println("The computer's choice was " + computer);
System.out.println("The user's choice was " + user);
determineWinner(computer, user);
}
System.out.println("\n" + "Play again? (y/n)");
keepPlaying = keyboard.nextLine().toLowerCase().charAt(0);
while ( keepPlaying != 'y' && keepPlaying != 'n' )
{
System.out.println("Invalid input, please enter (y/n)");
keepPlaying = keyboard.nextLine().toLowerCase().charAt(0);
}
} while (keepPlaying == 'y');
}
public static String computerChoice()
{
String[] choice = {"rock","paper","scissors"};
Random rand = new Random();
int computerChoice = rand.nextInt(3);
return choice[computerChoice];
}
public static String userChoice()
{
Scanner keyboard = new Scanner(System.in);
System.out.print("Enter rock, paper, or scissors: ");
String choice = keyboard.nextLine();
isValidChoice(choice);
return choice;
}
public static boolean isValidChoice (String choice)
{
Scanner keyboard = new Scanner(System.in);
while (!(choice.equalsIgnoreCase("rock")) && !(choice.equalsIgnoreCase("paper")) && !(choice.equalsIgnoreCase("scissors")))
{
System.out.print("Invalid input, enter rock, paper, or scissors: ");
choice = keyboard.nextLine();
}
return true;
}
public static void determineWinner(String computer, String user)
{
if (computer.equalsIgnoreCase("rock") && user.equalsIgnoreCase("paper"))
System.out.println("\n" + "Paper wraps rock.\nThe user wins!");
else if (computer.equalsIgnoreCase("rock") && user.equalsIgnoreCase("scissors"))
System.out.println("\n" + "Rock smashes scissors.\nThe computer wins!");
else if (computer.equalsIgnoreCase("paper") && user.equalsIgnoreCase("rock"))
System.out.println("\n" + "Paper wraps rock.\nThe computer wins!");
else if (computer.equalsIgnoreCase("paper") && user.equalsIgnoreCase("scissors"))
System.out.println("\n" + "Scissors cuts paper.\nThe user wins!");
else if (computer.equalsIgnoreCase("scissors") && user.equalsIgnoreCase("rock"))
System.out.println("\n" + "Rock smashes scissors.\nThe user wins!");
else if (computer.equalsIgnoreCase("scissors") && user.equalsIgnoreCase("paper"))
System.out.println("\n" + "Scissors cuts paper.\nThe computer wins!");
else if (computer.equalsIgnoreCase(user))
System.out.println("\n" + "The game is tied!\nGet ready to play again...");
}
}
【问题讨论】:
-
您似乎认为
isValidChoice(choice)可以修改choice变量,但它不能。所以userChoice中的choice将保持不变,即原来的无效条目。 -
一个快速风格的评论,你的
isValidChoice方法应该只返回给定的choice是否有效。它不应该执行任何其他任务(在您的情况下,如果测试失败,您可以从 stdin 获得新结果)。否则,方法的名称与它真正的作用不匹配。为了进一步论证,使用代码返回值isValidChoice将始终为真,可以忽略。 -
determineWinner似乎不正确--rock flies right through paper :) :) :) -
@ajb :是的,您的第二条评论很好地解释了我的想法。我正在学习介绍 Java 编程课程,所以我正在学习。我需要阅读您发布的那篇文章。我会在
determineWinner上重新检查我的逻辑,谢谢你所做的一切:)
标签: java loops while-loop nested-loops