/
Yaroslav4444-bauer
/
ArmyFight
Обзор
Документация
Войти
/
Yaroslav4444-bauer
/
ArmyFight
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Program.cs
386 строк
16 KB
Yaroslav4444-bauer
Добовлены комментарии summary
01 июн 2026, 12:38
01 июн 2026, 12:38
70196b7
Код
Авторство
О чём код?
namespace ArmyFight { /// <summary> /// Консольная точка входа: главное меню, настройка и запуск игры. /// </summary> class Program { /// <summary> /// Точка входа консольного приложения. /// </summary> static void Main() { ShowMainMenu(); } /// <summary> /// Отображает главное меню и обрабатывает выбор пользователя. /// </summary> public static void ShowMainMenu() { Console.OutputEncoding = System.Text.Encoding.UTF8; Console.Clear(); Console.WriteLine("═══════════════════════════════"); Console.WriteLine(" ARMY FIGHTING SIMULATOR"); Console.WriteLine("═══════════════════════════════"); Console.WriteLine("1. Новая игра"); Console.WriteLine("2. Быстрая игра"); Console.WriteLine("3. Загрузить игру"); Console.WriteLine("4. Выход"); Console.WriteLine(); Console.Write("Выберете действие (1-4): "); var choice = Console.ReadLine(); switch (choice) { case "1": StartNewGame(); break; case "2": StartQuickGame(); break; case "3": LoadSavedGameMenu(); break; case "4": Console.WriteLine("\nСпасибо за игру!"); return; default: LogMessage("Некорректный выбор. Пожалуйста, попробуйте ещё раз."); ShowMainMenu(); break; } } /// <summary> /// Запускает новую игру с полной настройкой армий. /// </summary> static void StartNewGame() { Console.Clear(); Console.WriteLine("Начинаем новую игру...\n"); var setupInvoker = new CommandInvoker(); int cost = AskArmiesCost(); setupInvoker.Execute(new SetArmiesCostCommand(cost)); Console.WriteLine($"Стоимость армий установлена - {ArmyStatements.ARMIES_COST}"); Console.WriteLine(); string strategy = AskBattleStrategy(); setupInvoker.Execute(new SetBattleStrategyCommand(strategy)); double speed = AskShowStepsSpeed(); setupInvoker.Execute(new SetShowStepsSpeedCommand(speed)); LogSpeed(speed); var game = new Game(); Console.WriteLine("Строим армию 1..."); ChoosingMethodForInitializingArmies(game, 1, setupInvoker); Console.WriteLine("Построение армии 1 окончено!"); Console.WriteLine(); Console.WriteLine("Строим армию 2..."); ChoosingMethodForInitializingArmies(game, 2, setupInvoker); Console.WriteLine("Построение армии 2 окончено!"); game.ShowArmies(); bool showBySteps = AskGameOutputMode(); setupInvoker.Execute(new SetGameOutputModeCommand(game, showBySteps)); GameRunActions(game); AfterGameActions(); } /// <summary> /// Запускает быструю игру со случайным составом армий. /// </summary> static void StartQuickGame() { Console.Clear(); Console.WriteLine("Быстрая игра — армии собираются случайно!\n"); var setupInvoker = new CommandInvoker(); int cost = AskArmiesCost(); setupInvoker.Execute(new SetArmiesCostCommand(cost)); Console.WriteLine($"Стоимость армий установлена - {ArmyStatements.ARMIES_COST}"); Console.WriteLine(); string strategy = AskBattleStrategy(); setupInvoker.Execute(new SetBattleStrategyCommand(strategy)); double speed = AskShowStepsSpeed(); setupInvoker.Execute(new SetShowStepsSpeedCommand(speed)); LogSpeed(speed); var game = new Game(); setupInvoker.Execute(new InitializeArmyCommand(game, 1, "fullyrandom")); setupInvoker.Execute(new InitializeArmyCommand(game, 2, "fullyrandom")); Console.WriteLine("Армии случайно укомплектованы!"); game.ShowArmies(); bool showBySteps = AskGameOutputMode(); setupInvoker.Execute(new SetGameOutputModeCommand(game, showBySteps)); GameRunActions(game); AfterGameActions(); } /// <summary> /// Запрашивает способ формирования армии и выполняет соответствующие команды. /// </summary> /// <param name="game">Экземпляр игры.</param> /// <param name="armyNumber">Номер армии (1 или 2).</param> /// <param name="setupInvoker">Инвокер команд настройки.</param> static void ChoosingMethodForInitializingArmies(Game game, int armyNumber, CommandInvoker setupInvoker) { Console.WriteLine(); Console.WriteLine($"Способы построения армии {armyNumber}:"); Console.WriteLine("1. Рандомно"); Console.WriteLine("2. Вручную"); Console.WriteLine("3. Полный рандом"); Console.WriteLine(); Console.Write("Выберите способ: "); var choice = Console.ReadLine(); switch (choice) { case "1": setupInvoker.Execute(new SetUnitCountsCommand(game, armyNumber)); setupInvoker.Execute(new InitializeArmyCommand(game, armyNumber, "random")); break; case "2": setupInvoker.Execute(new SetUnitCountsCommand(game, armyNumber)); setupInvoker.Execute(new InitializeArmyCommand(game, armyNumber, "manual")); break; case "3": setupInvoker.Execute(new InitializeArmyCommand(game, armyNumber, "fullyrandom")); break; default: LogMessage("Некорректный выбор. Пожалуйста, попробуйте ещё раз."); ChoosingMethodForInitializingArmies(game, armyNumber, setupInvoker); break; } } /// <summary> /// Запрашивает у пользователя бюджет армий. /// </summary> /// <returns>Стоимость армий.</returns> private static int AskArmiesCost() { Console.Write("Введите стоимость армий (Enter - 100): "); string input = Console.ReadLine() ?? ""; return string.IsNullOrEmpty(input) ? ArmyStatements.ARMIES_COST : input.ValidateReadNumber(1, ArmyStatements.MAX_ARMY_COST); } /// <summary> /// Запрашивает режим боя. /// </summary> /// <returns>Ключ стратегии боя.</returns> private static string AskBattleStrategy() { Console.WriteLine(); Console.WriteLine("Режимы боя:"); Console.WriteLine("1. Колонна 1 на 1"); Console.WriteLine("2. Колонна 3 на 3"); Console.WriteLine("3. Шеренга на шеренгу"); Console.WriteLine(); Console.Write("Выберите режим (Enter - 1 на 1): "); var choice = Console.ReadLine(); if (string.IsNullOrEmpty(choice) || choice == "1") return GameStatements.BATTLE_STRATEGY_NAME; return choice switch { "2" => "3to3", "3" => "linetoline", _ => AskBattleStrategyWithError() }; } /// <summary> /// Повторно запрашивает режим боя после некорректного ввода. /// </summary> /// <returns>Ключ стратегии боя.</returns> private static string AskBattleStrategyWithError() { LogMessage("Некорректный выбор. Пожалуйста, попробуйте ещё раз."); return AskBattleStrategy(); } /// <summary> /// Запрашивает скорость пошагового вывода. /// </summary> /// <returns>Множитель скорости пауз.</returns> private static double AskShowStepsSpeed() { Console.Write("Укажите скорость вывода ходов (0 - 1000; 1/Enter - дефолтная, 0 - без задержек): "); string input = Console.ReadLine() ?? ""; if (string.IsNullOrEmpty(input) || input == "1") return 1.0; return input.ValidateSpeedOutput(); } /// <summary> /// Выводит в консоль установленную скорость вывода ходов. /// </summary> /// <param name="speed">Множитель скорости.</param> private static void LogSpeed(double speed) { Console.Write("Скорость вывода игровых действий установлена - "); Console.WriteLine(speed == 0 ? "без задержек" : $"{speed}X"); Console.WriteLine(); } /// <summary> /// Запрашивает режим вывода игры (пошаговый или полный). /// </summary> /// <returns>true — пошаговый режим.</returns> private static bool AskGameOutputMode() { Console.WriteLine(); Console.WriteLine("Режимы вывода игры:"); Console.WriteLine("1. Пошаговый"); Console.WriteLine("2. Полный вывод ходов"); Console.WriteLine(); Console.Write("Выберите режим: "); var choice = Console.ReadLine(); return choice switch { "1" => true, "2" => false, _ => AskGameOutputModeWithError() }; } /// <summary> /// Повторно запрашивает режим вывода после некорректного ввода. /// </summary> /// <returns>true — пошаговый режим.</returns> private static bool AskGameOutputModeWithError() { LogMessage("Некорректный выбор. Пожалуйста, попробуйте ещё раз."); return AskGameOutputMode(); } /// <summary> /// Запускает основной цикл боя или завершает при пустых армиях. /// </summary> /// <param name="game">Экземпляр игры.</param> private static void GameRunActions(Game game) { if (game.BattleField.Army1.Infantrymen.Count == 0 && game.BattleField.Army2.Infantrymen.Count == 0) { LogMessage("Бюджет слишком мал, никто не пришёл. Ничья!"); ShowMainMenu(); return; } Console.WriteLine("\nНажмите на кнопку для продолжения..."); Console.ReadKey(); game.Run(); } /// <summary> /// Сбрасывает настройки после окончания игры и возвращает в главное меню. /// </summary> private static void AfterGameActions() { Console.WriteLine("Игра окончена! Ещё разок?"); ArmyStatements.ResetArmiesCost(); GameStatements.ResetBattleStrategy(); PauseTime.ResetPauseTime(); Console.WriteLine("\nНажмите на кнопку для продолжения..."); Console.ReadKey(); ShowMainMenu(); } /// <summary> /// Выводит сообщение и ожидает нажатия клавиши. /// </summary> /// <param name="message">Текст сообщения.</param> public static void LogMessage(string message) { Console.WriteLine($"\n{message}"); Console.WriteLine("Нажмите на кнопку для продолжения..."); Console.ReadKey(); } /// <summary> /// Отображает список сохранений и загружает выбранную игру. /// </summary> public static void LoadSavedGameMenu() { var saveFiles = SaveManager.Instance.GetSaveFiles(); if (saveFiles.Count == 0) { LogMessage("Нет сохранённых файлов!"); ShowMainMenu(); return; } Console.WriteLine("═══════════════════════════════"); Console.WriteLine(" ЗАГРУЗКА ИГРЫ"); Console.WriteLine("═══════════════════════════════"); Console.WriteLine("Доступные сохранения:"); for (int i = 0; i < saveFiles.Count; i++) { var save = saveFiles[i]; Console.WriteLine($"{i + 1}. {save.SaveName} ({save.SaveTime:yyyy-MM-dd HH:mm})"); } Console.WriteLine($"{saveFiles.Count + 1}. Вернуться в главное меню"); Console.Write($"\nВыберете номер сохранения (1-{saveFiles.Count + 1}): "); var choiceStr = Console.ReadLine() ?? ""; int choice = choiceStr.ValidateReadNumber(1, saveFiles.Count + 1); if (choice == saveFiles.Count + 1) { ShowMainMenu(); return; } var selectedSave = saveFiles[choice - 1]; string filePath = selectedSave.FilePath ?? string.Empty; var loadedGame = SaveManager.Instance.LoadGame(filePath); if (loadedGame != null) { LogMessage("Игра загружена успешно!"); double speed = AskShowStepsSpeed(); var setupInvoker = new CommandInvoker(); setupInvoker.Execute(new SetShowStepsSpeedCommand(speed)); LogSpeed(speed); bool showBySteps = AskGameOutputMode(); setupInvoker.Execute(new SetGameOutputModeCommand(loadedGame, showBySteps)); loadedGame.Run(); AfterGameActions(); } else { LogMessage("Не удалось загрузить игру."); ShowMainMenu(); } } } }