Содержание
При выполнении контрольного задания по предыдущей главе, мы разработали простенькую игру «Угадай число». Теперь, когда мы разобрались более детально работой класса Console
, мы можем доработать нашу игру и сделать ей немного красивее и функциональнее. В этом контрольном задании мы будем применять как знания полученные в текущей части, так и в предыдущей. Задание будет состоять из двух частей: 1) улучшить визуальный интерфейс игры и, используя цветовое оформление текста, разделить пользовательский ввод, сообщение о недопустимом значении введенного пользователем числа, запросы программы на ввод числа, а также сообщения о победе, проигрыше и об окончании игры. 2) обеспечить следующую работу программы: если рядом с exe-файлом программы находится файл number.txt, то программа должна считать из этого файла значение угадываемого числа, иначе — сгенерировать случайное число от 0 до 10. 3) игра должна повторяться до тех пор, пока пользователь не напишет в конце очередного раунда слово «Stop»
Исходный код игры «Угадай число»
Вот такой исходный код был написан нами при выполнении предыдущего контрольного задания:
int number = Random.Shared.Next(0, 10); //число, которое загадываем 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");
Этот исходный код мы будем дорабатывать.
Доработка игры «Угадай число»
Оформление текста в консоли
Начнем с самого простого — украсим наше приложение, используя различные цвета текста в консоли. Для этого определимся с цветовой схемой, а именно:
- пользовательский ввод — желтый цвет,
- сообщение о недопустимом значении введенного пользователем числа — красный цвет,
- запросы программы на ввод числа — синий цвет,
- сообщения о победе — зеленый цвет,
- сообщения о проигрыше — красный цвет
- сообщения об окончании игры — белый цвет
Применим нашу цветовую схему в приложении. Для этого просто воспользуемся свойством Console.ForegroundColor
следующим образом:
int number = Random.Shared.Next(0, 10); //число, которое загадываем for (int i = 1; i < 5; i++) { Console.ForegroundColor = ConsoleColor.Blue; Console.Write($"Попытка {i}. Угадай число: "); //тут пользователь должен ввести число Console.ForegroundColor= ConsoleColor.Yellow; int n = Convert.ToInt32(Console.ReadLine());//тут мы переводим пользовательский ввод из строки в целое число while ((n < 0) || (n > 10)) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine("Вводите числа не меньше 0 и не больше 10"); Console.ForegroundColor = ConsoleColor.Blue; Console.Write("Введите число "); Console.ForegroundColor = ConsoleColor.Yellow; n = Convert.ToInt32(Console.ReadLine()); } bool notGuess = n != number; if (notGuess) { if (i == 4) { Console.ForegroundColor = ConsoleColor.Red; Console.WriteLine($"Вы проиграли. Было загадано число {number}"); break; } } else { Console.ForegroundColor = ConsoleColor.Green; Console.WriteLine("Поздравляю! Вы победили!"); break; } Console.ForegroundColor = ConsoleColor.White; if (n < number) { Console.WriteLine("Больше"); } else { Console.WriteLine("Меньше"); } } Console.ForegroundColor = ConsoleColor.White; Console.WriteLine("GAME OVER"); Console.ReadKey();
В этих изменениях. в принципе, нет ничего сложного — просто в необходимый момент мы присваиваем свойству Console.ForegroundColor
необходимое значение. Например:
Console.ForegroundColor = ConsoleColor.Blue; //строка ниже будет выводится синим цветом Console.Write($"Попытка {i}. Угадай число: "); Console.ForegroundColor= ConsoleColor.Yellow; //меняем цвет на желтый - теперь пользователь будет использовать для ввода этот цвет
Можно запустить приложение и убедиться, что наша игра стала немного красивее визуально:Теперь перейдем ко второй задаче. Здесь нам необходимо будет обеспечить перенаправление потока ввода.
Перенаправление потока ввода в консоли
Как мы знаем, при необходимости, мы можем перенаправить потоки ввода/вывода консоли и производить чтение/запись не в окно консоли, а, например, в файл. В нашем случае, нам необходимо перенаправить поток ввода на файл с именем «number.txt». Добавьте перед циклом for следующие строки кода:
int number; //число, которое загадываем string inFile = @"number.txt"; TextReader oldIn = Console.In; FileStream inputStream; inputStream = File.Open(inFile, FileMode.OpenOrCreate); using StreamReader reader = new(inputStream); Console.SetIn(reader); string? numString = Console.ReadLine(); if (string.IsNullOrEmpty(numString)) //если строка пустая (в файле ничего нет) number = Random.Shared.Next(0, 10); //генерируем случайное число else number = Convert.ToInt32(numString); //получаем число из файла Console.SetIn(oldIn); //возвращаем поток ввода к значению по умолчанию //здесь цикл for
Большая часть этого кода полностью соответствует примеру из этой части учебника — здесь мы перенаправляем поток ввода на файл
tring inFile = @"number.txt"; TextReader oldIn = Console.In; //сохраняем текущее значение FileStream inputStream; inputStream = File.Open(inFile, FileMode.OpenOrCreate); using StreamReader reader = new(inputStream); Console.SetIn(reader); //перенаправляем поток ввода
пытаемся прочитать строку, содержащую число:
string? numString = Console.ReadLine(); if (string.IsNullOrEmpty(numString)) //если строка пустая (в файле ничего нет) number = Random.Shared.Next(0, 10); //генерируем случайное число else number = Convert.ToInt32(numString); //получаем число из файла
и возвращаем поток ввода в значение по умолчанию, чтобы пользователь снова мог вводить в окно консоли данные:
Console.SetIn(oldIn); //возвращаем поток ввода к значению по умолчанию
В этой части кода мы использовали тип переменной, с которым ранее не были знакомы:
string? numString
обратите внимание на знак вопроса в конце типа. В принципе, программа работала бы и с обычной переменной типа string, но Visual Studio выдавала бы нам постоянно предупреждение вида:
Если вам интересно, что означает знак вопроса в конце типа переменной, то можете прочитать вот эту заметку в нашем блоге. Теперь запустите приложение и проверьте его работу. При запуске приложения рядом с exe-файлом будет создан пустой текстовый файл:

Теперь можно в него записать число и убедиться, что программа при запуске берет его из файла и использует в своей работе.
Организация повтора игры
Последний пункт, касающийся доработки нашей игры заключается в том, чтобы позволить пользователю продолжать игру до тех пор, пока он не наберет в консоли слово «Stop». Очевидно, что в этом случае, каждый раунд игры (1 раунд = 4 попытки угадать число») должен располагаться внутри цикла, условием выхода из которого должно быть значение переменной типа string
равное строке «Stop». Организуем такой цикл:
string stop = ""; do { //ТУТ КОД РАУНДА ИГРЫ Console.ForegroundColor = ConsoleColor.DarkRed; Console.WriteLine("Сыграем ещё раз? Для того, чтобы закончить игру, наберите слово \"Stop\". Для продолжение нажмите Enter"); stop = Console.ReadLine(); Console.ForegroundColor = ConsoleColor.White; } while (stop != "Stop"); Console.WriteLine("GAME OVER");
В исходном коде выше показаны только изменение, которые мы вносим, чтобы сделать повтор игры. Здесь мы используем цикл do..while, чтобы «зациклить» игру. Значение переменной stop проверяется после каждой итерации цикла и игра заканчивается как только пользователь наберет заданной слово. Стоит отметить, что слово должно набираться сейчас с учётом регистра, то есть «stop» и «Stop» для игры — это разные слова. Если вы хотите, чтобы строка проверялась без учёта регистра, то можете изменить условие цикла следующим образом:
while (stop.ToLower() != "stop");
Теперь будет неважно как пользователь наберет слово: хоть так «Stop», хоть так — «StOp» — программа переведет строку в нижний регистр и проверит соответствие. Про методы работы со строками в C# мы поговорим в отдельной части учебника. Теперь можете запустить приложение и убедиться, что игра не останавливается и повторяется пока мы сами не закончим её:
Итого
Итак, теперь наша игра стала более красивой и может продолжаться сколько угодно, пока мы её сами не остановим. При этом, исходный код программы стал больше, а ориентироваться в нем становится всё сложнее. И, если мы захотим дальше развивать игру, то нам придётся каким-либо образом структурировать исходный код. Поэтому в следующей части учебника мы разберемся с тем, что из себя представляют методы в C# и как их применить в своем приложении.