是否可以简单地使用复杂条件进行while循环?

时间:2013-10-15 23:43:14

标签: java while-loop xor

我正在开发一个游戏,我利用一个类,允许用户输入一个选项作为字符串来执行3个选项之一:“攻击”,“防御”或“逃离”。这可以通过'异或'(XOR)进行逻辑处理。我决定尝试使用while循环使用这个逻辑而不是通常的Switch构造来看看会发生什么,只需要一点点离散数学。我知道虽然条件会很丑陋但很长,但它确实很糟糕!我喜欢它!我想要知道,因为我想在代码的其他部分重用这个while循环,如果有某种方法来保存while循环条件(比如作为变量,方法或其他东西),这样我就可以把它放在while循环条件,每次不占用8行代码。这是我的while循环。不要笑,它有效。并且,它避免了try-catch。它实际上非常干净。我发布了我在下面使用的方法。此方法由另一个类调用:

public static void fighterAction(){  
    String selection = null;
    Scanner userChoice = new Scanner(System.in);

//Fighter 1 chooses combat action to perform: this is performed by 
//(XOR) logic:
//(( a  || b ) && !( a && b ) || c ) && !((( a || b ) && !( a && b ) && c ))

    while((( !"attack".equals(selection)  || !"defend".equals(selection) ) 
            && !( !"attack".equals(selection) && !"defend".equals(selection)
            ) || !"flee".equals(selection) ) &&
            !((( !"attack".equals(selection) || !"defend".equals(selection)
            ) && !( !"attack".equals(selection) && 
            !"defend".equals(selection) ) && !"flee".equals(selection) )))
    {    
        System.out.println("Choose action: attack  defend  flee\n\nEnter: ");
        selection = userChoice.next();
        if((( !"attack".equals(selection)  || !"defend".equals(selection) ) 
                && !( !"attack".equals(selection) && 
                !"defend".equals(selection) ) || !"flee".equals(selection) )
                && !((( !"attack".equals(selection) || 
                !"defend".equals(selection) ) && 
                !( !"attack".equals(selection) && 
                !"defend".equals(selection) ) && 
                !"flee".equals(selection) )))
        {
            System.out.println("Invalid Entry!");
        }else{
        System.out.println(selection + " was chosen");
        System.out.println("");
        }
    }        
}

再次,我在问是否有办法采用这个while子句(我强调,完美地运作):

((!“attack”.equals(selection)||!“defend”.equals(selection))&&!(!“attack”.equals(selection)&&!“defend”。 equals(selection))||!“flee”.equals(selection))&& !(((!“attack”.equals(selection)||!“defend”.equals(selection))&&!(!“attack”.equals(selection)&&!“defend”.equals (选择))&&!“逃离”.equals(选择)))

以便它适合while循环条件:

 while(FITS HERE){}  

谢谢!

3 个答案:

答案 0 :(得分:4)

哇,哇,哇。 selection一次只能拥有一个值。有许多重构可以使这个代码更清晰(比如使用枚举,而不是嵌入魔术常量),但你可以逻辑地将整个事物折叠成

while(!"attack".equals(selection) && !"defend".equals(selection) && !"flee".equals(selection)) { ... }

答案 1 :(得分:2)

它将“适合”,换句话说,你可以按原样使用它,但它很难阅读,更重要的是,难以调试。为了使它更漂亮,将其变成一种方法。


话虽如此,使用字符串进行此类操作既丑陋又危险,如果您决定将UI更改为GUI界面(例如Swing或Android),它将限制您的程序。我会考虑创建一个枚举来封装用户选项:

public enum UserOption {
  ATTACK, DEFEND, FLEE
}

期望此枚举的方法只能接受三个枚举常量中的一个(或null),从而为您提供编译时类型检查和用户选项的限制,并且还会产生更漂亮,更可重用和可扩展的代码。

然后你的控制台应用程序可以有一个验证方法:

public boolean validateUserOptionsString(String text) {
  for (UserOption option : UserOption.Values() {
    if (text.equalsIgnoreCase(option.toString())) {
      return true;
    }
  }
  return false;
}

答案 2 :(得分:2)

这就是我写它的方式

String select;
while (true) {
   System.out.println("Enter: attack, defend or flee");
   selection = userChoice.nextLine();
   if (select.equals("attack") || select.equals("defend")||select.equals("flee"))
       break;
   System.out.println("Invalid input: " + select);
}