2017-02-16 124 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) 因为它会一直重复,直到它找到有效的单词为止 –