2017-02-16 8 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"); 

を、それは非常に信頼性がないのですが、私は/ else文または他の用途は、それが一度だけテストする場合にそれを試みるときのように。より良いテスト方法がありますか?

+0

ようにあなたは 'しばらく(TRUE){...} '無限ループ内に位置するユーザ入力と構文チェックを有することができます。さもなければ、 "それは一度しかテストされません" *という問題が何であるかははっきりしない。 – 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

2番目の方法は、実際にはるかに効率的です。あなたはここで何が起こっているのか少し説明できますか?私はまだC#を少し新しくしています。 –

+0

どのような言語であっても、それを完全にはスキップします。どのようなプログラミングでも、心配する必要はありません。したがって、受信入力は処理入力とは別です。基本的には、外部ループを使用して、入力を取得した後に文字列を受け取ると、ProcessInputを呼び出します。 get入力は、入力された単語が有効な単語のリストにあるかどうかを調べ、正しい単語を入力するまで入力を続けるように強制します。それは有効な単語を見つける際にブレークに当たるまで繰り返されるという点で(真) の間です>(真) –

関連する問題