我已经尝试了很多次来让它发挥作用。我想这样做,如果用户输入的内容不是要输入的内容,那么它会给出错误消息并提示他们输入新的答案。但是,每次尝试此操作时,无论输入什么,它都会显示错误消息(我的错误消息),即使它是正确的。帮助
import java.util.Random;
import java.util.Scanner;
public class RandomSelect
{
public static void main(String[] args)
{
String [] arr = {"rock", "paper", "scissors"};
Random random = new Random();
Scanner scan = new Scanner(System.in);
System.out.println("Please select: rock, paper, or scissors?");
String myChoice = scan.nextLine();
boolean myChoiceIsntCorrect = false;
if ((!myChoice.equalsIgnoreCase("rock")) || (!myChoice.equalsIgnoreCase("paper")) || (!myChoice.equalsIgnoreCase("scissors")))
{
myChoiceIsntCorrect = true;
}
while ( myChoiceIsntCorrect == true )
{
System.out.println("Your input wasn't either rock, paper, or scissors. Please select one of the 3.");
myChoice = scan.nextLine();
}
int select = random.nextInt(arr.length);
System.out.println("Computer selected " + arr[select] + ".");
if (arr[select] == "rock" && myChoice.equalsIgnoreCase("paper"))
System.out.println("You win!");
if (arr[select] == "rock" && myChoice.equalsIgnoreCase("scissors"))
System.out.println("You lose!");
if (arr[select] == "rock" && myChoice.equalsIgnoreCase(arr[select]))
System.out.println("It's a tie!");
if (arr[select] == "paper" && myChoice.equalsIgnoreCase("rock"))
System.out.println("You lose!");
if (arr[select] == "paper" && myChoice.equalsIgnoreCase("scissors"))
System.out.println("You win!");
if (arr[select] == "paper" && myChoice.equalsIgnoreCase(arr[select]))
System.out.println("It's a tie!");
if (arr[select] == "scissors" && myChoice.equalsIgnoreCase("paper"))
System.out.println("You lose!");
if (arr[select] == "scissors" && myChoice.equalsIgnoreCase("rock"))
System.out.println("You win!");
if (arr[select] == "scissors" && myChoice.equalsIgnoreCase(arr[select]))
System.out.println("It's a tie!");
}
}
我没有使用布尔值尝试过它,并认为布尔值可能有效。但它无论是否有效都没有。我究竟做错了什么?是的,我是java的新手。我正在学校atm学习java课程。
答案 0 :(得分:0)
取
if ((!myChoice.equalsIgnoreCase("rock")) || (!myChoice.equalsIgnoreCase("paper")) || (!myChoice.equalsIgnoreCase("scissors"))) {
myChoiceIsntCorrect = true
}
并将其写成文字:
如果我的选择不是"摇滚"或者如果我的选择不是“纸张”#34;或者如果我的选择不是"剪刀",我的选择是不正确的。
现在将您的选择设置为"rock"
。
我的选择是"摇滚"。我的选择不是"#34;所以说明我的选择是不正确的。
使用&&
。
答案 1 :(得分:0)
if ((!myChoice.equalsIgnoreCase("rock")) || (!myChoice.equals("paper")) || (!myChoice.equals("scissors")))
{
myChoiceIsntCorrect = true;
}
问题在于,如果声明,你说的是选择不是摇滚或不是纸或不是剪刀。 当用户输入其中一个时,它将使另一个失败。
尝试使用&&而不是标志。
答案 2 :(得分:0)
您的输入验证存在两个问题,第一个是,正如其他人指出的那样,您需要使用&&不是||因为通过使用if我的输入不等于或不等于b或不等于c,你说输入必须等于a,b和c,因为如果它不等于任何他们,你将获得真正的价值。第二个问题是你永远不会在循环中更改myChoiceIsntCorrect,这意味着一旦进入该循环,myChoiceIsntCorrect将始终评估为true,程序将永远循环。
答案 3 :(得分:0)
这里有两个问题。
首先,你的while循环将永远运行,因为你没有在循环中更新myChoiceIsntCorrect
。你应该把它改成这样的东西:
boolean invalidChoice = true;
do {
myChoice = scan.nextLine();
if ((!myChoice.equalsIgnoreCase("rock")) || (!myChoice.equals("paper")) || (!myChoice.equals("scissors"))) {
System.out.println("Your input wasn't either rock, paper, or scissors. Please select one of the 3.");
} else {
invalidChoice = false;
}
} while ( invalidChoice );
请注意,您可以通过反转if和else子句来简化if。
其次,您要将字符串与==
进行比较。在java中,==
比较引用。像"thing" == "thing"
这样的东西总是返回false,因为两个"thing"
是不同的对象。您arr[select] == "..."
的ifs需要替换为"...".equals(arr[select])
。
答案 4 :(得分:0)
你已经有几个事情发生了。
如果此代码块正确,则会导致无限循环。观察:
boolean myChoiceIsntCorrect = false;
if ((!myChoice.equalsIgnoreCase("rock")) || (!myChoice.equalsIgnoreCase("paper")) || (!myChoice.equalsIgnoreCase("scissors")))
{
myChoiceIsntCorrect = true;
}
while ( myChoiceIsntCorrect == true )
{
System.out.println("Your input wasn't either rock, paper, or scissors. Please select one of the 3.");
myChoice = scan.nextLine();
}
您永远不会更新myChoiceIsntCorrect
。
相反,考虑将检查逻辑移动到另一个方法,并将循环更改为do...while
,这样您就可以获得与错误检查的好处相结合的好处。你还想修复你的布尔值;在这里,我把它改为肯定而不是消极(这会导致混淆)。
private boolean valid(String word) {
return myChoice.equalsIgnoreCase("rock") ||
myChoice.equalsIgnoreCase("paper") ||
mychoice.equalsIgnoreCase("scissors");
}
// block of code to follow
String myChoice;
do {
myChoice = scan.nextLine();
} while(!valid(myChoice));
您在一个实例中正确检查字符串,但在另一个实例中没有:
if (arr[select] == "rock" && myChoice.equalsIgnoreCase("paper"))
这根本不起作用。
您可以修复损坏的比较,或者使用switch
语句使其读取更好一些,并将实际的布尔比较逻辑移动到另一种方法中。
switch(select) {
case 0: // Rock
checkWinCondition(arr[0], myChoice);
break;
// other cases and default with a good error message
}
private boolean checkWinCondition(String computerSelected, String userSelected) {
if(computerSelected.equalsIgnoreCase(userSelected)) {
// draw
} else {
// other conditions
}
}
上述所有方法都旨在提高意图的可读性和清晰度。如果你不想让后者更清晰(即你只想修复错误的==
比较),那就没关系。