0

我有一系列在方法中得到检查的答案。然后检查 usersinout 以查看它是否匹配答案数组中的任何内容,如果它没有问题。但是,当它这样做时,我会调用一个方法来擦除 userInput 并显示无效输入,但是它会根据数组中的答案数量显示“无效输入”。这就是我的意思:

Type go in the box and hit enter!

Not a valid input

go

You reach a crossroads and don't know which way to go.

What do you do?

Not a valid input

Not a valid input

Not a valid input

Not a valid input

Not a valid input

在我输入“go”之前,我自己输入了“g”,它返回“Not a valid input”,因为该部分的数组中唯一的答案是“go”。但是在下一部分中,您可以看到它多次返回“不是有效输入”,因为与该部分对应的数组中有 5 个正确答案。无论数组中的答案数量如何,我怎样才能让它每次只返回一次?

整个游戏的代码可以在 GitHub 上找到:

https://github.com/addrum/TextGame/

4

3 回答 3

1

更改此方法:

public void check(String userInput) {
    boolean gotItRight= false;
    ArrayList<String> levelAnswers = answers.getAnswersForLevel(currentLevel);
    for (String answer : levelAnswers) {
        if (userInput.toLowerCase().equals(answer)) {
            messageDisplay.append("\n \n" + userInput + "\n");
            commandInput.setText("");
            messageDisplay.append("\n" + messages.getNextMessage());
            currentLevel++;
            getCurrentLevel();
            gotItRight= true;
            break;
        }
    }
    if (!gotItRight) {
        notValid();
    }
}

为什么会这样?

好吧,您在这一行中为第一级迭代了五个答案:for (String answer : levelAnswers)每次您评估答案不匹配时,您都会显示答案是错误的。例如,如果答案是正确的,但对于最后一个(第 5 个选项),你会得到四次错误,最后是正确的。

此外,您可以执行以下操作来避免 for 循环

public void check(String userInput) {
    boolean gotItRight= false;
    ArrayList<String> levelAnswers = answers.getAnswersForLevel(currentLevel);

    if (levelAnswers.contains(userInput.toLowerCase()) {
        messageDisplay.append("\n \n" + userInput + "\n");
        commandInput.setText("");
        messageDisplay.append("\n" + messages.getNextMessage());
        currentLevel++;
        getCurrentLevel();
        gotItRight= true;
        break;
    }
}
于 2013-06-10T14:02:36.623 回答
1

只需简单地看一下您的代码。不确定您要达到什么目的,但这种方法对我来说似乎是错误的。

public void check(String userInput)

我认为更好的方法是使用 List 的 contains 方法。结果代码将是这样的。

// Assume that the prepared answers are in lower case
ArrayList<String> levelAnswers = answers.getAnswersForLevel(currentLevel);
if (levelAnswers.contains(userInput.toLowerCase()))
{ /* Found */ }
else
{ /* Not found */ }
于 2013-06-10T14:13:01.033 回答
0

每次检查答案时都将其打印出来,因为在 for 循环中调用了 notValid。在 for 循环之外调用它并使用一个标志来指示答案是否有效。

这是相关代码,您可以看到在 for 循环中调用了 notValid。

public void check(String userInput) {
    ArrayList<String> levelAnswers = answers.getAnswersForLevel(currentLevel);
    for (String answer : levelAnswers) {
        if (userInput.toLowerCase().equals(answer)) {
            messageDisplay.append("\n \n" + userInput + "\n");
            commandInput.setText("");
            messageDisplay.append("\n" + messages.getNextMessage());
            currentLevel++;
            getCurrentLevel();
        } else {
            notValid();
        }
    }
}

这是一种可能的解决方案,但是我没有运行它来检查它是否正常工作。

boolean valid = true;
public void check(String userInput) {
    ArrayList<String> levelAnswers = answers.getAnswersForLevel(currentLevel);
    for (String answer : levelAnswers) {
        if (userInput.toLowerCase().equals(answer)) {
            messageDisplay.append("\n \n" + userInput + "\n");
            commandInput.setText("");
            messageDisplay.append("\n" + messages.getNextMessage());
            currentLevel++;
            getCurrentLevel();
                            valid = true;
                            return;

        } else {
            valid = false;
        }
    }
            if(!valid)
                 notValid();
            valid = true;
}
于 2013-06-10T13:59:20.173 回答