Содержание
Итак, в части «Основы языка C#» мы познакомились с основными конструкциями языка, научились использовать массивы, циклы и логические операции, поэтому можем попробовать свои силы в разработке простенькой консольной игры под названием «Угадай число». Правила игра следующие: программа «загадывает» целое число от 0 до 10, ваша задача — угадать это число с четырех попыток. После каждой неудачно попытки программа дает подсказки: «Больше», если загаданное число больше того, которое указали вы и, соответственно, «Меньше», если загаданное число меньше указанного вами.
Игра «Угадай число» на C#
Итак, попробуем определиться с алгоритмом игры. По правилам игры нам дается четыре попытки угадать число. Переводя эту часть правил на язык программирования, можно сказать, что у нас есть максимум четыре итерации цикла, чтобы угадать число. В цикле нам необходимо выполнить следующие действия:
- попросить игрока ввести число от 0 до 10.
- обработать ввод- перевести строку в число, проверить, что оно не меньше нуля и не больше 10 и, при необходимости, попросить игрока повторить ввод.
- сравнить введенное число с загаданным и выполнить один из трех сценариев игры:
- сообщить, что пользователь угадал число и прервать цикл (смысла дальше просить игрока угадывать число — нет)
- выдать подсказку «Больше»
- выдать подсказку «Меньше»
- если игрок истратил все попытки, то сообщить ему, что число не было угадано
- сообщить игроку, что игра окончена.
Реализуем этот алгоритм в виде консольного приложения на C#. Создадим новый консольный проект C# с названием «GuessTheNumber» и напишем следующий код:
int number = 5; //число, которое загадываем for (int i = 1; i < 5; i++) { Console.Write($"Попытка {i}. Угадай число: "); int n = Convert.ToInt32(Console.ReadLine()); while ((n < 0) || (n > 10)) { Console.WriteLine("Вводите числа не меньше 0 и не больше 10"); Console.Write("Введите число "); n = Convert.ToInt32(Console.ReadLine()); } bool notGuess = n != number; if (notGuess) { if (i == 4) { Console.WriteLine($"Вы проиграли. Было загадано число {number}"); break; } } else { Console.WriteLine("Поздравляю! Вы победили!"); break; } if (n < number) { Console.WriteLine("Больше"); } else { Console.WriteLine("Меньше"); } } Console.WriteLine("GAME OVER");
Разберем этот код подробно. Итак, число, которое загадывает программа хранится в переменной number
:
int number = 5; //число, которое загадываем
Конечно, интереснее было бы, если бы программа сама выбирала число в диапазоне от 0 до 10 без нашего ведома и мы этот момент в конце решения исправим. Пока же, в целях отладки приложения, оставим переменную как есть.
Далее, мы запускаем цикл for в котором каждая итерация цикла — это очередная попытка угадать число — всего таких попыток (итераций) будет 4:
for (int i = 1; i < 5; i++) { //тут код очередной попытки угадать число }
Так как мы точно знаем количество попыток, то цикл for
нам хорошо подходит и, более того, используя его счётчик, мы можем сразу же информировать пользователя о номере попытки, не задействую при этом никаких дополнительных переменных.
Console.Write($"Попытка {i}. Угадай число: ");
Число, которое вводит пользователь, сохраняется в переменной n. После того, как пользователь вводит число — мы его считываем:
Console.Write($"Попытка {i}. Угадай число: "); //тут пользователь должен ввести число n = Convert.ToInt32(Console.ReadLine());//тут мы переводим пользовательский ввод из строки в целое число
и запускаем внутренний цикл while, в котором проверяем — допустимое ли число вводит пользователь. Для этого цикл содержит условие:
(n < 0) || (n > 10)
то есть, наш внутренний цикл while
будет повторяться до тех пор, пока пользователь не введет число больше либо равное нулю и меньше либо равное 10. Если же пользователь сразу задает допустимое число, то цикл не запускается.
Далее мы проверяем — угадал ли пользователь число:
bool notGuess = n != number;
переменная notGuess
будет содержать значение true
, если пользователь не угадал число. Если пользователь не угадал число, то к нас появляется два варианта дальнейших действий:
первый вариант — цикл находится на последней итерации (у пользователя больше нет попыток). В этом случае, мы должны сообщить пользователю о том, что он проиграл и не выполнять больше никаких действий. Этот вариант реализуется вот в этой части кода:
if (i == 4) { Console.WriteLine($"Вы проиграли. Было загадано число {number}"); break; }
мы прерываем цикл и выходим из него.
Второй вариант — попытки угадать число ещё не исчерпаны и мы должны дать пользователю подсказку. Этот вариант реализуется вот в этих условных операторах:
if (n < number) { Console.WriteLine("Больше"); } else { Console.WriteLine("Меньше"); }
если пользователь угадал число, то есть переменная notGuess
равна false
, то мы поздравляем его с победой и также выходим из цикла:
Console.WriteLine("Поздравляю! Вы победили!"); break;
Ну и, раз мы выходим из цикла, то и игра закончена о чем мы и сообщаем пользователю:
Console.WriteLine("GAME OVER");
Проверим работу программы. Ниже на рисунке показан вывод в консоли при трех неудачных попытках и ошибке ввода значений:
Пользователь не смог угадать число:
Теперь, как было сказано выше, добавим в нашу игру «элемент неожиданности» — пусть программа сама загадывает случайное число. Здесь мы забежим вперед, так как работу по генерации случайных чисел мы ещё будем рассматривать подробнее в части «Шифрование, цифровые подписи и хэш-алгоритмы в .NET», поэтому придется принять на веру, что следующий код будет генерировать случайное число в диапазоне от 0 до 10 и оно будет присваиваться переменной number
:
int number = Random.Shared.Next(0, 10); //число, которое загадываем
Теперь можно запустить снова приложение и убедиться, что программа генерирует случайные числа.
Итого
Итак, в этой работе мы применили наши знания по основам C# и написали путь небольшое, но вполне рабочее приложение — игру «Угадай число». Игра вполне рабочая, однако нам ещё есть куда стремиться в её улучшении, поэтому не удаляйте этот код — мы к нему ещё вернемся в следующих главах учебника.