NikaBang

ДЗ: Война

Mar 19th, 2026 (edited)
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.15 KB | Gaming | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. internal class Program
  5. {
  6.     static void Main(string[] args)
  7.     {
  8.         PlatoonBattle battle = new PlatoonBattle();
  9.         battle.SimulateBattle();
  10.     }
  11. }
  12.  
  13. public static class UserUtils
  14. {
  15.     private static Random s_random = new Random();
  16.  
  17.     public static int GenerateRandomNumber(int minRandom, int maxRandom)
  18.     {
  19.         return s_random.Next(minRandom, maxRandom);
  20.     }
  21. }
  22.  
  23. public abstract class Soldier
  24. {
  25.     protected int MaxHealth;
  26.     protected int Health;
  27.     protected int Damage;
  28.     protected int Armor;
  29.     protected double MultiplierDamage;
  30.  
  31.     protected Soldier(int maxHealth, int damage, int armor, double multiplierDamage)
  32.     {
  33.         MultiplierDamage = multiplierDamage;
  34.         MaxHealth = maxHealth;
  35.         Damage = damage;
  36.         Armor = armor;
  37.         Health = MaxHealth;
  38.     }
  39.  
  40.     public bool IsAlive => Health > 0;
  41.  
  42.     public void Attack(List<Soldier> enemySoldiers)
  43.     {
  44.         if (IsAlive && enemySoldiers.Count > 0)
  45.             PerformAttack(enemySoldiers);
  46.     }
  47.  
  48.     protected abstract void PerformAttack(List<Soldier> enemySoldiers);
  49.  
  50.     protected void DealDamage(Soldier target)
  51.     {
  52.         int rawDamage = (int)(Damage * MultiplierDamage);
  53.  
  54.         target.TakeDamage(rawDamage);
  55.     }
  56.  
  57.     private void TakeDamage(int damage)
  58.     {
  59.         int actualDamage = damage - Armor;
  60.  
  61.         if (actualDamage < 1)
  62.             actualDamage = 1;
  63.  
  64.         Health -= actualDamage;
  65.     }
  66. }
  67.  
  68. public class Regular : Soldier
  69. {
  70.     public Regular() : base(maxHealth: 100, damage: 20, armor: 5, multiplierDamage: 1.0)
  71.     {
  72.     }
  73.  
  74.     protected override void PerformAttack(List<Soldier> aliveEnemies)
  75.     {
  76.         int index = UserUtils.GenerateRandomNumber(0, aliveEnemies.Count);
  77.         Soldier enemy = aliveEnemies[index];
  78.         DealDamage(enemy);
  79.     }
  80. }
  81.  
  82. public class Heavy : Soldier
  83. {
  84.     public Heavy() : base(maxHealth: 130, damage: 20, armor: 10, multiplierDamage: 1.8)
  85.     {
  86.     }
  87.  
  88.     protected override void PerformAttack(List<Soldier> aliveEnemies)
  89.     {
  90.         int index = UserUtils.GenerateRandomNumber(0, aliveEnemies.Count);
  91.         Soldier enemy = aliveEnemies[index];
  92.  
  93.         DealDamage(enemy);
  94.     }
  95. }
  96.  
  97. public class MultiNoRepeat : Soldier
  98. {
  99.     private int _numTargets = 3;
  100.  
  101.     public MultiNoRepeat() : base(maxHealth: 90, damage: 18, armor: 4, multiplierDamage: 0.8)
  102.     {
  103.     }
  104.  
  105.     protected override void PerformAttack(List<Soldier> aliveEnemies)
  106.     {
  107.         int targetsCount = _numTargets;
  108.  
  109.         if (targetsCount > aliveEnemies.Count)
  110.             targetsCount = aliveEnemies.Count;
  111.  
  112.         List<Soldier> temp = new List<Soldier>(aliveEnemies);
  113.  
  114.         for (int i = 0; i < targetsCount; i++)
  115.         {
  116.             int index = UserUtils.GenerateRandomNumber(0, temp.Count);
  117.             Soldier enemy = temp[index];
  118.  
  119.             temp.RemoveAt(index);
  120.             DealDamage(enemy);
  121.         }
  122.     }
  123. }
  124.  
  125. public class MultiRepeat : Soldier
  126. {
  127.     private int _targetsCount = 5;
  128.  
  129.     public MultiRepeat() : base(maxHealth: 80, damage: 15, armor: 3, multiplierDamage: 0.6)
  130.     {
  131.     }
  132.  
  133.     protected override void PerformAttack(List<Soldier> aliveEnemies)
  134.     {
  135.         for (int i = 0; i < _targetsCount; i++)
  136.         {
  137.             int index = UserUtils.GenerateRandomNumber(0, aliveEnemies.Count);
  138.             Soldier enemy = aliveEnemies[index];
  139.  
  140.             DealDamage(enemy);
  141.         }
  142.     }
  143. }
  144.  
  145. public class Platoon
  146. {
  147.     private List<Soldier> _soldiers = new List<Soldier>();
  148.  
  149.     public Platoon(List<Soldier> soldiers)
  150.     {
  151.         _soldiers.AddRange(soldiers);
  152.     }
  153.  
  154.     public bool HasAlive()
  155.     {
  156.         for (int i = 0; i < _soldiers.Count; i++)
  157.         {
  158.             if (_soldiers[i].IsAlive)
  159.                 return true;
  160.         }
  161.  
  162.         return false;
  163.     }
  164.  
  165.     public int CountAlive()
  166.     {
  167.         int count = 0;
  168.  
  169.         for (int i = 0; i < _soldiers.Count; i++)
  170.         {
  171.             if (_soldiers[i].IsAlive)
  172.                 count++;
  173.         }
  174.  
  175.         return count;
  176.     }
  177.  
  178.     public void Attack(Platoon enemyPlatoon)
  179.     {
  180.         foreach (Soldier soldier in _soldiers)
  181.         {
  182.             if (soldier.IsAlive)
  183.                 soldier.Attack(enemyPlatoon._soldiers);
  184.         }
  185.     }
  186.  
  187.     public void RemovingDeadSoldiers()
  188.     {
  189.         for (int i = 0; i < _soldiers.Count; ++i)
  190.         {
  191.             if (_soldiers[i].IsAlive == false)
  192.                 _soldiers.Remove(_soldiers[i]);
  193.         }
  194.     }
  195. }
  196.  
  197. public class PlatoonBattle
  198. {
  199.     private Platoon _platoon1;
  200.     private Platoon _platoon2;
  201.  
  202.     public PlatoonBattle()
  203.     {
  204.         _platoon1 = new Platoon(new List<Soldier>
  205.         {
  206.             new Regular(),
  207.             new Regular(),
  208.             new Heavy(),
  209.             new MultiNoRepeat(),
  210.             new MultiRepeat(),
  211.             new MultiRepeat(),
  212.             new MultiNoRepeat(),
  213.             new Heavy()
  214.         });
  215.  
  216.         _platoon2 = new Platoon(new List<Soldier>
  217.         {
  218.             new Regular(),
  219.             new MultiNoRepeat(),
  220.             new Heavy(),
  221.             new MultiRepeat(),
  222.             new Regular(),
  223.             new Heavy(),
  224.             new MultiRepeat(),
  225.             new MultiNoRepeat()
  226.         });
  227.     }
  228.  
  229.     public void SimulateBattle()
  230.     {
  231.         int round = 1;
  232.  
  233.         while (_platoon1.HasAlive() && _platoon2.HasAlive())
  234.         {
  235.             Console.WriteLine($"\nРаунд {round}");
  236.  
  237.             if (round % 2 != 0)
  238.             {
  239.                 _platoon1.Attack(_platoon2);
  240.                 _platoon2.RemovingDeadSoldiers();
  241.                 Console.WriteLine("После атаки Взвода 1:");
  242.                 PrintStatus();
  243.  
  244.                 if (_platoon2.HasAlive() == false)
  245.                     break;
  246.  
  247.                 _platoon2.Attack(_platoon1);
  248.                 _platoon1.RemovingDeadSoldiers();
  249.                 Console.WriteLine("После атаки Взвода 2:");
  250.                 PrintStatus();
  251.             }
  252.             else
  253.             {
  254.                 _platoon2.Attack(_platoon1);
  255.                 _platoon1.RemovingDeadSoldiers();
  256.                 Console.WriteLine("После атаки Взвода 2:");
  257.                 PrintStatus();
  258.  
  259.                 if (_platoon1.HasAlive() == false)
  260.                     break;
  261.  
  262.                 _platoon1.Attack(_platoon2);
  263.                 _platoon2.RemovingDeadSoldiers();
  264.                 Console.WriteLine("После атаки Взвода 1:");
  265.                 PrintStatus();
  266.             }
  267.  
  268.             round++;
  269.         }
  270.  
  271.         int alive1 = _platoon1.CountAlive();
  272.         int alive2 = _platoon2.CountAlive();
  273.  
  274.         if (alive1 > 0 && alive2 == 0)
  275.         {
  276.             Console.WriteLine($"\nПобедил ВЗВОД 1! Выживших бойцов: {alive1}");
  277.         }
  278.         else
  279.         {
  280.             Console.WriteLine($"\nПобедил ВЗВОД 2! Выживших бойцов: {alive2}");
  281.         }
  282.     }
  283.  
  284.     private void PrintStatus()
  285.     {
  286.         Console.WriteLine($"Живых в 1 = {_platoon1.CountAlive()}, в 2 = {_platoon2.CountAlive()}");
  287.     }
  288. }
Advertisement
Add Comment
Please, Sign In to add comment