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」を単独で入力すると、そのセクションの配列内の唯一の答えが「go」であるため、「有効な入力ではありません」が返されました。ただし、次のセクションでは、そのセクションに対応する配列に 5 つの正解があるため、「有効な入力ではありません」が複数回返されることがわかります。配列内の回答の数に関係なく、毎回1回だけ返すようにするにはどうすればよいですか?

ゲーム全体のコードは、こちらの GitHub にあります。

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

4

3 に答える 3

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 に答える
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();
    }
}

なぜそれが起こっているのですか?

さて、この行でレベル 1 の 5 つの回答を繰り返しますfor (String answer : levelAnswers)。回答が一致しないと評価するたびに、回答が間違っていることが表示されます。たとえば、答えが正しかった場合、最後の (5 番目のオプション) では、4 回間違っており、最後に正しいという結果になります。

また、 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 に答える
0

notValid が for ループで呼び出されているため、回答を確認するたびに出力しています。for ループの外で呼び出し、フラグを使用して、回答が有効かどうかを示します。

関連するコードは次のとおりです。notValid が for ループで呼び出されていることがわかります。

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

考えられる解決策の 1 つを次に示しますが、正しく動作するかどうかを確認するために実行しませんでした。

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 に答える