2017-02-16 6 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

두 번째 방법은 사실 훨씬 효율적입니다. 여기에 무슨 일이 일어나고 있는지 조금 더 설명해 주시겠습니까? 저는 여전히 C#에 다소 익숙하며, 제대로하고 있는지 잘 모르겠습니다. –

+0

글쎄, 어떤 언어로 건너 뛰는가, 어떤 종류의 프로그래밍에서든 당신은 관심사의 분리를 원한다. 입력을받는 것은 입력을 처리하는 것과 별개입니다. 기본적으로 외부 루프를 사용하면 ProcessInput을 호출 한 문자열을받은 후 영구적으로 입력을받습니다. get 입력은 입력 된 단어가 유효한 단어 목록에 있는지 확인하여 올바른 단어를 입력 할 때까지 입력을 계속하도록합니다. 그 점은 > (true) 입니다. 유효한 단어를 찾기 위해 중단 점에 도달 할 때까지 계속 반복됩니다. –

관련 문제