2014-04-25 48 views
0

我正在寫一個簡單的投幣遊戲。前提非常簡單:用戶可以打電話頭或尾巴。計算機然後翻轉硬幣,通知用戶折騰結果,以及他們是否猜對。如何防止用戶堵塞我的掃描儀?

就代碼而言,在while循環中,我首先提示用戶輸入,我使用Scanner的nextLine()讀入,然後將其分配給String變量。然後我調用feedback(),它向終端窗口顯示「Processing」並調用當前正在執行的Thread的sleep()。然後我檢查他們的猜測,如果由於某種原因它是無效的,我會向終端窗口顯示一條適當的消息並將布爾值設置爲true。這個布爾值的真值是使while循環繼續運行的原因。我不滿意的一點是,在while循環中,當我讀到他們對String的猜測並且正在執行feedback()時,我仍然可以輸入內容並按回車。然後,通過循環的下幾次(提供的標誌在某點設置爲true),它使用我輸入的內容作爲賦值input = reader.nextLine()。我很驚訝。我認爲當調用nextLine()時,掃描器只會讀取一行輸入,直到nextLine()被調用(即下一次通過循環)。但是相反,它似乎在feedback()執行時跟蹤了input = reader.nextLine()後面輸入的所有行。這裏是我的問題:有沒有辦法讓Scanner只讀一行,並讓它忽略用戶輸入的其他內容,直到下一次你實際提示他們輸入時爲止?換句話說,通過防止用戶輸入阻塞掃描器並佔用while循環若干次的未呼叫輸入來使遊戲變得傻瓜式的?以下是我的遊戲的完整實施:

import java.util.Scanner; 
import java.util.InputMismatchException; 
import java.util.Random; 

public class GuessingGame 
{ 
    public static void main(String[] args) throws InterruptedException 
    { 
     Random randy = new Random(); 
     Scanner reader = new Scanner(System.in); 
     String input = ""; 
     int guess = 0; 
     boolean flag = true; 

     System.out.println("Let's flip a coin!"); 

     while(flag) 
     { 
      flag = false; 
      System.out.println("\fEnter 1 for heads, 2 for tails."); 
      input = reader.nextLine(); 
      feedback("Processing"); 

      try 
      { 
       guess = Integer.parseInt(input); 
      } 
      catch(NumberFormatException e) 
      { 
       flag = true; 
       System.out.println("Invalid!"); 
       Thread.sleep(3000); 
      } 

      if(!flag) 
      { 
       try 
       { 
        receive(guess); 
       } 
       catch(IllegalArgumentException e) 
       { 
        flag = true; 
        System.out.println(e); 
        Thread.sleep(3000); 
       } 
      } 
     } 

     feedback("Flipping"); 
     int outcome = randy.nextInt(2) + 1; 

     if(outcome == 1) 
     { 
      System.out.print("Heads! "); 

      if(guess == 1) 
      { 
       System.out.println("You guessed correctly."); 
      } 
      else 
      { 
       System.out.println("You guessed incorrectly."); 
      } 
     } 
     else 
     { 
      System.out.print("Tails! "); 

      if(guess == 2) 
      { 
       System.out.println("You guessed correctly."); 
      } 
      else 
      { 
       System.out.println("You guessed incorrectly."); 
      } 
     } 
    } 

    public static void receive(int g) 
    { 
     if(g < 0 || g > 2) 
     { 
      throw new IllegalArgumentException("Guess must be 1 or 2."); 
     } 
    } 

    public static void feedback(String message) throws InterruptedException 
    { 
     String feedback = message; 
     System.out.println("\f"); 

     for(int x = 0; x < 12; x++) 
     { 
      if(x % 4 == 0) 
      { 
       feedback = message; 
       Thread.sleep(250); 
      } 

      System.out.println("\f" + feedback); 
      feedback += "."; 
      Thread.sleep(125); 
     } 

     System.out.print("\f"); 
    } 
} 
+0

請注意,標籤不是關鍵字。在填充標籤列表中填寫您的問題中相同的單詞(木,,掃描儀)將無助於對它進行分類。請務必閱讀選擇標籤時出現的說明! – Charles

回答

0

最簡單的方法就是在您發佈問題時閱讀並丟棄掃描儀中的任何內容。掃描儀可能有一種方法來清除它或尋求到最後作爲做同樣事情的替代方法。

0

當您完成掃描儀的使用後,您應該致電reader.close()

添加在這裏:

 try 
     { 
      guess = Integer.parseInt(input); 
      reader.close(); 
     } 

這將關閉掃描儀和防止用戶進一步的交互如果輸入正確分析。如果Integer.parseInt(input)引發異常,則該行不會執行。

關閉掃描儀和其他讀者/作家是一個很好的做法,因爲它釋放回系統的內存並防止類似程序的錯誤。