2017-03-28 65 views
0

我有一個循環,裏面有一個開關盒,它基本上是一個用戶界面,讓用戶選擇yes,現在用左右箭頭繼續遊戲。Console.ReadKey()在while循環中自行循環

我還添加了一個Console.Beep()給用戶一些反饋。由於某種原因,一旦遊戲結束(遊戲中使用的箭頭(其蛇))選擇yes和no保持開關和我聽到蜂鳴約10〜20次,然後停止。 有誰知道原因? 這是代碼:

while (true) 
{ 
    Console.Clear(); 
    Console.WriteLine("~~~~~~~~~~~~~~~~~~~~~~~~~\n\n~~~~~~~~You Lost!~~~~~~~~\n\n~~~~~~~~~~~~~~~~~~~~~~~~~\nYour score was: " + SnakeBody.Count); 
    Console.WriteLine("\nDo you want to continue?\n\n  " + (Continue ? ">YES/No" : " Yes/>NO")); 
    switch (Console.ReadKey().Key) 
    { 
     case ConsoleKey.LeftArrow: 
      if (!Continue) 
      { 
       Console.Beep(SoundFrequency, SoundLength); 
       Continue = true; 
      } 
      continue; 
     case ConsoleKey.RightArrow: 
      if (Continue) 
      { 
       Console.Beep(SoundFrequency, SoundLength); 
       Continue = false; 
      } 
      continue; 
     case ConsoleKey.Enter: 
      Console.Beep(SoundFrequency + 200, SoundLength); 
      if (Continue) 
       SnakeGame(); 
      break; 
     default: continue; 
    } 
    break; 
} 
+0

糟糕的語言 - 我刪除了我的評論。 :) –

回答

1

按住的鍵,它會產生重複擊鍵以一定的頻率,並將它們放入一個輸入隊列中。看來,當你玩你的遊戲,你產生了大量的按鍵這樣,你的應用程序無法處理它們在時間,所以,即使你認爲你已經播放完畢,你的應用程序仍然有很多(約10至20倍如你所寫)密鑰尚未處理,這就是原因。

+0

這是我第一次,雖然,但有什麼辦法來清除此輸入隊列? – SuperMinefudge

+0

http://stackoverflow.com/questions/3769770/clear-console-buffer 我想我找到pelase確認這是否是正確的事情:) – SuperMinefudge

+0

你要實現的目標是什麼這真的取決於解決方案。如果只是放棄所有你沒有及時處理的用戶輸入對你而言是好的,那麼肯定是解決方案。 不過,如果我是在蛇遊戲,我寧願考慮從常規控制檯輸入完全移開,因爲它是速度太慢,並不真正適合這樣的快速反應爲基礎的遊戲。 – rs232