เป็นไปได้ไหมที่จะใช้เงื่อนไขที่ซับซ้อนเป็นระยะเวลาหนึ่งอย่างกระชับ?

ฉันกำลังสร้างเกมที่ฉันใช้คลาสที่จะอนุญาตให้ผู้ใช้ป้อนข้อมูลตัวเลือกเป็นสตริงเพื่อทำหนึ่งใน 3 ตัวเลือก: "โจมตี" "ป้องกัน" หรือ "หนี" สิ่งนี้สามารถจัดการได้ในเชิงตรรกะโดย 'เอกสิทธิ์หรือ' (XOR) ฉันตัดสินใจลองใช้ while loop โดยใช้ตรรกะนี้แทนโครงสร้าง Switch ปกติเพื่อดูว่าจะเกิดอะไรขึ้น โดยติดอาวุธคณิตศาสตร์แยกส่วนเพียงเล็กน้อย ฉันรู้ว่าในขณะที่สภาพนั้นดูน่าเกลียดและยาวนาน แต่มันก็ใช้งานได้จริง และฉันก็ชอบมัน! ฉันอยากรู้ เนื่องจากฉันต้องการใช้ while loop นี้ซ้ำในส่วนอื่นๆ ของโค้ด หากมีวิธีการบันทึกเงื่อนไข while loop (เช่น ตัวแปร วิธีการ หรือบางอย่าง) เพื่อที่ฉันจะได้ใส่ไว้ใน while เงื่อนไขการวนซ้ำและไม่ใช้โค้ดสูงสุด 8 บรรทัดในแต่ละครั้ง นี่คือ while loop ของฉัน อย่าหัวเราะ มันได้ผล และจะหลีกเลี่ยงการลองจับ มันวิ่งได้สะอาดมากจริงๆ ฉันโพสต์วิธีที่ฉันใช้ด้านล่าง วิธีการนี้ถูกเรียกโดยคลาสอื่น:

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 clause นี้หรือไม่ (ซึ่งฉันเน้นย้ำว่าทำงานได้อย่างสมบูรณ์แบบ):

(( !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) ))

เพื่อให้พอดีกับเงื่อนไขของ while loop:

 while(FITS HERE){}  

ขอบคุณ!


person Smith Will Suffice    schedule 15.10.2013    source แหล่งที่มา


คำตอบ (3)


มันจะ "พอดี" ตามที่เป็นอยู่ กล่าวอีกนัยหนึ่งคุณสามารถใช้ตามที่เป็นอยู่ แต่จะอ่านยากและที่สำคัญกว่านั้นคือแก้ไขจุดบกพร่องได้ยาก เพื่อให้สวยขึ้นให้ทำเป็นวิธีการ


ต้องบอกว่าการใช้ Strings สำหรับสิ่งนี้เป็นสิ่งที่น่าเกลียดและอันตราย อีกทั้งมันจะจำกัดโปรแกรมของคุณหากคุณตัดสินใจเปลี่ยน UI ให้เป็นอินเทอร์เฟซ GUI เช่น Swing หรือ Android ฉันจะพิจารณาสร้าง enum เพื่อสรุปตัวเลือกผู้ใช้แทน:

public enum UserOption {
  ATTACK, DEFEND, FLEE
}

วิธีที่คาดหวังให้ enum นี้สามารถยอมรับค่าคงที่ enum (หรือ null) ได้เพียงค่าใดค่าหนึ่งเท่านั้น ดังนั้นคุณจึงตรวจสอบประเภทเวลาคอมไพล์และข้อจำกัดของตัวเลือกของผู้ใช้ และยังส่งผลให้โค้ดที่สามารถนำมาใช้ซ้ำและขยายได้สวยงามยิ่งขึ้นอีกด้วย

จากนั้นแอปคอนโซลของคุณอาจมีวิธีการตรวจสอบ:

public boolean validateUserOptionsString(String text) {
  for (UserOption option : UserOption.Values() {
    if (text.equalsIgnoreCase(option.toString())) {
      return true;
    }
  }
  return false;
}
person Hovercraft Full Of Eels    schedule 15.10.2013
comment
นอกจากนี้คุณยังสามารถนำวิธีการดังกล่าวกลับมาใช้ใหม่เพื่อปรับปรุงคำสั่ง if ได้อีกด้วย... ! - person user268396; 16.10.2013

ว้าว ว้าว ว้าว selection สามารถมีค่าได้ครั้งละหนึ่งค่าเท่านั้น มีการรีแฟคเตอร์หลายอย่างที่อาจทำให้โค้ดนี้สะอาดขึ้นมาก (เช่น การใช้ enum และไม่ฝังค่าคงที่เวทย์มนตร์) แต่คุณสามารถยุบสิ่งทั้งหมดนั้นลงในตรรกะได้

while(!"attack".equals(selection) && !"defend".equals(selection) && !"flee".equals(selection)) { ... }
person chrylis -cautiouslyoptimistic-    schedule 15.10.2013

ผมจะเขียนแบบนี้ครับ

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);
}
person Peter Lawrey    schedule 15.10.2013