/
romashov.z
/
PPAGame
Обзор
Документация
Войти
/
romashov.z
/
PPAGame
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Game/ArmyBuilder.cs
136 строк
5 KB
Zakhar Romashov
синглтон и абстрактная фабрика добавлены
03 июн 2026, 21:55
03 июн 2026, 21:55
99bfdd2
Код
Авторство
О чём код?
using System; using System.Collections.Generic; namespace ArmyBattleGame { class ArmyBuilder { private readonly double _budget; private readonly Random _rnd; private readonly IUnitFactory _factory; public ArmyBuilder(double budget, Random rnd, IUnitFactory factory) { _budget = budget; _rnd = rnd; _factory = factory; } public void BuildManual(Army army) { double currentCost = 0; while (currentCost < _budget) { Console.WriteLine($"\nТекущая стоимость: {currentCost:F1}/{_budget}"); Console.WriteLine($"1. HeavyUnit ({HeavyUnit.BaseCost})"); Console.WriteLine($"2. LiteUnit ({LiteUnit.BaseCost})"); Console.WriteLine($"3. Archer (рандомные Range и Power)"); Console.WriteLine($"4. Healer (рандомные Range и HealPower)"); Console.WriteLine($"5. Wizard (рандомные Range и CloneChance)"); Console.WriteLine($"6. Гуляй-город (HP:{GulyayGorodAdapter.InitialHealth}, Щит:{GulyayGorodAdapter.InitialDefence}, Цена:{GulyayGorodAdapter.BaseCost})"); Console.WriteLine("0. Завершить"); string? input = ConsoleHelper.ReadChoice(); if (string.IsNullOrWhiteSpace(input) || input == "0") break; IUnit? unit = CreateUnitFromInput(input); if (unit == null) { ConsoleHelper.Error("Неверный выбор. Введите 0–6."); continue; } if (currentCost + unit.Cost > _budget) { ConsoleHelper.Error("Недостаточно бюджета!"); continue; } PrintManualUnitAdded(unit); army.AddUnit(unit); currentCost += unit.Cost; } } public void BuildRandom(Army army) { double currentCost = 0; while (true) { double remaining = _budget - currentCost; var available = new List<Func<IUnit>>(); if (HeavyUnit.BaseCost <= remaining) available.Add(_factory.CreateHeavy); if (LiteUnit.BaseCost <= remaining) available.Add(_factory.CreateLite); if (ArcherUnit.MinCost <= remaining) available.Add(() => _factory.CreateArcher(_rnd)); if (HealerUnit.MinCost <= remaining) available.Add(() => _factory.CreateHealer(_rnd)); if (WizardUnit.MinCost <= remaining) available.Add(() => _factory.CreateWizard(_rnd)); if (GulyayGorodAdapter.BaseCost <= remaining) available.Add(_factory.CreateGulyayGorod); if (available.Count == 0) break; var unit = available[_rnd.Next(available.Count)](); if (unit.Cost > remaining) continue; army.AddUnit(unit); currentCost += unit.Cost; } } private IUnit? CreateUnitFromInput(string? input) { return input switch { "1" => _factory.CreateHeavy(), "2" => _factory.CreateLite(), "3" => _factory.CreateArcher(_rnd), "4" => _factory.CreateHealer(_rnd), "5" => _factory.CreateWizard(_rnd), "6" => _factory.CreateGulyayGorod(), _ => null }; } private static void PrintManualUnitAdded(IUnit unit) { switch (unit) { case ArcherUnit a: Console.WriteLine( $"\nСоздан лучник: Range={a.Range}, Power={a.Power:F1}, Цена={unit.Cost:F1}"); break; case HealerUnit h: Console.WriteLine( $"\nСоздан хилер: Range={h.Range}, HealPower={h.HealPower:F1}, Цена={unit.Cost:F1}"); break; case WizardUnit w: Console.WriteLine( $"\nСоздан маг: Range={w.Range}, CloneChance={w.CloneChance * 100:F0}%, Цена={unit.Cost:F1}"); break; case GulyayGorodAdapter: Console.WriteLine( $"\nСоздан Гуляй-город: HP={GulyayGorodAdapter.InitialHealth}, Щит={GulyayGorodAdapter.InitialDefence}, Цена={unit.Cost:F1}"); break; } } } }