我正在制作一个简单的石头剪刀程序,但不确定如何确保用户只输入有效的选项。如果他们不键入“石头”、“纸”或“剪刀”(大写不重要)等变量,然后再键入“是”或“否”,我需要能够对他们进行谴责。建议?
import java.util.*;
public class RockPaperScissors {
private int wins = 0;
private int losses = 0;
private int ties = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
RockPaperScissors model = new RockPaperScissors();
Scanner scan = new Scanner(System.in);
while (true) {
System.out.println("Rock, Paper, Scissors... Pick one! (Type Rock, Paper, or Scissors)");
String playerChoice = scan.next();
String computerChoice = model.getRandomChoice();
System.out.println("You chose " + playerChoice + ".");
System.out.println("The computer chose " + computerChoice + ".");
RockPaperScissors.GameOutcome outcome = model.getGameOutcome(
playerChoice, computerChoice);
if (outcome == RockPaperScissors.GameOutcome.WIN) {
System.out.println("You won! Congratulations");
} else if (outcome == RockPaperScissors.GameOutcome.LOSE) {
System.out.println("You lose! Better luck next time!");
} else {
System.out.println("Tie!");
}
System.out.print("Do you want to play again? (Yes/No):");
String answer = scan.next();
if (answer.equalsIgnoreCase("no")) {
break;
}
}
System.out.println("Thanks for playing!");
System.out.println("Wins: " + model.getWins());
System.out.println("Losses: " + model.getLosses());
System.out.println("Ties: " + model.getTies());
scan.close();
}
public static enum GameOutcome {
WIN, LOSE, TIE;
}
public GameOutcome getGameOutcome(String userChoice, String computerChoice) {
if (userChoice.equalsIgnoreCase("Rock")) {
if (computerChoice.equalsIgnoreCase("Paper")) {
losses++;
return GameOutcome.LOSE;
} else if (computerChoice.equalsIgnoreCase("Scissors")) {
wins++;
return GameOutcome.WIN;
}
} else if (userChoice.equalsIgnoreCase("Paper")) {
if (computerChoice.equalsIgnoreCase("Scissors")) {
losses++;
return GameOutcome.LOSE;
} else if (computerChoice.equalsIgnoreCase("Rock")) {
wins++;
return GameOutcome.WIN;
}
} else if (userChoice.equalsIgnoreCase("Scissors")) {
if (computerChoice.equalsIgnoreCase("Rock")) {
losses++;
return GameOutcome.LOSE;
} else if (computerChoice.equalsIgnoreCase("Paper")) {
wins++;
return GameOutcome.WIN;
}
}
ties++;
return GameOutcome.TIE;
}
public String getRandomChoice() {
double d = Math.random();
if (d < .33) {
return "Rock";
} else if (d < .66) {
return "Paper";
} else {
return "Scissors";
}
}
public int getWins() {
return wins;
}
public int getLosses() {
return losses;
}
public int getTies() {
return ties;
}
}
有些像
if (!playerChoise.equalsIgnoreCase("paper") && ...) continue;
或者,您可以将有效选项存储在如上所示的列表中,并使用foreach循环。但这将更加困难,因为您需要检查所有变体。也许是这样的。
private boolean checkValid(String userChoise, String... variants) {
for (String s : variants) {
if (playerChoise.equalsIgnoreCase(s)) return true;
}
return false;
}
在这两种情况下都可以这样称呼:
if (!checkValid(userChoise, "rock", "papper", "scissors")) continue;
如果我在电脑前玩roshambo游戏,我想只需输入“石头”、“布”或“剪刀”的第一个字母就可以做出选择。
在这里使用丰富的枚举是很自然的选择:
private enum Choice {
ROCK ("Rock"),
PAPER ("Paper"),
SCISSORS ("Scissors");
private String displayName;
private static final List<Choice> VALUES =
Collections.unmodifiableList(Arrays.asList(values()));
private static final int SIZE = VALUES.size();
private static final Random RANDOM = new Random();
private Choice(String dn) {
displayName = dn;
}
/**
* Returns a random Choice.
*/
public static Choice getRandomChoice() {
return VALUES.get(RANDOM.nextInt(SIZE));
}
/**
* Returns a Choice that matches the input string. The input is considered a match if it starts with the same character
* as the displayname of a Choice. If no match is found, returns null.
*/
public static Choice fromInput(String input) {
if (input == null || input.length() == 0) {
return null;
}
for (Choice c : VALUES) {
if (Character.toLowerCase(c.displayName.charAt(0))
== Character.toLowerCase(input.charAt(0))) {
return c;
}
}
return null;
}
/**
* Returns the text to display to the user, asking for input to #fromInput().
*/
public static String promptText() {
StringBuilder sb = new StringBuilder();
for (Choice c : VALUES) {
if (sb.length() > 0) {
sb.append(", ");
}
sb.append(c.displayName).append(" (")
.append(c.displayName.charAt(0)).append(")");
}
sb.append(". Pick one!");
return sb.toString();
}
}
将大多数功能以声明方式编码在枚举中,您的客户端代码将变得更加简单。枚举也处理计算机的随机选择(这个答案的想法)。
while (true) {
Choice choice = null;
while (choice == null) {
System.out.println(Choice.promptText());
choice = Choice.fromInput(scan.next());
}
String computerChoice = Choice.getRandomChoice().displayName;
// ...
您还可以将getGameOutame
方法中的大部分(如果不是全部)逻辑封装到Choice
中。
在列表中保留有效选项,循环询问用户的输入,直到他输入有效的内容。
List<String> validChoices = Arrays.asList("rock", "paper", "scissors");
Scanner sc = new Scanner(System.in);
String choice = null;
do
{
System.out.println("Enter a choice (rock|paper|scissors)");
choice = sc.next().toLowerCase();//Retrieve as lower case
}
while(!validChoices.contains(choice));
我目前正在工作的代码,以产生一个空心的正方形,由星号从1-20。到目前为止,这里是我所拥有的,但我无法弄清楚,如果用户输入的是一个大于20的数字,如何将代码循环回自身。例如,如果用户要输入21,代码仍然创建星号方块,并在下面弹出“无效大小.从1-20输入大小:”文本以重新提示用户,但新的数字不会产生任何结果。我需要它不创建正方形(如果>20或<=0),而是直接“跳转”到无效大小文本,然后创建一个正
我希望“请输入一个带有字母S的句子”循环,直到用户输入字母“S”
我正在写一个叫做hangman.py的程序。在我的程序中,用户不能在我的输入中输入“?”或空白。例如,用户不能输入“?xx?xx?”或“我该怎么做”。但用户可以输入诸如“ldkdjgg”或“stop-go”之类的内容。如果用户输入诸如“?xxxxx”或“我该怎么做”之类的内容,我必须不断询问用户请输入一个不包含的要猜测的单词?或空白:“.我的问题是如何打印”请输入一个不包含字符的要猜测的单词?或空
我想让程序根据我的扫描仪输入从ArrayList中进行选择。比如,我写早餐和甜食,它必须随机列出早餐甜食,并打印随机索引。 我还在学习Java,我只是在玩,并试图编码小项目来训练它。 下面是我已经写过的课程: 我是否可以将列表存储在变量中,可能是这样的: 我知道很难理解我,但英语不是我的主要语言,希望它能被理解。
问题内容: 我试图确保传递给go程序的URL有效。但是,我似乎无法解决。我以为我可以解决问题,但这似乎并没有完成。 操场 有沿线的任何filter_var我可以使用吗? 问题答案: 您可以检查您的URL是否具有“方案”,“主机”和/或“路径”。 如果检查返回的URL,则可以看到无效部分已插入不透明数据部分(从某种意义上讲是有效的)。 如果您解析一个URL并且没有Scheme,Host和Path,则
问题内容: 这里是新程序员。这可能是一个非常基本的问题,但这仍然让我感到困扰。 我想做的是编写一种方法,该方法仅提供一个整数输入,因此我可以在主程序中使用该输入,而不必弄乱非整数输入。但是,即使编写使用自己的方法来执行此操作的方法似乎也是有问题的。 这似乎在多个层面上都被打破了,但我不确定为什么。 如果我在首次输入时输入了0或1之类的整数值,则应该完全跳过循环。但是,相反,它进入了循环,并打印“请