Контрольное задание по главе «Консольные приложения». Доработка игры «Угадай число»

При выполнении контрольного задания по предыдущей главе, мы разработали простенькую игру «Угадай число». Теперь, когда мы разобрались более детально работой класса 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 выдавала бы нам постоянно предупреждение вида:

Преобразование литерала, допускающего значение NULL или возможного значения NULL в тип, не допускающий значение NULL.

Если вам интересно, что означает знак вопроса в конце типа переменной, то можете прочитать вот эту заметку в нашем блоге. Теперь запустите приложение и проверьте его работу. При запуске приложения рядом с 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# и как их применить в своем приложении.

Подписаться
Уведомить о
guest
0 Комментарий
Старые
Новые Популярные
Межтекстовые Отзывы
Посмотреть все комментарии