2

我有以下代码:

public void actionPerformed(ActionEvent e) {
    String userInput = commandInput.getText();
    if (currentLevel == 0) {
        if (userInput.equals(answers.getIntroAnswers().get(0)) || userInput.equals(answers.getIntroAnswers().get(1))) {
            messageDisplay.append("\n \n" + userInput + "\n");
            commandInput.setText("");
            messageDisplay.append("\n" + messages.getNextMessage());
            currentLevel++;
            getCurrentLevel();
        } else {
            messageDisplay.append(notValid());
        }
    } else if (currentLevel == 1) {
        // do the same as above but with the next set of answers
    }
}

我想做的是以某种方式将此操作分离到它自己的类中,并调用该类中的方法/构造函数来进行检查,否则我将使用嵌套的 if 卡住,它会变得非常混乱且难以理解。我是否会考虑一种方法来获取 currentLevel 和 userInput 的参数,以便根据 currentLevel 测试 userInput 与相应的答案?以下是所涉及的其余类的链接:

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

4

3 回答 3

2

我是否会考虑一种方法来获取 currentLevel 和 userInput 的参数,以便根据 currentLevel 测试 userInput 与相应的答案?

不。事实上,您可能希望避免将当前级别作为显式参数传递。如果您将级别作为参数,您可能最终只是将“多个嵌套 if”推入另一个类。

我认为你需要这样写:

    InputChecker[] levelChecker = ... create an array of checker instances
    ....
    levelChecker[currentLevel].check(userInput);

然后您需要创建一个类(可能是匿名的)来实现对每个级别的检查。请注意,如果需要,您可以通过构造函数参数将级别编号提供给检查器类,并将其保存在私有实例变量中。

您可以扩展/概括InputChecker界面以包含其他特定于级别的行为。或者确实使这部分成为Level界面。


“这是采用 currentLevel 并将 userInput 与当前级别进行比较吗?”

不。在我上面的示例代码中,它调用InputChecker实例上的一个方法来进行检查。InputChecker由于每个级别都有不同的实例,因此他们可以检查不同的答案……或其他。

但是,如果每个级别的“输入检查”行为之间的唯一区别是它们检查一组不同的答案,那么:

levelAnswers = answers.getAnswersForLevel(currentLevel);
for (String answer : levelAnswers) {
    if (userInput.equals(answer)) {
       // blah blah blah
    }
}
于 2013-06-08T23:56:22.577 回答
0

考虑到方法使用的其他变量,为什么不在同一个类中创建方法,而不是让不同的类来执行此操作,例如,

        messageDisplay.append("\n \n" + userInput + "\n");
        commandInput.setText("");
        messageDisplay.append("\n" + messages.getNextMessage());
        currentLevel++;

所以我建议在同一个方法中创建方法,然后从 actionPerformed 调用它

       public void checks()
       {
         String userInput = commandInput.getText();
          if (currentLevel == 0) {
            if (userInput.equals(answers.getIntroAnswers().get(0)) ||    userInput.equals(answers.getIntroAnswers().get(1))) {
              messageDisplay.append("\n \n" + userInput + "\n");
              commandInput.setText("");
              messageDisplay.append("\n" + messages.getNextMessage());
              currentLevel++;
              getCurrentLevel();
            } else {
                messageDisplay.append(notValid());
               }
           } else if (currentLevel == 1) {
                // do the same as above but with the next set of answers
               }
        }

然后从 actionPerformed 调用它

     public void actionPerformed(ActionEvent e)
     {
       check():
     }

所以现在你如果在一个单独的方法中处理。

于 2013-06-09T01:18:50.053 回答
0

在我看来,既然你这么多谈论关卡,你可能应该有一个代表关卡的类。实际上,由于您显然有不止一个级别,其行为略有不同,因此您有两种方法。

  1. 有一个 Level 接口,然后为每个级别创建一个类。

或者

  1. 有一个 Level 类,其构造函数将级别编号隐藏在类中。

之后,您可以多态地切换而不是嵌套的 if 语句(或 if 的表亲,switch 语句)。

Level level = currentLevel;
while (level != null) {
  level.doStuff;
  level = level.getNextLevel();
}
于 2013-06-09T02:01:59.540 回答