Получение некоторого цикла для работы на C# для игры в HP

#c#

Вопрос:

Я не знаю, сработает ли то, как я пытаюсь это сделать, но я создаю игру, в которой игрок и компьютер продолжают атаковать друг друга, пока кто-то не наберет HP 0. Я пытаюсь использовать цикл while, чтобы продолжать просить игрока атаковать, когда кто — то умирает. Я не могу заставить его попросить игрока о еще одной атаке. Он продолжает говорить, пожалуйста, введите число от 1 до 6, поэтому он просто использует пустое текстовое поле в качестве ввода.

 public int userPickForWeapon(int userPick) { //this takes what number the user pick for a weapon and returns it  return userPick; }  private void btnPlayerOneAttack_Click(object sender, EventArgs e)  {   do   {  int userPickTwo = 0;  if (int.TryParse(txtPlayerWeapons.Text, out userPick))  {  userPickTwo = userPickForWeapon(userPick);    if (userPickTwo == 1)  {  bowAndArrow = rand.Next(8, 16); //picks a random number of damage  computerHP -= bowAndArrow; // takes away the players hp  lblComputerHP.Text = "HP: "   computerHP; // Shows the player their hp  lblComputerResultsShow.Text = "You used Bow and Arrow n and did "   bowAndArrow   " damage";  txtPlayerWeapons.Text = ""; //clears the text box  }  else if (userPickTwo == 2)  {  sword = rand.Next(1, 10); //picks a random number of damage  computerHP -= sword; // takes away the players hp  lblComputerHP.Text = "HP: "   computerHP; // Shows the player their hp  lblComputerResultsShow.Text = "You used Sword n and did "   sword   " damage";  txtPlayerWeapons.Text = ""; //clears the text box  }  else if (userPickTwo == 3)  {  fire = rand.Next(7, 15); //picks a random number of damage  computerHP -= fire; // takes away the players hp  lblComputerHP.Text = "HP: "   computerHP; // Shows the player their hp  lblComputerResultsShow.Text = "You used Fire n and did "   fire   " damage";  txtPlayerWeapons.Text = ""; //clears the text box  }  else if (userPickTwo == 4)  {  ice = rand.Next(8, 15); //picks a random number of damage  computerHP -= ice; // takes away the players hp  lblComputerHP.Text = "HP: "   computerHP; // Shows the player their hp  lblComputerResultsShow.Text = "You used Ice n and did "   ice   " damage";  txtPlayerWeapons.Text = ""; //clears the text box  }  else if (userPickTwo == 5)  {  wind = rand.Next(9, 15); //picks a random number of damage  computerHP -= wind; // takes away the players hp  lblComputerHP.Text = "HP: "   computerHP; // Shows the player their hp  lblComputerResultsShow.Text = "You used Wind n and did "   wind   " damage";  txtPlayerWeapons.Text = ""; //clears the text box  }  else if (userPickTwo == 6)  {  water = rand.Next(1, 6); //picks a random number of damage  computerHP -= water; // takes away the players hp  lblComputerHP.Text = "HP: "   computerHP; // Shows the player their hp  lblComputerResultsShow.Text = "You used water n and did "   water   " damage";  txtPlayerWeapons.Text = ""; //clears the text box  }  else  {  // Display an error message for if the user puts in something other than a number between 1 -6  MessageBox.Show("Please enter a number between 1 - 6");  txtPlayerWeapons.Focus();  }  }    else  {  // Display an error message for if the user puts in something other than a number  //inside the while loop  MessageBox.Show("Please enter a number between 1 - 6");  }   }while(playerOneHP gt;= 0 || computerHP gt;= 0);  }  

Ответ №1:

Это проблема порядка операций. Как правило, в этих сценариях вы хотите сделать следующее:

  1. Войдите в цикл while
  2. Выберите активного участника боевых действий
  3. Если активным участником боя является игрок, предложите пользователю выбрать оружие
  4. Рассчитайте урон для выбранного оружия
  5. Нанесите урон игроку противника
  6. Выйдите из цикла while, если один из игроков достиг HP 0

Вместо этого ваш алгоритм, по-видимому, работает следующим образом:

  1. Определяет активного игрока
  2. Запрашивает у пользователя активное оружие
  3. Входит в цикл while
  4. Рассчитывает урон для выбранного оружия
  5. Наносит урон игроку противника
  6. Завершает цикл while, если один из игроков достиг HP 0

Если так структурирован ваш алгоритм, он не может работать, потому что цикл будет вращаться бесконечно, если только не произойдет огромного всплеска урона (возможно, вызванного рассеянным космическим лучом), который убьет игрока противника.

Подумайте о том, чтобы перестроить свой алгоритм таким образом, чтобы он следовал первому шаблону.

Удачи!

Дополнение

Цикл, который вы пытаетесь создать в событии нажатия кнопки, уже предусмотрен для вас приложением Windows и называется циклом событий. Когда ваше приложение запускается, оно переходит в состояние опроса, в котором ожидает, что пользователь щелкнет элемент в пользовательском интерфейсе, нажмет клавиши или нажмет кнопки мыши. Эти действия вызывают события, которые вы обрабатываете в своем приложении. Как только вы это сделаете, приложение снова войдет в состояние опроса. Это состояние опроса эквивалентно (но не совсем) циклу while.

В шагах, которые я описал выше для вас, первый и последний шаги относятся к циклу событий Windows (и это была моя ошибка, потому что я не был более ясным).

Удалите цикл while из обработчика событий нажатия кнопки и позвольте операционной системе уведомлять вас, когда пользователь нажмет кнопку. Держите логику внутри цикла, просто удалите do { и закройте } .

Комментарии:

1. Думаю, я понимаю, о чем вы говорите. Я отредактировал свой код сверху, но он все еще доставляет мне проблемы.

2. @Wheeze86 Смотрите мой обновленный ответ.