当前位置: 首页 > 知识库问答 >
问题:

如何确保用户输入有效的选项?

殳勇
2023-03-14

我正在制作一个简单的石头剪刀程序,但不确定如何确保用户只输入有效的选项。如果他们不键入“石头”、“纸”或“剪刀”(大写不重要)等变量,然后再键入“是”或“否”,我需要能够对他们进行谴责。建议?

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;
}

}

共有3个答案

赫连照
2023-03-14

有些像

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;
鲁浩言
2023-03-14

如果我在电脑前玩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中。

太叔鹏云
2023-03-14

在列表中保留有效选项,循环询问用户的输入,直到他输入有效的内容。

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之类的整数值,则应该完全跳过循环。但是,相反,它进入了循环,并打印“请