Орёл и Решка


Задача состоит в написании консольной игры "Орёл и Решка". Также необходимо реализовать сбор и вывод статистики бросков. Принцип работы: пользователь дает команду броска монетки и приложение возвращает название "выпавшей" стороны монеты.


Для работы игры нам понадобится создать следующие статические объекты:

static Random rnd = new Random();
static string[] side = new string[2] { "Орёл", "Решка" }; // Стороны монетки
static int numberOfGames, eagle, tails; // Количество игр, выпавших Орлов и Решек

Генератор псевдослучайных чисел (rnd) - главный объект приложения. Именно благодаря ему игрок получает результат "подбрасывания" монетки. Строковый массив (side) хранит 2 стороны монетки, которые могут выпасть в результате подбрасывания. Переменные (numberOfGames, eagle, tails) нужны для записи и последующего вывода статистики по броскам (сколько игр было всего, сколько выпало "орлов", сколько выпало "решек").

При запуске приложения вызывается основной метод Main(), задающий название консольного окна и вызывающий меню игры через метод Menu(), которое содержит необходимые для игры команды.

static void Main(string[] args) // Запуск программы
{
    Console.Title = "Орёл и Решка";
    Menu();
}

static void Menu() // Вывести меню действий
{
    Console.WriteLine("[Любая кнопка] - Сделать бросок.\n[Stat] - Статистика бросков\n[Menu] - Меню действий\n[Exit] - Выход.");
    Waiting();
}

В конце метода Menu() присутствует вызов метода Waiting(), отвечающего за ожидание и считывание дальнейших команд игрока:

static void Waiting() // Ожидание пользовательской команды
{
    switch ((string)Console.ReadLine().ToLower())
    {
        case "menu":
            Menu();
            break;
        case "stat":
            Statistics();
            break;
        case "exit":
            return;
        default:
            Flip();
            break;
    }
}

Как видно из кода, в игре присутствуют 4 команды: вызов меню, вывод статистики, выход из приложения и бросок монетки. Любая последовательность символов приведет к совершению "броска" и выводу его результата на экран, кроме команд "menu", "stat", "exit" - они зарезервированы для выполнения соответствующих действий.

При вызове метода Statistics() происходит вывод на экран собираемой статистики бросков:

static void Statistics() // Вывести статистику бросков
{
    Console.WriteLine("\nВсего\tОрел\tРешка\n{0, -5}\t{1,-4}\t{2,-5}", numberOfGames, eagle, tails);
    Waiting();
}

Метод Flip() отвечает за "подбрасывание" монеты и сбор статистики бросков:

static void Flip() // Сделать бросок
{
    bool sidenum = Convert.ToBoolean(rnd.Next(side.Length));
    Console.WriteLine("Выпадает: " + side[Convert.ToInt32(sidenum)]);

    numberOfGames++;
    if (sidenum) tails++;
    else eagle++;
        
    Waiting();
}

Результат подбрасывания монеты конвертируется в тип Boolean и фиксируется в переменной (sidenum). После этого результат, конвертированный в тип Int32 и выводится на экран. В результате каждого вызова метода Flip() также инкрементируются переменные для сбора статистики. В конце метода Flip() также как в Menu() и Statistics() идет возврат к методу ожидания команды. Постоянным возвратом к методу ожидания реализуется возможность дать игроку самому выбирать, когда продолжить игру, а когда стоит её завершить.