/
expens1ve
/
project_war
Обзор
Документация
Войти
/
expens1ve
/
project_war
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
solid
Engine/GameEngine.cs
76 строк
3 KB
Vadim
add solid vibes
02 июн 2026, 01:09
02 июн 2026, 01:09
573f19e
Код
Авторство
О чём код?
using System; using project_war.Engine.Interfaces; using project_war.Models.Interfaces; namespace project_war.Engine { public class GameEngine : IGameEngine { public event Action<IArmy>? OnGameOver; public event Action<string>? OnDraw; public bool IsGameOver => _army1?.IsDefeated == true || _army2?.IsDefeated == true; public bool IsDraw { get; private set; } private IArmy? _army1; private IArmy? _army2; private IBattlefield? _battlefield; private readonly IDrawDetector _drawDetector; private readonly IBattlefieldFactory _battlefieldFactory; public GameEngine(IBattlefieldFactory battlefieldFactory, IDrawDetector drawDetector) { _battlefieldFactory = battlefieldFactory ?? throw new ArgumentNullException(nameof(battlefieldFactory)); _drawDetector = drawDetector ?? throw new ArgumentNullException(nameof(drawDetector)); IsDraw = false; } public void StartGame(IArmy army1, IArmy army2) { _army1 = army1 ?? throw new ArgumentNullException(nameof(army1)); _army2 = army2 ?? throw new ArgumentNullException(nameof(army2)); _battlefield = _battlefieldFactory.Create(_army1, _army2); _drawDetector.Initialize(_army1, _army2); IsDraw = false; } public void PlayTurn() { if (_battlefield == null) throw new InvalidOperationException("Вызовите StartGame сначала."); if (IsGameOver || IsDraw) return; _battlefield.ResolveCombat(); if (IsGameOver) { IArmy winner = _army1?.IsDefeated == true ? _army2! : _army1!; OnGameOver?.Invoke(winner); return; } // КОНЕЦ РАУНДА - проверяем ничью CheckDrawCondition(); } private void CheckDrawCondition() { if (_army1 == null || _army2 == null) return; if (_drawDetector.CheckDraw(_army1, _army2)) { IsDraw = true; OnDraw?.Invoke($"НИЧЬЯ! {_drawDetector.GetMaxRoundsWithoutDamage()} раундов без изменения здоровья."); } } public IBattlefield? GetBattlefield() => _battlefield; public int GetRoundsWithoutDamage() => _drawDetector.GetRoundsWithoutDamage(); public int GetMaxRoundsWithoutDamage() => _drawDetector.GetMaxRoundsWithoutDamage(); } }