【问题标题】:How to check if user input is typed before?如何检查之前是否输入了用户输入?
【发布时间】:2017-06-28 23:01:57
【问题描述】:

我创建了一个刽子手游戏。

我想问我如何检查用户是否输入了相同的字母。一切正常,但没有检查号码是否已输入。

if (word.contains(input)) {
        i = i - 1;
        char[] charOfGameBoard = gameBoard.toCharArray();
        for (int x = 0; x < word.length(); x++) {
            if (word.charAt(x) != input.charAt(0)) {
                continue;
            }

            int j = x * 2;
            charOfGameBoard[j] = input.charAt(0);
        }

        gameBoard = String.valueOf(charOfGameBoard);

    }

我不能发太多帖子。

word = "房子"

charOfGameBoard= _ _ _ _ _

userinput="h" //正确

charOfGameBoard =h _ _ _ _

userinput= "h" // 此时不正确

charOfGameBoard =h _ _ _ _

【问题讨论】:

  • 为什么不保留一个猜测的字母数组,并在检查单词是否包含输入之前查看猜测的字母是否包含输入?
  • 这将是我的解决方案,但我想看看是否有人有更好的解决方案。因为拥有一个包含所有字母的数组是不干净的。但我认为将输入字母保存在数组中。
  • 为什么不呢?此外,hangman 并不是一个内存密集型或资源消耗型应用程序。我建议您将值存储在一个数组中并检查它是否在数组中,然后再针对单词进行测试
  • 我不知道如何检查一个字母是否被输入了 2 次。因为第一次是允许的,第二次是不允许的。也许有一个空数组?
  • 从一个空数组开始,即'lettersGuessed',查看lettersGuessed是否包含'input',如果不包含,则将输入添加到lettersGuessed数组中。下次猜测同一封信时,它将检查“lettersGuessed”,您将能够阻止它进入您在上面发布的“if”语句

标签: java if-statement input evaluation


【解决方案1】:

您可以将猜测存储在 HashSet

  HashSet<char> guessedLetters = new HashSet();
  ...
  boolean success = guessedLetters.Add(input)

HashSet 只能包含一个值,如果集合中已经包含要添加的元素,Add 方法将返回 false。

https://www.javatpoint.com/java-hashset

【讨论】:

  • 小问题,有没有其他方法不用Hash,只用原始数组?
  • 您需要创建一个大小为 26 的数组,当您通过数组获取输入循环并检查它是否已经存在时,如果没有,则将新字母添加到数组中。但是你为什么要这样做呢?
  • 你太累了,你们帮了我。
  • 因为我的老师他很严格,但我想我只是向他解释我为什么使用HashSet
  • HastSet 是要使用的正确数据结构,否则您只能手动复制此功能。
【解决方案2】:

您可以在输入字符时将字符添加到数组列表中,然后检查您之前是否见过该字母:

ArrayList<Character> usedLetters = new ArrayList<>();
public boolean UserTypedLetterBefore(char letter) {
    if(usedLetters.contains(letter))
        return true;

    usedLetters.add(letter);
    return false;
}

然后,当游戏结束时,您只需拨打usedLetters.clear() 清空列表并重新开始。这个方法还可以通过usedLetters.size()来跟踪猜测的次数,因为每个猜测都是一个字母


如果您想提高效率,可以改用HashSet(尽管在您的情况下没有必要):

HashSet<Character> usedLetters = new HashSet<>();
public boolean UserTypedLetterBefore(char letter) {
    if(usedLetters.contains(letter))
        return true;

    usedLetters.add(letter);
    return false;
}

这将是较大数据集的理想选择,但在您的情况下,由于您只有 26 个可能的字母,您不会注意到速度差异。


第三种选择是使用原始数组,例如:

boolean[] usedLetters = new boolean[26];
public boolean UserTypedLetterBefore(char letter) {
    letter = Character.toLowerCase(letter);

    if(usedLetters[letter - 'a'])
        return true;

    usedLetters[letter - 'a'] = true;
    return false;
}

每个索引都是正在使用的字母的标志。通过对字符letter - 'a' 进行数学运算,我们可以得到'a' = 0,这样我们就可以将它用作我们需要的数组中的索引。 Character.toLowerCase() 是作为安全添加的。

【讨论】:

  • 有没有没有列表或地图的方法?所以只是原始数组?
  • @ManuellsenDeve 更新
  • 太棒了。我想我只是简单快速地使用 List 或 Hash。
  • @ManuellsenDeve 我同意。但是知道如何在数组中处理它也很好:)所有方法都有权衡,但在你的情况下它真的不会有什么不同。
  • 你应该将此标记为答案@ManuellsenDeve
【解决方案3】:

您可以只做一个List 的猜测,然后在您的if 语句中添加另一个条件,如下所示:

List<String> guesses = new ArrayList<>();

if (word.contains(input) && !guesses.contains(input)) {
    guesses.add(input);
    //...
    //all of your other code
    //...
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-17
    • 2020-04-30
    • 1970-01-01
    • 2011-10-24
    • 1970-01-01
    相关资源
    最近更新 更多