/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Game/BattleController.cs
241 строка
9 KB
Zakhar Romashov
Исправлен баг с id юнита и реализован весь функционал для последнего демо
28 май 2026, 23:32
28 май 2026, 23:32
c35199f
Код
Авторство
О чём код?
using System; namespace ArmyBattleGame { class BattleController { private readonly BattleField _battle; private readonly GameSaveService _saveService; private readonly BattleObservers _observers; private readonly CommandHistory _history; private readonly double _budget; private string? _currentSavePath; public BattleController(BattleField battle, GameSaveService saveService, double budget, BattleObservers observers, string? existingSavePath = null) { _battle = battle; _saveService = saveService; _observers = observers; _budget = budget; _currentSavePath = existingSavePath; _history = new CommandHistory(); _history.SaveInitialState(_battle.CreateMemento(_saveService)); } public void Run() { while (true) { Console.WriteLine(); ConsoleHelper.WriteLine($"Текущее построение: {_battle.CurrentStrategy.DisplayName}", ConsoleColor.DarkCyan); Console.WriteLine("1. Сделать один ход"); Console.WriteLine("2. Доиграть бой до конца"); Console.WriteLine("3. Вывести состояние"); Console.WriteLine("4. Сменить построение"); Console.WriteLine("5. Выход (сохранить и выйти)"); string undoLabel = _history.CanUndo ? "Отменить ход" : "Отменить ход [нет доступных ходов]"; string redoLabel = _history.CanRedo ? "Повторить ход" : "Повторить ход [нет отменённых ходов]"; ConsoleHelper.WriteLine($"6. {undoLabel}", _history.CanUndo ? ConsoleColor.White : ConsoleColor.DarkGray); ConsoleHelper.WriteLine($"7. {redoLabel}", _history.CanRedo ? ConsoleColor.White : ConsoleColor.DarkGray); Console.WriteLine("8. Отбросить в начало боя"); string? input = ConsoleHelper.ReadChoice(); if (input == "5") { Autosave(); ConsoleHelper.WriteLine("Игра сохранена.", ConsoleColor.Cyan); return; } else if (input == "1") { var cmd = new MakeMoveCommand(_battle, _history, _saveService); cmd.Execute(); if (!cmd.BattleContinues) { DeleteCurrentSave(); _battle.DeclareWinner(); PostBattleMenu(); return; } Autosave(); } else if (input == "2") { DeleteCurrentSave(); _battle.FightToEnd(); PostBattleMenu(); return; } else if (input == "3") { ConsoleHelper.Separator(); ArmyRenderer.Print(_battle.Army1, "Армия 1"); ArmyRenderer.Print(_battle.Army2, "Армия 2"); } else if (input == "4") { ChangeFormationMenu(); } else if (input == "6") { HandleUndo(); } else if (input == "7") { HandleRedo(); } else if (input == "8") { HandleReset(); } else { ConsoleHelper.Error("Неверный выбор. Введите число от 1 до 8."); } } } private void HandleUndo() { var current = _battle.CreateMemento(_saveService); var target = _history.Undo(current); if (target == null) { ConsoleHelper.Error("Нет доступных ходов для отмены."); return; } RestoreTo(target); ConsoleHelper.WriteLine($"Ход отменён. Текущий ход: {_battle.TurnCounter}", ConsoleColor.Yellow); Autosave(); } private void HandleRedo() { var current = _battle.CreateMemento(_saveService); var target = _history.Redo(current); if (target == null) { ConsoleHelper.Error("Нет отменённых ходов для повтора."); return; } RestoreTo(target); ConsoleHelper.WriteLine($"Ход повторён. Текущий ход: {_battle.TurnCounter}", ConsoleColor.Yellow); Autosave(); } private void HandleReset() { var target = _history.Reset(); if (target == null) { ConsoleHelper.Error("Начальное состояние недоступно."); return; } RestoreTo(target); ConsoleHelper.WriteLine("Бой сброшен в начальное состояние.", ConsoleColor.Yellow); ArmyRenderer.Print(_battle.Army1, "Армия 1"); ArmyRenderer.Print(_battle.Army2, "Армия 2"); Autosave(); } // Восстанавливает поле боя из снапшота с переподпиской наблюдателей. private void RestoreTo(BattleFieldMemento memento) { _observers.Detach(_battle.Army1); _observers.Detach(_battle.Army2); _battle.RestoreFromMemento(memento, _saveService); _observers.Attach(_battle.Army1); _observers.Attach(_battle.Army2); } private void ChangeFormationMenu() { Console.WriteLine(); ConsoleHelper.WriteLine("=== Сменить построение ===", ConsoleColor.Cyan); Console.WriteLine($"1. {new NarrowBridgeStrategy().DisplayName}"); Console.WriteLine($"2. {new WideBridgeStrategy().DisplayName}"); Console.WriteLine($"3. {new WallStrategy().DisplayName}"); Console.WriteLine("0. Отмена"); string? input = ConsoleHelper.ReadChoice(); IFormationStrategy? newStrategy = input switch { "1" => new NarrowBridgeStrategy(), "2" => new WideBridgeStrategy(), "3" => new WallStrategy(), _ => null }; if (newStrategy == null) { if (input != "0") ConsoleHelper.Error("Неверный выбор."); return; } var cmd = new ChangeFormationCommand(_battle, _history, _saveService, newStrategy); cmd.Execute(); ConsoleHelper.WriteLine($"Построение изменено: {newStrategy.DisplayName}", ConsoleColor.Green); ArmyRenderer.Print(_battle.Army1, "Армия 1"); ArmyRenderer.Print(_battle.Army2, "Армия 2"); Autosave(); } private void PostBattleMenu() { while (true) { Console.WriteLine(); Console.WriteLine("1. Посмотреть состояние армий"); Console.WriteLine("0. Выйти в главное меню"); string? input = ConsoleHelper.ReadChoice(); if (input == "0" || input == null) return; if (input == "1") { ConsoleHelper.Separator(); ArmyRenderer.Print(_battle.Army1, "Армия 1"); ArmyRenderer.Print(_battle.Army2, "Армия 2"); } else { ConsoleHelper.Error("Неверный выбор. Введите 1 или 0."); } } } private void Autosave() { var saveData = new GameSaveData { Budget = _budget, TurnCounter = _battle.TurnCounter, IsArmy1Turn = _battle.IsArmy1Turn, FormationStrategy = _battle.CurrentStrategy.Name, Army1 = _saveService.SerializeArmy(_battle.Army1), Army2 = _saveService.SerializeArmy(_battle.Army2), }; if (_currentSavePath != null && System.IO.File.Exists(_currentSavePath)) _saveService.Overwrite(_currentSavePath, saveData); else _currentSavePath = _saveService.Save(saveData); } private void DeleteCurrentSave() { if (_currentSavePath != null) _saveService.DeleteSave(_currentSavePath); } } }