Пум, пум, пурум. Всем Хай! И сегодня обещанная практика по циклам. А это значит, будет две программки с циклами. И во второй программке будет эмуляция батла. Я расскажу, как жёстко тупил, и не понимал, что происходит. Так что читай всё до конца. Ну а мы начинаем.
Цикл "for".
Сначала давайте улучшим программку, которая паролит наше сообщение. Если кто не помнит, то писали мы её в этой статье. Будем использовать цикл «for» так как у нас есть условие и чёткие параметры. Мы зададим лимит ввода пароля и добавили сообщение в случае использование всех попыток. Вот что получилось.
string password = "пароль";
string inputPass;
int i;
for (i = 5; i >= 1; i--)
{
Console.WriteLine("У вас осталось "+ i + " попыток");
Console.Write("Введите пароль: ");
inputPass = Console.ReadLine();
if (password == inputPass)
{
Console.WriteLine("Вы сейчас читаете ну ооочень секретные данные.");
break;
}
else
{
Console.WriteLine("Пароль неверный.");
}
}
if (i == 0)
{
Console.WriteLine("Включена тревога!");
}
Давайте сравним со старым вариантом и посмотрим, что изменилось.
Сразу видим, что добавилась новая переменная для цикла «int i» . Зачем мы её вынесли потом расскажу. Дальше мы видим начало цикла «for» . В круглых скобках мы видим, что до тех пор, пока «i» больше либо равна одному, то цикл работает. И с каждой новой итерацией от «i» отнимается единица.
Дальше всё, что между фигурных скобок работает в цикле. Мы добавили сообщение о количестве оставшихся попыток. Потом идёт условный оператор «if», где мы добавили только «break» если пароль введён верно. Это нужно для остановки цикла. Иначе он и дальше будет спрашивать нас ввести пароль, пока не кончатся попытки. Если пароль введён не верный, он возвращается к началу цикла, отнимает единицу от количества попыток, проверяет больше либо равно теперь полученное число и если условие не верное, то цикл заканчивается.
После цикла у нас теперь есть условие, которое и проверяет, сколько количество попыток осталось. Вот как раз для этого условия я и вынес переменную «i» за цикл. Если бы я этого не сделал, то у меня не получилось бы её включить в новое условие за циклом. А так эту переменную можно использовать, как внутри цикла, так и за его пределами. Если «i» равна 0 то выводится сообщение "Включена тревога!".
На этом наша программа останавливается. Если остались вопросы по работе этого цикла, то пишите их в комментариях. А мы приступим к следующему циклу.
Цикл «while».
Так как у этого цикла нет чётких параметров, то мы вполне можем устроить батл между героем и его врагом. Там ведь не понятно на какой итерации кто-то из них проиграет. Смотрим сначала, как это реализовано, а потом разбираем код.
int health = 380;
int damage = 45;
int enemyHealth = 364;
int enemyDamage = 50;
while(health >= 0 && enemyHealth >= 0)
{
Console.WriteLine($"Здоровье Героя: {health}");
Console.WriteLine($"Здоровье Врага: {enemyHealth}");
health -= enemyDamage;
enemyHealth -= damage;
}
if (health <= 0 && enemyHealth <= 0)
{
Console.WriteLine($"Здоровье Героя: {health}");
Console.WriteLine($"Здоровье Врага: {enemyHealth}");
Console.WriteLine("Нечья");
}
else if (health <= 0)
{
Console.WriteLine($"Здоровье Героя: {health}");
Console.WriteLine($"Здоровье Врага: {enemyHealth}");
Console.WriteLine("Победа Врага!");
}
else if (enemyHealth <= 0)
{
Console.WriteLine($"Здоровье Героя: {health}");
Console.WriteLine($"Здоровье Врага: {enemyHealth}");
Console.WriteLine("Победа Героя!");
}
Представьте, что у нас есть два заклятых врага. И нам известно, сколько у каждого жизней, и какой каждый из них наносит урон за один раз.
- Сейчас отвлекитесь и напишите, как вы думаете, кто победил в этой схватке? Ответ напишите в комментариях.
Продолжим. У нас есть 4 переменные.
- Жизнь героя «health».
- Жизнь врага «enemyHealth».
- Какой урон наносит наш герой «damage».
- Какой урон наносит наш враг «enemyDamage».
Дальше уже идёт работа цикла. В условии мы пишем, когда РАБОТАЕТ цикл. Вот здесь я жёстко затупил и не мог понять, почему у меня жизни уходят в минус, а цикл работает. Ведь как раз я это и забыл, что в скобках пишется условия РАБОТЫ цикла, а не на оборот. Сначала я в условии писал, что цикл остановится, если у героя закончатся жизни ИЛИ (||) у врага закончится жизнь. А программа думала, что я пишу, что работа цикла будет продолжаться пока есть жизни у героя ИЛИ (||) у врага. В общем, когда посмотрел уроки по циклам ещё раз, до меня дошло, в чём была ошибка. Нужно ставит И (&&) в условии.
В цикле мы пишем, что бы жизни героя и врага выводились в консоли. И две формулы «жизнь - урон». И повторяем это пока у кого-нибудь жизни не закончатся.
После окончания цикла мы проверяем через «if» у кого закончились жизни. Как видите, есть даже вариант, если они у обоих закончатся.
if(health <= 0 && enemyHealth<= 0)
И в зависимости от результата вводим нужное сообщение.
Ну, вроде всё рассказал. Что не понятно спрашивайте в комментариях. Ещё немного и закончим этот блок по циклам и условным операторам. Следующая статья про рандом. Так что подписывайтесь, чтобы не пропустить. Всем пока!