Делать — при использовании || или && в С#

Я изучаю C# на сайте Microsoft . Выполняя практику на веб-сайте, я пытался использовать || пока состояние. Но это не сработало должным образом.

int heroLife = 10;
int monsterLife = 10;
int round = 1;

do
{
  int attackPoint = new Random().Next(1,10);
  if (round%2 != 0)
  {
    monsterLife -= attackPoint;
    Console.WriteLine($"Monster was damaged and lost {attackPoint} health and now has {monsterLife} health.");
  }
  else
  {
    heroLife -= attackPoint;
    Console.WriteLine($"Hero was damaged and lost {attackPoint} health and now has {heroLife} health.");
    
  }
  round++;
}while(heroLife<=0 || monsterLife<=0);

Console.WriteLine(heroLife > 0 ? "Hero wins!" : "Monster wins!");

Код запускается только один раз, даже если значения HeroLife и MonsterLife больше 0. Он будет работать, если я изменю while(heroLife<=0 || monsterLife<=0) на while(heroLife>0 && monsterLife>0);.

Я неправильно понял || ? Или просто не используйте || в каком состоянии?

Он повторяется, если heroLife<=0 || monsterLife<=0, что означает, что он не будет повторяться, если значение HeroLife или MonsterLife больше 0. Это «делать пока», а не «делать пока».

qrsngky 30.07.2024 03:39
while (x <= 0 || y <= 0)` - запустится, если x меньше или равно нулю, или y меньше нуля. Для цикла do/ while, такого как ваш, условие будет оцениваться перед каждым возвратом цикла к началу. while (x > 0 && y > 0) будет повторяться, если оба x и y больше 0. || — это короткое логическое ИЛИ, а && — это короткое логическое И.
ProgrammingLlama 30.07.2024 03:42

почему вы создаете new Random() на каждой итерации? Просто создайте один экземпляр и используйте его повторно.

phuclv 30.07.2024 04:08

@qrsngky да, ты прав, я неправильно понял, что делать. Спасибо!

YCL 30.07.2024 08:34

@phuclv спасибо за проверку кода! Не заметил этого, поменяю код.

YCL 30.07.2024 08:39
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
5
72
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы путаете два понятия: while и логическое поведение И/ИЛИ (&&/||). while — это циклическая структура, которая переводится как «Пока это условие истинно, зацикливаться». Поэтому, когда вы говорите «пока жизнь героя <= 0 ИЛИ жизнь монстра <= 0», вы должны понимать, что она никогда не зациклится, если герой не достигнет идеального результата. ударил на первой итерации.

То, что вы, вероятно, искали, было фактически «пока Герой ИЛИ Монстр не умрет». Проблема не в «ИЛИ», а в «пока», а не в «пока». Другой способ сформулировать это: «пока живы и Герой, и Монстр», и именно поэтому while(heroLife > 0 && monsterLife > 0) работает так, как вы ожидаете. «ИЛИ» на самом деле не подходит ни для одного сценария «пока верно». Если мы используем что-то вроде while(heroLife > 0 || monsterLife > 0), цикл будет выполняться до тех пор, пока Герой и Монстр не умрут. Изменение логической операции или инвертирование сравнений не может изменить поведение «пока истинно» на «пока истинно». Выполнить проверку «до» можно, указав условие break внутри цикла. (Не рекомендуется при условии правильно структурированного цикла)

Как упоминалось в комментариях, вам также следует избегать помещения объявления Random внутри цикла. Random — это простой квазислучайный генератор, очень чувствительный к времени, поэтому помещение его в цикл может привести к получению из него особенно похожих значений. Вам нужно только инициализировать его перед входом в цикл, а затем вызвать метод Next() внутри цикла. Результирующий код будет выглядеть так:

int heroLife = 10;
int monsterLife = 10;
int round = 1;
Random random = new Random();

do
{
  int attackPoint = random.Next(1,10);
  if (round % 2 != 0)
  {
    monsterLife -= attackPoint;
    Console.WriteLine($"Monster was damaged and lost {attackPoint} health and now has {monsterLife} health.");
  }
  else
  {
    heroLife -= attackPoint;
    Console.WriteLine($"Hero was damaged and lost {attackPoint} health and now has {heroLife} health.");
  }
  round++;
} while(heroLife > 0 && monsterLife > 0);

Console.WriteLine(heroLife > 0 ? "Hero wins!" : "Monster wins!");

Понятно! Огромное спасибо за подробное объяснение!

YCL 30.07.2024 08:35

Другие вопросы по теме