我正在寫一個簡單的投幣遊戲。前提非常簡單:用戶可以打電話頭或尾巴。計算機然後翻轉硬幣,通知用戶折騰結果,以及他們是否猜對。如何防止用戶堵塞我的掃描儀?
就代碼而言,在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");
}
}
請注意,標籤不是關鍵字。在填充標籤列表中填寫您的問題中相同的單詞(木,,掃描儀)將無助於對它進行分類。請務必閱讀選擇標籤時出現的說明! – Charles