2015-01-23 2 views
0

Я сделал эту игру в палач, но единственная проблема заключается в том, что я не могу понять, какие простые циклы (для, пока или делать пока) я должен использовать, чтобы программа дала пользователю три шанса правильно ответить или продолжить повторяя, если они правильно отвечают. Мне было интересно, может ли кто-нибудь привести меня в правильном направлении?Как создать цикл для игры cman C#?

 Console.WriteLine("Do you want to play a game?"); 
     string answer = Console.ReadLine(); 

     if (answer == "no") 
     { 
      Console.WriteLine("Please Exit Program"); 
     } 


     System.Threading.Thread.Sleep(1000); 
     if (answer == "yes") 
     { 
      Console.WriteLine(" "); 
      Console.WriteLine("Welcome to Hangman"); 

      string[] array1 = new string[10]; 
      array1[0] = "hello"; 
      array1[1] = "swami"; 
      array1[2] = "zebra"; 
      array1[3] = "rainbow"; 
      array1[4] = "camp"; 
      array1[5] = "unicycle"; 
      array1[6] = "trivia"; 
      array1[7] = "hockey"; 
      array1[8] = "charlie"; 
      array1[9] = "canada"; 

      Random word = new Random(); 

      int mynumber = word.Next(0, 10); 

      char[] array2 = array1[mynumber].ToCharArray(); 


      char[] array3 = new char[array2.Length]; 

      Console.WriteLine(array2); 

      for (int i = 0; i < array2.Length; i++) 
      { 
       array3[i] = '*'; 
      } 

      Console.WriteLine(" "); 
      Console.WriteLine(array3); 

      System.Threading.Thread.Sleep(1500); 

      Console.WriteLine(" "); 
      int number = 1; 
      number = number + 1; 

      Console.WriteLine(" Guess a letter"); 
      char letter = Char.Parse(Console.ReadLine()); 
      Console.WriteLine(" "); 

      for (int i = 0; i < array2.Length; i++) 
      { 
       if (letter == array2[i]) 
       { 
        Console.Write(letter); 
       } 
       else 
       { 
        Console.Write("*"); 
       }      
      }    

      Console.WriteLine(" "); 
     }   
    } 
} 
+2

https://code.msdn.microsoft.com/windowsdesktop/HangMan-C-version-e0d17f1b – briskovich

+5

'for' цикл выполняется по набору чисел, инкремент переменной каждого цикла. Цикл 'while' запускается * до тех пор, пока * (спасибо @TyCobb) выполняются некоторые критерии внутри цикла. 'Do while' делает то же самое, что и' while', но проверяет критерии в конце цикла вместо начала. Что вы используете, зависит от того, что вы хотите сделать. – paqogomez

+0

Вам нужно увеличивать число, только если письмо неверно; цикл while должен быть точным (do-while будет работать тоже, без разницы в этом случае). Ибо тоже будет работать, но это сбивает с толку. – Casey

ответ

3

Шаг назад от деталей кода на мгновение и рассмотрим логику игры и как петля будет выражаться в человеческом языке.

Вы по существу есть две петли:

  1. Многократно просят входа в игру.
  2. Неоднократно играйте в игру.

Если бы мы были гнездиться эти петли внутри друг друга на человеческом языке псевдо-код, он может выглядеть следующим образом:

while (player wishes to play again) 
    playGame() 

и в playGame():

while (game isn't over) 
    playTurn() 

Если вы уже иметь код для «поворота» игры (игрок догадывается, предположение определяется как правильное или неправильное и т. д.), тогда все, что вам действительно нужно, это определить эти условия.

game isn't over 

Для этого можно поддерживать простой булевский флаг. Что-то вроде:

bool gameIsOver = false; 

В любой момент проверки проверьте логику игры. Победил ли игрок? Отобразите сообщение и установите флаг true. Игрок проиграл? Тот же ответ, просто другое сообщение. Таким образом, петля заканчивается чем-то вроде:

bool gameIsOver = false; 
while (!gameIsOver) 
{ 
    // perform turn logic 
    // when a turn ends the game, set gameIsOver to true 
} 

Та же концепция может быть применена к внешнему контуру. Это нужно, чтобы определить:

player wished to play again 

Так что вы можете структурировать это что-то вроде:

bool continueWithAnotherGame = true; 
while (continueWithAnotherGame) 
{ 
    // play a game 

    // ask the user if they would like to play again 
    // set continueWithAnotherGame based on the user's reply 
} 

Физически ключевых слов, используемых для построения цикла становится намного более простым, как только семантическая структура цикла была определены. Оттуда вы можете больше сосредоточиться на деталях. Например, вы говорите, что игра имеет 3 «забастовки». Это не требует использования счетчика в цикле for, вы можете использовать отдельный счетчик. Что-то вроде:

bool gameIsOver = false; 
int strikes = 0; 
while (!gameIsOver) 
{ 
    // perform turn logic 

    // if the turn is a fail, increment strikes 

    // if strikes is greater than or equal to 3, set gameIsOver to true 

    // else if the turn is a pass, continue 

    // if the game is solved, set gameIsOver to true 
} 
+0

Правильно, хотя я бы указал, что делать-пока и для реализаций одинаково возможно (если труднее читать). – Casey

+0

@emodendroket: Любая структура петли будет работать. «For» также будет работать, возможно, без операции шага и другой условной проверки. (Который также будет труднее читать, конечно.) – David

+1

Правильно, да. Я только упомянул об этом, потому что ОП, похоже, задается вопросом, какой из них он должен использовать, и я подумал, что было бы полезно понять, что они все формально эквивалентны. – Casey

Смежные вопросы