Я изучаю 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);
.
Я неправильно понял || ? Или просто не используйте || в каком состоянии?
while (x <= 0 || y <= 0
)` - запустится, если x меньше или равно нулю, или y меньше нуля. Для цикла do/ while, такого как ваш, условие будет оцениваться перед каждым возвратом цикла к началу. while (x > 0 && y > 0)
будет повторяться, если оба x и y больше 0. ||
— это короткое логическое ИЛИ, а &&
— это короткое логическое И.
почему вы создаете new Random()
на каждой итерации? Просто создайте один экземпляр и используйте его повторно.
@qrsngky да, ты прав, я неправильно понял, что делать. Спасибо!
@phuclv спасибо за проверку кода! Не заметил этого, поменяю код.
Вы путаете два понятия: 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!");
Понятно! Огромное спасибо за подробное объяснение!
Он повторяется, если
heroLife<=0 || monsterLife<=0
, что означает, что он не будет повторяться, если значение HeroLife или MonsterLife больше 0. Это «делать пока», а не «делать пока».