2013-10-15 2 views
0

"공격", "방어"또는 "도망"옵션 중 하나를 수행하는 문자열로 선택 항목을 입력 할 수있는 클래스를 활용하는 게임을하고 있습니다. 논리적으로 '배타적 OR'(XOR)로 처리 할 수 ​​있습니다. 나는 약간의 이산 수학으로 무장 한 상황을보기 위해 일반적인 Switch 구조 대신에이 논리를 사용하여 while 루프를 사용하기로 결정했다. 나는 while 상태가 추악하고 오래있을 것이라는 것을 알았지 만, 그것은 dammit 작품입니다!, 그리고 나는 그것을 좋아합니다! 나는 while 루프 조건 (변수, 메소드 또는 무언가와 같은)을 저장할 수있는 방법이 있다면 코드의 다른 섹션에서 while 루프를 재사용하고 싶기 때문에 알고 싶었다. while 루프 조건 및 매번 8 줄의 코드를 사용하지 않습니다. 여기 while 루프가 있습니다. 웃지 마라. 그리고 try-catch를 피할 수 있습니다. 실제로는 매우 깨끗하게 실행됩니다. 아래에서 사용하는 방법을 게시했습니다. 이 방법은 다른 클래스에 의해 호출됩니다 거기에 (내가 강조하고 완벽하게 작동) 동안이 절을하는 방법입니다 경우while 루프에 대한 복합 조건을 간결하게 사용할 수 있습니까?

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

다시 말하지만, 내가 부탁하고!

(("공격". & &! (! "attack". equals (선택) & & "방어하다". 등가 (선택)) || "도망 가다". 등가 (선택) 선택)) & &! (("공격". 동등 (선택) || "방어". 등가 (선택)) & &! (! "공격".) & & "방어".equals (선택)) & & "도망".equals (선택)))는 while 루프 조건의 내부에 맞도록

:!

while(FITS HERE){} 

감사합니다!

답변

2

"맞는"즉, 그대로 사용할 수 있지만 읽는 것이 더 중요하며 디버깅하기가 어렵습니다. 그것을 더 예쁘게 만들려면 방법으로 만드십시오.


추악하고 위험한 것은 이런 종류의에 대한 문자열을 사용하여,이 말을하는 데, 플러스 당신이 GUI 인터페이스로 UI를 변경하는 결정해야이 프로그램을 제한 할 것이다, 스윙 또는 안드로이드를 말한다. 내가 대신 사용자 옵션을 캡슐화하는 열거를 생성 고려할 것 :

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; 
} 
+0

플러스, 당신은 실제로 그 방법을 다시 사용하여'if' 문을 향상시킬 수 있습니다 ...! – user268396

+0

@ user268396 : 답장 편집을 참조하십시오. –

4

워, 워 :

는 그런 다음 콘솔 응용 프로그램은 validate 메소드를 가질 수있다. selection은 한 번에 하나의 값만 가질 수 있습니다.이 (마법 상수를 내장 열거를 사용, 그리고 같은)이 코드를 많이 청소기를 만들 수있는 리팩토링의 숫자가 있습니다,하지만 당신은 논리적으로

while(!"attack".equals(selection) && !"defend".equals(selection) && !"flee".equals(selection)) { ... } 
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); 
} 
관련 문제