2017-02-16 100 views
1

我正在爲C#的控制檯應用程序中的冒險類文本遊戲工作。如何檢查用戶是否正確輸入命令 - C#

我需要一種方法來測試用戶是否正確地輸入命令,並且他們是否不再測試。

我現在嘗試這一權利:

do 
{ 
    Response = Console.ReadLine(); 
    switch (Response.ToLower()) 
    { 
     case "hallway": 
      Location = Locations[2]; 
      Console.WriteLine("You decide to get some fresh air, and step out of the dance room and into the hallway." + "\n" + "There's no one here."); 
      Console.ForegroundColor = ConsoleColor.Cyan; 
      Console.WriteLine("Command List: Look, Look at, Move, Check Status"); 
      Console.ResetColor(); 
      ResponseTester(); 
      break; 
     case "dance room": 
      //[Other code here] 
      break; 
     default: 
      Console.WriteLine("I'm sorry, I don't understand that."); 
      break; 
    } 
} 
while (Response.ToLower() != "hallway" || Response.ToLower() != "dance room"); 

但是它不是很可靠的,因爲當我嘗試它與if/else語句或其他用途,這將只測試一次。有沒有更好的方法來測試?

+0

你可以有用戶輸入和語法檢查位於無限循環中'而(真){...}'。否則就不清楚*「它只會測試一次」*有什麼問題。 – Sinatr

+0

@Sintar如果用戶沒有正確輸入,它將不會重置循環,以便它們可以正確輸入,這就是我的意思。就像我輸入移動,然後不正確拼寫「走廊」,它不會再嘗試,只輸出它不明白。 –

回答

0

你需要如下

var invalid = true; 
while (invalid) 
{ 
    Response = Console.ReadLine(); 
    switch (Response.ToLower()) 
    { 
     case "hallway": 
     Location = Locations[2]; 
     Console.WriteLine("You decide to get some fresh air, and step out of the dance room and into the hallway." + "\n" + "There's no one here."); 
     Console.ForegroundColor = ConsoleColor.Cyan; 
     Console.WriteLine("Command List: Look, Look at, Move, Check Status"); 
     Console.ResetColor(); 
     ResponseTester(); 
     invalid = false; 
     break; 
    case "dance room": 
     //[Other code here] 
     invalid = false; 
     break; 
    default: 
     Console.WriteLine("I'm sorry, I don't understand that."); 
     break; 
    } 
    } 

但除此之外,真正獲取輸入需要從處理輸入的遊戲設計單獨重寫一遍。設置一個數組或可接受的單詞列表,然後對其進行測試,然後分別進行處理。所以像這樣的

private List<string> validWords = new List<string>{"hallway","dance room"}; 

private string GetInput() 
{ 
    var response = string.Empty; 
    while (true) 
    { 
     response = Console.ReadLine(); 
     if (validWords.Contains(response)) 
     { 
      break; 
     } 
    } 
    return response; 
} 

private void ProcessInput(string response) 
{ 
    //switch statements go here 
} 
+0

第二種方法實際上似乎更有效率。你能稍微解釋一下這裏發生了什麼 - 我對C#還是有點新鮮感,而且我不確定我是否正確地做對了? –

+0

那麼,跳過什麼語言是完全的,在任何類型的編程,你想分離的關注。所以接收輸入與處理輸入是分開的。基本上你會有一個外部循環,永遠調用獲取輸入,然後一旦它接收到一個字符串回調ProcessInput。 get輸入會檢查輸入的單詞是否在有效單詞列表中,並強制它們繼續輸入,直到輸入正確的單詞爲止。這是 >的點,而(true) 因爲它會一直重複,直到它找到有效的單詞爲止 –