Advertisement
vovanhik_24

#47

Apr 15th, 2024 (edited)
103
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.22 KB | None | 0 0
  1.     class Program
  2.     {
  3.         static void Main(string[] args)
  4.         {
  5.             Battleground battleground = new Battleground();
  6.             battleground.ConductBattle();
  7.         }
  8.     }
  9.  
  10.     public class Soldier
  11.     {
  12.         public int Health { get; protected set; }
  13.         public int Damage { get; protected set; }
  14.         public int Armor { get; protected set; }
  15.         public bool IsAlive { get; protected set; }
  16.  
  17.         public void TakeDamage(int damage)
  18.         {
  19.             Health = Math.Max(0, Health - Math.Max(0, damage - Armor));
  20.  
  21.             if (Health <= 0)
  22.             {
  23.                 IsAlive = false;
  24.             }
  25.         }
  26.  
  27.         public virtual void Attack(List<Soldier> enemySoldiers)
  28.         {
  29.             int minSoldiersCount = 0;
  30.  
  31.             if (enemySoldiers.Count > minSoldiersCount)
  32.             {
  33.                 int targetIndex = UserUtils.GenerateRandom(enemySoldiers.Count - 1);
  34.                 Soldier enemy = enemySoldiers[targetIndex];
  35.  
  36.                 enemy.TakeDamage(Damage);
  37.  
  38.                 if (enemy.IsAlive == false)
  39.                 {
  40.                     Console.WriteLine($"Вражеский солдат {enemy.GetType().Name} убит!");
  41.                 }
  42.             }
  43.         }
  44.     }
  45.  
  46.     public class Warrior : Soldier
  47.     {
  48.         public Warrior(int health, int damage, int armor)
  49.         {
  50.             Health = health;
  51.             Damage = damage;
  52.             Armor = armor;
  53.         }
  54.     }
  55.  
  56.     public class Juggernaut : Soldier
  57.     {
  58.         public Juggernaut(int health, int damage, int armor)
  59.         {
  60.             Health = health;
  61.             Damage = damage;
  62.             Armor = armor;
  63.         }
  64.  
  65.         public override void Attack(List<Soldier> enemySoldiers)
  66.         {
  67.             Console.WriteLine("Атака нескольких вражеских солдат единожды...");
  68.             int numAttacks = enemySoldiers.Count;
  69.  
  70.             while (numAttacks > 0)
  71.             {
  72.                 int targetIndex = UserUtils.GenerateRandom(enemySoldiers.Count - 1);
  73.  
  74.                 Soldier enemy = enemySoldiers[targetIndex];
  75.                 enemy.TakeDamage(Damage);
  76.  
  77.                 if (enemy.IsAlive == false)
  78.                 {
  79.                     Console.WriteLine($"Вражеский солдат {enemy.GetType().Name} убит!");
  80.                     enemySoldiers.RemoveAt(targetIndex);
  81.                 }
  82.  
  83.                 numAttacks--;
  84.             }
  85.         }
  86.     }
  87.  
  88.     public class Assassin : Soldier
  89.     {
  90.         public Assassin(int health, int damage, int armor)
  91.         {
  92.             Health = health;
  93.             Damage = damage;
  94.             Armor = armor;
  95.         }
  96.  
  97.         public override void Attack(List<Soldier> enemySoldiers)
  98.         {
  99.             Console.WriteLine("Атака нескольких вражеских солдат повторно...");
  100.  
  101.             foreach (Soldier enemy in enemySoldiers)
  102.             {
  103.                 enemy.TakeDamage(Damage);
  104.             }
  105.         }
  106.     }
  107.  
  108.     public class Squad
  109.     {
  110.         private readonly List<Soldier> _soldiers;
  111.  
  112.         public Squad(List<Soldier> soldiers)
  113.         {
  114.             _soldiers = soldiers;
  115.         }
  116.  
  117.         public bool IsAlive => ActiveSoldiers.Count > 0;
  118.  
  119.         public void RemoveDeadSoldiers()
  120.         {
  121.             _soldiers.RemoveAll(soldier => soldier.Health <= 0);
  122.         }
  123.  
  124.         public IReadOnlyList<Soldier> ActiveSoldiers => _soldiers.Where(soldier => soldier.Health > 0).ToList();
  125.     }
  126.  
  127.     public class Battleground
  128.     {
  129.         private readonly Squad _firstSquad;
  130.         private readonly Squad _secondSquad;
  131.         private bool _battleIsOver;
  132.  
  133.         public Battleground()
  134.         {
  135.             _firstSquad = CreateSquad(new Soldier[]{
  136.                 new Warrior(100, 10, 5),
  137.                 new Warrior(100, 10, 5),
  138.                 new Juggernaut(100, 15, 5),
  139.                 new Assassin(100, 4, 10)});
  140.  
  141.             _secondSquad = CreateSquad(new Soldier[]{
  142.                 new Warrior(100, 10, 5),
  143.                 new Assassin(100, 4, 10),
  144.                 new Juggernaut(100, 4, 2),
  145.                 new Juggernaut(100, 4, 2)});
  146.         }
  147.  
  148.         private Squad CreateSquad(Soldier[] soldiers)
  149.         {
  150.             return new Squad(soldiers.ToList());
  151.         }
  152.  
  153.         public void ConductBattle()
  154.         {
  155.             while (_battleIsOver == false)
  156.             {
  157.                 Console.WriteLine("Первый отряд атакует второй отряд...");
  158.                 AttackEnemySquad(_firstSquad, _secondSquad);
  159.  
  160.                 Console.WriteLine("Второй отряд атакует первый отряд...");
  161.                 AttackEnemySquad(_secondSquad, _firstSquad);
  162.             }
  163.  
  164.             DetermineWinner();
  165.         }
  166.  
  167.         private void AttackEnemySquad(Squad attackingSquad, Squad defendingSquad)
  168.         {
  169.             IReadOnlyList<Soldier> activeSoldiers = attackingSquad.ActiveSoldiers;
  170.             IReadOnlyList<Soldier> enemySoldiers = defendingSquad.ActiveSoldiers;
  171.  
  172.             foreach (Soldier soldier in activeSoldiers)
  173.             {
  174.                 soldier.Attack(enemySoldiers.ToList());
  175.             }
  176.  
  177.             defendingSquad.RemoveDeadSoldiers();
  178.             CheckBattleStatus();
  179.         }
  180.  
  181.         private void CheckBattleStatus()
  182.         {
  183.             if (_firstSquad.IsAlive == false || _secondSquad.IsAlive == false)
  184.             {
  185.                 _battleIsOver = true;
  186.             }
  187.         }
  188.  
  189.         private void DetermineWinner()
  190.         {
  191.             if (_firstSquad.IsAlive)
  192.             {
  193.                 Console.WriteLine("Первая армия выиграла!");
  194.             }
  195.             else if (_secondSquad.IsAlive)
  196.             {
  197.                 Console.WriteLine("Вторая армия выиграла!");
  198.             }
  199.             else
  200.             {
  201.                 Console.WriteLine("Ничья!");
  202.             }
  203.         }
  204.     }
  205.  
  206.     class UserUtils
  207.     {
  208.         private static Random s_random = new Random();
  209.  
  210.         public static int GenerateRandom(int maxValue, int minValue = 0)
  211.         {
  212.             return s_random.Next(minValue, maxValue + 1);
  213.         }
  214.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement