我正在测试我的用户输入以查看它是否有效。如果无效,则应抛出 IllegalArgumentException
。但是,无论我的输入是什么,gameLogic
函数前几行中的 IllegalArgumentException
都会被抛出。结果是程序打印“You're only allowed to Enter Rock,Pa,Scissors or -1 in this game.”
无论我输入什么。
import java.util.Scanner;
import java.util.Random;
class RockPaperScissors
{
private static double mUserWinCount = 0;
private static double mCpuWinCount = 0;
private static double mUserLossCount = 0;
private static double mCpuLossCount = 0;
private static double mDrawCount = 0;
private static double mGameCount = 0;
private static String mCpuInput;
private static String mUserInput;
public static void main(String [] args)
{
try
{
gameLogic(cpuInput(),userInput());
}
catch(IllegalArgumentException iae)
{
System.out.println(iae.getMessage());
}
}
static String cpuInput()
{
Random random = new Random (System.currentTimeMillis());
int RandomNumber=random.nextInt(3);
if (RandomNumber == 0)
mCpuInput = "Rock";
else if (RandomNumber == 1)
mCpuInput = "Paper";
else
mCpuInput = "Scissors";
return mCpuInput;
}
static String userInput()
{
System.out.println("Enter Rock, Paper or Scissors, enter -1 in order to exit:- ");
mUserInput = new Scanner(System.in).next();
return mUserInput;
}
static void gameLogic(String cpuInput, String userInput)
{
if(!userInput.equalsIgnoreCase("Rock") || !userInput.equalsIgnoreCase("Paper") || !userInput.equalsIgnoreCase("Scissors") || !userInput.equals("-1"))
{
throw new IllegalArgumentException("You're only permitted to enter Rock, Paper, Scissors or -1 in this game.\n");
}
if(userInput.equals("-1"))
{
score();
System.exit(0);
}
System.out.println("CPU entered "+cpuInput+", User entered "+userInput);
String [] args = new String[0];
if(userInput.equalsIgnoreCase(cpuInput))
{
System.out.println("It's a draw!");
mDrawCount++;
mGameCount++;
}
if(userInput.equalsIgnoreCase("Rock") && cpuInput.equalsIgnoreCase("Scissors") || userInput.equalsIgnoreCase("Paper") && cpuInput.equalsIgnoreCase("Rock") || userInput.equalsIgnoreCase("Scissors") && cpuInput.equalsIgnoreCase("Paper"))
{
System.out.println("User wins!");
mUserWinCount++;
mCpuLossCount++;
mGameCount++;
}
if(cpuInput.equalsIgnoreCase("Rock") && userInput.equalsIgnoreCase("Scissors") || cpuInput.equalsIgnoreCase("Paper") && userInput.equalsIgnoreCase("Rock") || cpuInput.equalsIgnoreCase("Scissors") && userInput.equalsIgnoreCase("Paper"))
{
System.out.println("CPU wins!");
mCpuWinCount++;
mUserLossCount++;
mGameCount++;
}
main(args);
}
static void score()
{
if (mGameCount==0)
{
System.out.println("No games have been played..");
}
else
{
double userWinPercentage = (mUserWinCount / mGameCount) * 100;
double userLossPercentage = (mUserLossCount / mGameCount) * 100;
double cpuWinPercentage = (mCpuWinCount / mGameCount) * 100;
double cpuLossPercentage = (mCpuLossCount / mGameCount) * 100;
double drawPercentage = (mDrawCount/mGameCount) * 100;
System.out.println("Number of Games Played- " + mGameCount);
System.out.println("Number of Draws- "+ mDrawCount);
System.out.println("Percentage of Draws "+ drawPercentage + "%");
System.out.println("Number of Wins by User- " + mUserWinCount);
System.out.println("User's Win Percentage- " + userWinPercentage + "%");
System.out.println("Number of Losses by User- " + mCpuLossCount);
System.out.println("User's Loss Percentage- " + userLossPercentage + "%");
System.out.println("Number of Wins by CPU- " + mCpuWinCount);
System.out.println("CPU's Win Percentage- " + cpuWinPercentage + "%");
System.out.println("Number of Losses by CPU- " + mCpuLossCount);
System.out.println("CPU's Loss Percentage- " + cpuLossPercentage + "%");
}
}
最佳答案
在这一行
if(!userInput.equalsIgnoreCase("Rock") || !userInput.equalsIgnoreCase("Paper") || !userInput.equalsIgnoreCase("Scissors") || !userInput.equals("-1"))
使用&&
,而不是||
†
if(!userInput.equalsIgnoreCase("Rock") && !userInput.equalsIgnoreCase("Paper") && !userInput.equalsIgnoreCase("Scissors") && !userInput.equals("-1"))
您可以使用真值表的形式来理解原因:
| Input | A | B | C | D | || Result | && Result |
|------------+---+---+---+---+-----------|-----------|
| "Rock" | F | T | T | T | T | F |
| "Paper" | T | F | T | T | T | F |
| "Scissors" | T | T | F | T | T | F |
| "-1" | T | T | T | F | T | F |
| "foo" | T | T | T | T | T | T |
† 但是,从设计的角度来看,您可能希望重组代码以要求用户在输入不正确时重复输入,而不是仅仅终止游戏一个异常(exception)。
关于即使条件不成立,Java 代码也会打印 Exception 中给出的消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31771599/