0

ユーザーが「攻撃」、「防御」、または「逃げる」の3つのオプションのいずれかを実行するための文字列として選択肢を入力できるようにするクラスを利用するゲームに取り組んでいます。これは、「排他的 OR」(XOR) によって論理的に処理できます。通常の Switch コンストラクトの代わりに、このロジックを使用する while ループを使用して、何が起こるかを確認することにしました。while 条件が醜くて長いことはわかっていましたが、うまくいきました!そして、私はそれが好きです! 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(選択) || !"defend".equals(選択) ) && !( !"attack".equals(選択) && !"defend".equals(選択) ) || !" fly".equals(選択) ) && !((( !"attack".equals(選択) || !"defend".equals(選択) ) && !( !"attack".equals(選択) && !"defend ".equals(選択) ) && !"逃げる".equals(選択) ))

while ループ条件の内側に収まるようにします。

 while(FITS HERE){}  

ありがとう!

4

3 に答える 3

2

そのまま「適合」します。つまり、そのまま使用できますが、読みにくく、さらに重要なことに、デバッグが困難になります。よりきれいにするために、メソッドにします。


そうは言っても、この種のことに文字列を使用するのは見苦しく危険です。さらに、UI を Swing や Android などの GUI インターフェイスに変更すると、プログラムが制限されます。代わりに、列挙型を作成してユーザー オプションをカプセル化することを検討します。

public enum UserOption {
  ATTACK, DEFEND, FLEE
}

この列挙型を期待するメソッドは、3 つの列挙型定数の 1 つ (または null) のみを受け入れることができるため、コンパイル時の型チェックとユーザーのオプションの制限が提供され、再利用可能で拡張可能なコードがよりきれいになります。

次に、コンソール アプリに検証メソッドを含めることができます。

public boolean validateUserOptionsString(String text) {
  for (UserOption option : UserOption.Values() {
    if (text.equalsIgnoreCase(option.toString())) {
      return true;
    }
  }
  return false;
}
于 2013-10-15T23:44:45.493 に答える
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);
}
于 2013-10-15T23:52:04.560 に答える