/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Game/Game.cs
240 строк
10 KB
Zakhar Romashov
синглтон и абстрактная фабрика добавлены
03 июн 2026, 21:55
03 июн 2026, 21:55
99bfdd2
Код
Авторство
О чём код?
using System; using System.Collections.Generic; namespace ArmyBattleGame { class Game { private readonly Random _rnd = new Random(); private readonly GameSaveService _saveService = new GameSaveService(); public void Run() { while (true) { Console.WriteLine(); if (_saveService.HasAnySave()) { ConsoleHelper.WriteLine(" [Есть сохранённые игры]", ConsoleColor.Cyan); Console.WriteLine("0. Настройки игры"); Console.WriteLine("1. Продолжить сохранённую игру"); Console.WriteLine("2. Начать новую игру"); Console.WriteLine("3. Выход"); string? input = ConsoleHelper.ReadChoice(); if (input == "3") return; else if (input == "1") { ShowSavesList(); continue; } else if (input == "2") StartGame(); else if (input == "0") { ShowGameSettingsMenu(); continue; } else ConsoleHelper.Error("Неверный выбор. Введите 0, 1, 2 или 3."); } else { Console.WriteLine("0. Настройки игры"); Console.WriteLine("1. Начать игру"); Console.WriteLine("2. Выход"); string? input = ConsoleHelper.ReadChoice(); if (input == "2") return; else if (input == "1") StartGame(); else if (input == "0") { ShowGameSettingsMenu(); continue; } else ConsoleHelper.Error("Неверный выбор. Введите 0, 1 или 2."); } } } private void ShowSavesList() { List<SaveEntry> saves = _saveService.ListSaves(); if (saves.Count == 0) { ConsoleHelper.Error("Нет доступных сохранений."); return; } Console.WriteLine(); ConsoleHelper.WriteLine(" Сохранённые игры:", ConsoleColor.Cyan); Console.WriteLine(new string('─', 60)); for (int i = 0; i < saves.Count; i++) { var data = saves[i].Data; int army1Count = data.Army1.Count; int army2Count = data.Army2.Count; string strategy = StrategyDisplayName(data.FormationStrategy); ConsoleHelper.Write($" {i + 1}. ", ConsoleColor.White); ConsoleHelper.Write($"{data.SavedAt:dd.MM.yyyy HH:mm}", ConsoleColor.Yellow); Console.Write($" | Ход {data.TurnCounter}"); Console.Write($" | {strategy}"); Console.Write($" | А1: {army1Count} юн."); Console.WriteLine($" | А2: {army2Count} юн."); } Console.WriteLine(new string('─', 60)); Console.WriteLine(" 0. Назад"); string? choice = ConsoleHelper.ReadChoice(); if (choice == "0" || choice == null) return; if (!int.TryParse(choice, out int index) || index < 1 || index > saves.Count) { ConsoleHelper.Error("Неверный выбор."); return; } ResumeGame(saves[index - 1]); } private static string StrategyDisplayName(string? name) => CreateStrategy(name).DisplayName; public static IFormationStrategy CreateStrategy(string? name) => name switch { WideBridgeStrategy.StrategyName => new WideBridgeStrategy(), WallStrategy.StrategyName => new WallStrategy(), _ => new NarrowBridgeStrategy(), }; private void ShowGameSettingsMenu() { while (true) { Console.WriteLine(); Console.WriteLine("=== Настройки игры ==="); Console.WriteLine($"1. Логирование урона: {(GameSettings.Instance.EnableDamageLog ? "Вкл" : "Выкл")}"); Console.WriteLine($"2. Звук смерти: {(GameSettings.Instance.EnableDeathSound ? "Вкл" : "Выкл")}"); Console.WriteLine("0. Назад"); string? choice = ConsoleHelper.ReadChoice(); switch (choice) { case "1": GameSettings.Instance.EnableDamageLog = !GameSettings.Instance.EnableDamageLog; Console.WriteLine($"Логирование урона {(GameSettings.Instance.EnableDamageLog ? "включено" : "выключено")}"); break; case "2": GameSettings.Instance.EnableDeathSound = !GameSettings.Instance.EnableDeathSound; Console.WriteLine($"Звук смерти {(GameSettings.Instance.EnableDeathSound ? "включен" : "выключен")}"); break; case "0": return; default: ConsoleHelper.Error("Неверный выбор. Введите 0, 1 или 2."); break; } } } private void ResumeGame(SaveEntry entry) { GameSaveData? save = _saveService.Load(entry.FilePath); if (save == null) { ConsoleHelper.Error("Не удалось загрузить сохранение."); return; } var strategy = CreateStrategy(save.FormationStrategy); Army army1 = _saveService.DeserializeArmy(save.Army1, strategy); Army army2 = _saveService.DeserializeArmy(save.Army2, strategy); ConsoleHelper.Separator(); ConsoleHelper.WriteLine($" Продолжение с хода {save.TurnCounter} ({strategy.DisplayName})", ConsoleColor.Cyan); // Подключаем наблюдателей до показа армий и начала боя. var observers = new BattleObservers(); observers.Attach(army1); observers.Attach(army2); ArmyRenderer.Print(army1, "Армия 1"); ArmyRenderer.Print(army2, "Армия 2"); var logger = new ConsoleBattleLogger(); var battle = new BattleField(army1, army2, logger, save.TurnCounter, save.IsArmy1Turn, strategy); new BattleController(battle, _saveService, save.Budget, observers, entry.FilePath).Run(); } private void StartGame() { if (File.Exists("damage.log")) File.WriteAllText("damage.log", string.Empty); PrintUnitReference(); Console.Write("Введите стоимость армий: "); if (!double.TryParse(Console.ReadLine(), out double budget)) { ConsoleHelper.Error("Неверное число. Попробуйте снова."); return; } var builder = new ArmyBuilder(budget, _rnd, new StandardUnitFactory()); var army1 = CreateArmy("Армия 1", builder, armyId: 1); var army2 = CreateArmy("Армия 2", builder, armyId: 2); // Подписка наблюдателей до начала боя. var observers = new BattleObservers(); observers.Attach(army1); observers.Attach(army2); var logger = new ConsoleBattleLogger(); var battle = new BattleField(army1, army2, logger); new BattleController(battle, _saveService, budget, observers).Run(); } private Army CreateArmy(string name, ArmyBuilder builder, int armyId) { var army = new Army(); while (true) { Console.WriteLine(); Console.WriteLine($"{name}:"); Console.WriteLine("1. Создать вручную"); Console.WriteLine("2. Создать рандомно"); string? input = ConsoleHelper.ReadChoice(); if (input == "1") { builder.BuildManual(army); foreach (var u in army.AllUnits) u.ArmyId = armyId; return army; } if (input == "2") { builder.BuildRandom(army); foreach (var u in army.AllUnits) u.ArmyId = armyId; ArmyRenderer.Print(army, name); return army; } ConsoleHelper.Error("Неверный выбор. Введите 1 или 2."); } } private static void PrintUnitReference() { Console.WriteLine(); ConsoleHelper.WriteLine("Доступные юниты:", ConsoleColor.Cyan); Console.WriteLine(new string('─', 40)); ConsoleHelper.Write(" HeavyUnit ", ConsoleColor.Yellow); Console.WriteLine($"HP:150 Dmg:20 Щит:80 Цена:{HeavyUnit.BaseCost}"); ConsoleHelper.Write(" LiteUnit ", ConsoleColor.Yellow); Console.WriteLine($"HP:80 Dmg:40 Щит:20 Цена:{LiteUnit.BaseCost}"); ConsoleHelper.Write(" ArcherUnit ", ConsoleColor.Yellow); Console.WriteLine($"HP:90 Dmg:15 Щит:10 Цена:~{ArcherUnit.MinCost:F0}+ (зависит от R/P)"); ConsoleHelper.Write(" HealerUnit ", ConsoleColor.Yellow); Console.WriteLine($"HP:70 Dmg:10 Щит:30 Цена:~{HealerUnit.MinCost:F0}+ (зависит от R/HealP)"); ConsoleHelper.Write(" WizardUnit ", ConsoleColor.Yellow); Console.WriteLine($"HP:60 Dmg:8 Щит:20 Цена:~{WizardUnit.MinCost:F0}+ (зависит от R/Chance)"); ConsoleHelper.Write(" ГуляйГород ", ConsoleColor.Yellow); Console.WriteLine($"HP:{GulyayGorodAdapter.InitialHealth} Dmg:0 Щит:{GulyayGorodAdapter.InitialDefence} Цена:{GulyayGorodAdapter.BaseCost:F0} (нет атаки)"); Console.WriteLine(); } } }