/
expens1ve
/
project_war
Обзор
Документация
Войти
/
expens1ve
/
project_war
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
Persistence
Engine/GameEngine.cs
72 строки
3 KB
Vadim
feat engine logics
26 фев 2026, 03:06
26 фев 2026, 03:06
9e00df4
Код
Авторство
О чём код?
using System; using project_war.Engine.Interfaces; using project_war.Models.Interfaces; namespace project_war.Engine { /// <summary> /// Главный игровой движок. Хранит состояние игры, /// чередует ходы армий и определяет победителя. /// </summary> public class GameEngine : IGameEngine { /// <inheritdoc/> public event Action<IArmy>? OnGameOver; /// <inheritdoc/> public bool IsGameOver => _army1 != null && _army2 != null && (_army1.IsDefeated || _army2.IsDefeated); private IArmy? _army1; private IArmy? _army2; private Battlefield? _battlefield; // true = армия1 атакует, false = армия2 атакует private bool _army1IsAttacking; /// <inheritdoc/> public void StartGame(IArmy army1, IArmy army2) { _army1 = army1 ?? throw new ArgumentNullException(nameof(army1)); _army2 = army2 ?? throw new ArgumentNullException(nameof(army2)); _army1IsAttacking = Random.Shared.NextDouble() > 0.5; // рандомно выбираем кто первый атакует // Создаём поле боя. Начинает атаковать армия 1. _battlefield = new Battlefield(_army1, _army2); } /// <inheritdoc/> public void PlayTurn() { if (_battlefield == null || _army1 == null || _army2 == null) throw new InvalidOperationException( "Игра не инициализирована. Сначала вызовите StartGame."); if (IsGameOver) return; // Переключаем стороны перед каждым ходом if (_army1IsAttacking) _battlefield.SetSides(_army1, _army2); else _battlefield.SetSides(_army2, _army1); _battlefield.ResolveCombat(); // Чередуем атакующую сторону _army1IsAttacking = !_army1IsAttacking; // Проверяем условие победы после хода if (IsGameOver) { IArmy winner = _army1.IsDefeated ? _army2 : _army1; OnGameOver?.Invoke(winner); } } /// <summary> /// Даёт доступ к объекту Battlefield для подписки на его события из Program.cs. /// </summary> public Battlefield? GetBattlefield() => _battlefield; } }