/
expens1ve
/
project_war
Обзор
Документация
Войти
/
expens1ve
/
project_war
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Engine/DrawDetector.cs
165 строк
6 KB
Lawrence_20
Add draw detection after 10 rounds without HP change
29 апр 2026, 01:13
29 апр 2026, 01:13
7b5810d
Код
Авторство
О чём код?
using System; using project_war.Models.Interfaces; namespace project_war.Engine { /// <summary> /// Детектор ничьи для отслеживания изменения суммарного HP армий /// </summary> public class DrawDetector { private const int MAX_ROUNDS_WITHOUT_DAMAGE = 10; private int _roundsWithoutDamage; private int _lastTotalHp; /// <summary> /// Создает новый экземпляр детектора ничьи /// </summary> public DrawDetector() { Reset(); } /// <summary> /// Сбрасывает счетчик и последнее значение HP /// </summary> public void Reset() { _roundsWithoutDamage = 0; _lastTotalHp = 0; } /// <summary> /// Инициализирует начальное состояние (должен быть вызван перед началом боя) /// </summary> /// <param name="army1">Первая армия</param> /// <param name="army2">Вторая армия</param> public void Initialize(IArmy army1, IArmy army2) { _lastTotalHp = CalculateTotalHp(army1, army2); _roundsWithoutDamage = 0; } /// <summary> /// Обрабатывает событие атаки юнита /// </summary> /// <param name="attacker">Атакующий юнит</param> /// <param name="defender">Защищающийся юнит</param> /// <param name="damageDealt">Нанесенный урон</param> /// <param name="army1">Первая армия</param> /// <param name="army2">Вторая армия</param> public void OnUnitAttacked(IUnit attacker, IUnit defender, int damageDealt, IArmy army1, IArmy army2) { if (damageDealt > 0) { UpdateHpChange(army1, army2); } } /// <summary> /// Обрабатывает событие использования способности /// </summary> /// <param name="caster">Юнит, использующий способность</param> /// <param name="target">Цель способности</param> /// <param name="effectValue">Значение эффекта (лечение или урон)</param> /// <param name="army1">Первая армия</param> /// <param name="army2">Вторая армия</param> public void OnSpecialAbilityUsed(IUnit caster, IUnit target, int effectValue, IArmy army1, IArmy army2) { if (effectValue > 0) { UpdateHpChange(army1, army2); } } /// <summary> /// Проверяет, наступила ли ничья /// </summary> /// <param name="army1">Первая армия</param> /// <param name="army2">Вторая армия</param> /// <returns>True, если наступила ничья, иначе False</returns> public bool CheckDraw(IArmy army1, IArmy army2) { int currentTotalHp = CalculateTotalHp(army1, army2); // Если HP изменилось, сбрасываем счетчик if (currentTotalHp != _lastTotalHp) { _roundsWithoutDamage = 0; _lastTotalHp = currentTotalHp; return false; } // Если HP не изменилось, увеличиваем счетчик _roundsWithoutDamage++; // Проверяем достижение лимита if (_roundsWithoutDamage >= MAX_ROUNDS_WITHOUT_DAMAGE) { return true; // Ничья! } return false; } /// <summary> /// Обновляет состояние при изменении HP /// </summary> private void UpdateHpChange(IArmy army1, IArmy army2) { _roundsWithoutDamage = 0; _lastTotalHp = CalculateTotalHp(army1, army2); } /// <summary> /// Вычисляет суммарное HP всех живых юнитов в обеих армиях /// </summary> private int CalculateTotalHp(IArmy army1, IArmy army2) { int totalHp = 0; foreach (var unit in army1.Units) { if (unit.Health > 0) { totalHp += unit.Health; } } foreach (var unit in army2.Units) { if (unit.Health > 0) { totalHp += unit.Health; } } return totalHp; } /// <summary> /// Получает текущий счетчик раундов без урона /// </summary> public int GetRoundsWithoutDamage() { return _roundsWithoutDamage; } /// <summary> /// Получает максимальное количество раундов до ничьи /// </summary> public int GetMaxRoundsWithoutDamage() { return MAX_ROUNDS_WITHOUT_DAMAGE; } /// <summary> /// Получает последнее сохраненное суммарное HP /// </summary> public int GetLastTotalHp() { return _lastTotalHp; } } }