/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Core/BattleField.cs
141 строка
5 KB
Zakhar Romashov
Исправлен баг с id юнита и реализован весь функционал для последнего демо
28 май 2026, 23:32
28 май 2026, 23:32
c35199f
Код
Авторство
О чём код?
using System; using System.Collections.Generic; namespace ArmyBattleGame { class BattleField { public Army Army1 { get; } public Army Army2 { get; } private readonly IBattleLogger _logger; private bool _isArmy1Turn = true; private int _turnCounter = 1; // Текущая стратегия построения (паттерн Strategy). // Может быть заменена в любой момент через ChangeStrategy. public IFormationStrategy CurrentStrategy { get; private set; } public bool IsArmy1Turn => _isArmy1Turn; public int TurnCounter => _turnCounter; public BattleField(Army army1, Army army2, IBattleLogger logger, IFormationStrategy? strategy = null) { Army1 = army1; Army2 = army2; _logger = logger; CurrentStrategy = strategy ?? new NarrowBridgeStrategy(); foreach (var u in Army1.AllUnits) u.ArmyId = 1; foreach (var u in Army2.AllUnits) u.ArmyId = 2; // Гарантируем, что обе армии в нужном формате. CurrentStrategy.Rebuild(Army1); CurrentStrategy.Rebuild(Army2); } public BattleField(Army army1, Army army2, IBattleLogger logger, int turnCounter, bool isArmy1Turn, IFormationStrategy? strategy = null) : this(army1, army2, logger, strategy) { _turnCounter = turnCounter; _isArmy1Turn = isArmy1Turn; } // Сменить стратегию: перепостроить обе армии под новый формат. public void ChangeStrategy(IFormationStrategy newStrategy) { CurrentStrategy = newStrategy; newStrategy.Rebuild(Army1); newStrategy.Rebuild(Army2); } public bool MakeMove() { if (!Army1.HasAliveUnits || !Army2.HasAliveUnits) return false; ConsoleHelper.Separator(); ConsoleHelper.WriteLine($"===== Ход {_turnCounter} ({CurrentStrategy.DisplayName}) =====", ConsoleColor.White); // Фаза 1: рукопашный бой по правилам стратегии. CurrentStrategy.ExecuteMeleePhase(this, _logger); _isArmy1Turn = !_isArmy1Turn; if (!Army1.HasAliveUnits || !Army2.HasAliveUnits) return false; // Фаза 2: специальные способности. CurrentStrategy.ExecuteSpecialsPhase(this, _logger); _turnCounter++; return Army1.HasAliveUnits && Army2.HasAliveUnits; } // --- Паттерн Memento: снапшоты для Undo/Redo --- // Создать снапшот текущего состояния поля боя (in-memory, без записи на диск). public BattleFieldMemento CreateMemento(GameSaveService saveService) { return new BattleFieldMemento(new GameSaveData { TurnCounter = _turnCounter, IsArmy1Turn = _isArmy1Turn, FormationStrategy = CurrentStrategy.Name, Army1 = saveService.SerializeArmy(Army1), Army2 = saveService.SerializeArmy(Army2), }); } // Восстановить состояние поля боя из снапшота. // Вызывающая сторона отвечает за переподписку наблюдателей // (BattleController делает Detach → RestoreFromMemento → Attach). public void RestoreFromMemento(BattleFieldMemento memento, GameSaveService saveService) { var state = memento.State; CurrentStrategy = Game.CreateStrategy(state.FormationStrategy); var units1 = new List<IUnit>(); foreach (var d in state.Army1) units1.Add(UnitFactory.CreateFromSave(d)); var units2 = new List<IUnit>(); foreach (var d in state.Army2) units2.Add(UnitFactory.CreateFromSave(d)); Army1.RebuildFromFlat(units1, CurrentStrategy.ColumnCountFor(units1.Count)); Army2.RebuildFromFlat(units2, CurrentStrategy.ColumnCountFor(units2.Count)); foreach (var u in Army1.AllUnits) u.ArmyId = 1; foreach (var u in Army2.AllUnits) u.ArmyId = 2; _turnCounter = state.TurnCounter; _isArmy1Turn = state.IsArmy1Turn; } public void FightToEnd() { while (MakeMove()) { } DeclareWinner(); } public void DeclareWinner() { Console.WriteLine(); ConsoleHelper.WriteLine("===== БОЙ ОКОНЧЕН =====", ConsoleColor.White); if (Army1.HasAliveUnits && !Army2.HasAliveUnits) ConsoleHelper.WriteLine("Победила Армия 1!", ConsoleColor.Green); else if (Army2.HasAliveUnits && !Army1.HasAliveUnits) ConsoleHelper.WriteLine("Победила Армия 2!", ConsoleColor.Green); else ConsoleHelper.WriteLine("Ничья! Все погибли!", ConsoleColor.Yellow); Console.WriteLine(); } } }