Задача состоит в написании консольной игры "Орёл и Решка". Также необходимо реализовать сбор и вывод статистики бросков. Принцип работы: пользователь дает команду броска монетки и приложение возвращает название "выпавшей" стороны монеты.
Для работы игры нам понадобится создать следующие статические объекты:
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() идет возврат к методу ожидания команды. Постоянным возвратом к методу ожидания реализуется возможность дать игроку самому выбирать, когда продолжить игру, а когда стоит её завершить.