Torgach

WarNeverChanges

Apr 27th, 2021 (edited)
344
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 12.36 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace war
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             Battle battle = new Battle();
  14.             battle.RunMenu();
  15.         }
  16.     }
  17.  
  18.     class Battle
  19.     {
  20.         private int _raund { get; set; }
  21.         private Squad _squadLeft;
  22.         private Squad _squadRight;
  23.         private static Random _rand;
  24.  
  25.         public Battle()
  26.         {
  27.             _raund = 1;
  28.             _rand = new Random();
  29.             _squadLeft = new Squad();
  30.             _squadRight = new Squad();
  31.         }
  32.  
  33.         public void RunMenu()
  34.         {
  35.             bool isRun = true;
  36.             while (isRun)
  37.             {
  38.                 Console.WriteLine("[1] - Создать отряд\n[2] - Запустить бой\n[3] - Выход");
  39.  
  40.                 switch (Console.ReadLine())
  41.                 {
  42.                     case "1":
  43.                         _squadLeft.CreateSquad();
  44.                         _squadRight.CreateSquad();
  45.                         break;
  46.                     case "2":
  47.                         StartGame();
  48.                         break;
  49.                     case "3":
  50.                         isRun = false;
  51.                         break;
  52.                 }
  53.             }
  54.         }
  55.  
  56.         private void StartGame()
  57.         {
  58.             if(IsGameReady() == false)
  59.             {
  60.                 return;
  61.             }
  62.  
  63.             Soldier leftSoldier;
  64.             Soldier rightSoldier;
  65.  
  66.             while (IsGameOver() == false)
  67.             {
  68.                 leftSoldier = _squadLeft.GetRandomSoldier();
  69.                 rightSoldier = _squadRight.GetRandomSoldier();
  70.  
  71.                 Console.WriteLine("Западный отряд атакует!");
  72.                 leftSoldier.GetScript(rightSoldier, _squadLeft, _squadRight);
  73.                                
  74.                 Console.WriteLine("Восточный отряд атакует!");
  75.                 rightSoldier.GetScript(leftSoldier, _squadLeft, _squadRight);
  76.  
  77.                 CheckDeath(leftSoldier, rightSoldier);
  78.  
  79.                 if(CheckReadySquads())
  80.                 {
  81.                     EndRaund();
  82.                 }
  83.  
  84.                 Console.ReadKey();
  85.                 Console.Clear();
  86.             }
  87.         }
  88.  
  89.         private void CheckDeath(Soldier leftSoldier, Soldier rightSoldier)
  90.         {
  91.             _squadRight.IsSoldierDie(rightSoldier);
  92.             _squadLeft.IsSoldierDie(leftSoldier);
  93.         }
  94.  
  95.         private bool CheckReadySquads()
  96.         {
  97.             if (_squadLeft.IsSoldiersUnready() && _squadRight.IsSoldiersUnready())
  98.             {
  99.                 _squadLeft.Refresh();
  100.                 _squadRight.Refresh();
  101.                 return true;
  102.             }
  103.             return false;
  104.         }
  105.  
  106.         private void EndRaund()
  107.         {
  108.             Console.WriteLine("Обе стороны готовятся к следующей атаке");
  109.             Console.WriteLine("Раунд: " + _raund++);
  110.         }
  111.  
  112.         private bool IsGameOver()
  113.         {
  114.             if(_squadLeft.GetHealthSquad() <= 0)
  115.             {
  116.                 Console.WriteLine("Западный отряд умер!");
  117.                 return true;
  118.             }
  119.             else if(_squadRight.GetHealthSquad() <= 0)
  120.             {
  121.                 Console.WriteLine("Восточный отряд умер!");
  122.                 return true;
  123.             }
  124.  
  125.             Console.WriteLine("Raund: " + _raund);
  126.             Console.WriteLine("\nСилы западного отряда: " + _squadLeft.GetHealthSquad());
  127.             Console.WriteLine("Силы восточного отряда: " + _squadRight.GetHealthSquad() + "\n");
  128.             return false;
  129.         }
  130.  
  131.         private bool IsGameReady()
  132.         {
  133.             if (_squadLeft.GetSquadSize() < 0)
  134.             {
  135.                 Console.WriteLine("Левый отряд не создан!");
  136.                 return false;
  137.             }
  138.             else if(_squadRight.GetSquadSize() < 0)
  139.             {
  140.                 Console.WriteLine("Правый отряд не создан!");
  141.                 return false;
  142.             }
  143.             return true;
  144.         }
  145.     }
  146.  
  147.     class Squad
  148.     {
  149.         private List<Soldier> _soldiers;
  150.         private static Random _rand = new Random();
  151.  
  152.         public Squad()
  153.         {
  154.             _soldiers = new List<Soldier>(20);
  155.         }
  156.  
  157.         public void CreateSquad()
  158.         {
  159.             Console.WriteLine("Создаем отряд...");
  160.  
  161.             Medic medic = new Medic();
  162.             CreateSoldier(5, medic);
  163.  
  164.             Sniper sniper = new Sniper();
  165.             CreateSoldier(5, sniper);
  166.  
  167.             Infantryman infantryman = new Infantryman();
  168.             CreateSoldier(10, infantryman);
  169.  
  170.             for (int counter = 0; counter < _soldiers.Count; counter++)
  171.             {
  172.                 int swapIndex = _rand.Next(_soldiers.Count);
  173.                 Soldier soldier = _soldiers[swapIndex];
  174.                 _soldiers[swapIndex] = _soldiers[counter];
  175.                 _soldiers[counter] = soldier;
  176.             }
  177.         }
  178.  
  179.         public int GetHealthSquad()
  180.         {
  181.             int healthSquad = 0;
  182.  
  183.             foreach (var soldier in _soldiers)
  184.             {
  185.                 healthSquad += soldier.Health;
  186.             }
  187.             return healthSquad;
  188.         }
  189.  
  190.         public int GetSquadSize()
  191.         {
  192.             return _soldiers.Count;
  193.         }
  194.  
  195.         public Soldier GetRandomSoldier()
  196.         {
  197.             for (int i = 0; i < _soldiers.Count; i++)
  198.             {
  199.                 Soldier soldier = _soldiers[_rand.Next(0, _soldiers.Count)];
  200.                 if (soldier.IsGunReady || soldier.AbillityCounter == 0)
  201.                 {
  202.                     return soldier;
  203.                 }
  204.             }
  205.             return _soldiers[_rand.Next(0, _soldiers.Count)];
  206.         }
  207.  
  208.         public bool IsSoldiersUnready()
  209.         {
  210.             foreach (var soldier in _soldiers)
  211.             {
  212.                 if (soldier.AbillityCounter == 0 && soldier.IsGunReady)
  213.                 {
  214.                     return false;
  215.                 }
  216.             }
  217.             return true;
  218.         }
  219.  
  220.         public void Refresh()
  221.         {
  222.             foreach (var soldier in _soldiers)
  223.             {
  224.                 soldier.ReloadGun();
  225.                 soldier.CooldownAbility();
  226.             }
  227.         }
  228.  
  229.         public bool IsSoldierDie(Soldier soldier)
  230.         {
  231.             if (soldier.Health <= 0)
  232.             {
  233.                 _soldiers.Remove(soldier);
  234.                 return true;
  235.             }
  236.             return false;
  237.         }
  238.  
  239.         private void CreateSoldier(int soldiersCapasity, Soldier soldier)
  240.         {
  241.             for (int counter = 0; counter < soldiersCapasity; counter++)
  242.             {
  243.                 var type = soldier;
  244.  
  245.                 if (type as Medic != null)
  246.                 {
  247.                     type = new Medic(counter, _rand.Next(50, 100), _rand.Next(25, 50));
  248.                     _soldiers.Add(type);
  249.                 }
  250.                 else if (type as Sniper != null)
  251.                 {
  252.                     type = new Sniper(counter, _rand.Next(50, 70), _rand.Next(85, 105));
  253.                     _soldiers.Add(type);
  254.                 }
  255.                 else if (type as Infantryman != null)
  256.                 {
  257.                     type = new Infantryman(counter, _rand.Next(70, 100), _rand.Next(50, 80));
  258.                     _soldiers.Add(type);
  259.                 }
  260.             }
  261.         }
  262.     }
  263.  
  264.     abstract class Soldier
  265.     {
  266.         protected Random _random = new Random();
  267.         public bool IsTargetEnemy { get; protected set; }
  268.         public bool IsGunReady { get; protected set; }
  269.         public bool IsAvoid { get; protected set; }
  270.         public int Number { get; protected set; }
  271.         public int MaxHealth { get; protected set; }
  272.         public int Health { get; protected set; }
  273.         public int Damage { get; protected set; }
  274.         public int AbillityCounter { get; protected set; }
  275.         public string Specialty { get; protected set; }
  276.  
  277.         public abstract void UseAbillity(Squad squad);
  278.  
  279.         public void GetScript(Soldier enemy, Squad allySquad, Squad enemySquad)
  280.         {
  281.             if(IsGunReady && enemy.IsAvoid == false)
  282.             {
  283.                 Attack(enemy);
  284.             }
  285.             else if (AbillityCounter == 0)
  286.             {
  287.                 if(IsTargetEnemy)
  288.                 {
  289.                     UseAbillity(enemySquad);
  290.                 }
  291.                 else if(IsTargetEnemy == false)
  292.                 {
  293.                     UseAbillity(allySquad);
  294.                 }
  295.             }
  296.         }
  297.  
  298.         public virtual void Heal(Soldier ally)
  299.         {
  300.             if(Health < MaxHealth)
  301.             {
  302.                 ally.Health += _random.Next(10, 30);
  303.             }
  304.         }
  305.  
  306.         public virtual void AttackArea(Squad enemySquad)
  307.         {
  308.             for (int i = 0; i < _random.Next(1,5); i++)
  309.             {
  310.                 enemySquad.GetRandomSoldier().Health -= Damage;
  311.             }
  312.         }
  313.  
  314.         public void Attack(Soldier enemy)
  315.         {
  316.             IsGunReady = false;
  317.             enemy.Health -= Damage;
  318.         }
  319.  
  320.         public void ReloadGun()
  321.         {
  322.             IsGunReady = true;
  323.         }
  324.  
  325.         public void CooldownAbility()
  326.         {
  327.             if(AbillityCounter > 0)
  328.                 --AbillityCounter;
  329.         }
  330.     }
  331.  
  332.     class Medic : Soldier
  333.     {
  334.         public Medic()
  335.         {
  336.             Specialty = "Медик";
  337.             IsTargetEnemy = false;
  338.             IsGunReady = false;
  339.             IsAvoid = false;
  340.             Number = 0;
  341.             MaxHealth = 0;
  342.             Health = 0;
  343.             Damage = 0;
  344.             AbillityCounter = 0;
  345.         }
  346.  
  347.         public Medic(int number, int health, int damage)
  348.         {
  349.             Specialty = "Медик";
  350.             IsTargetEnemy = false;
  351.             IsGunReady = false;
  352.             IsAvoid = false;
  353.             Number = number;
  354.             MaxHealth = health;
  355.             Health = health;
  356.             Damage = damage;
  357.             AbillityCounter = 0;
  358.         }
  359.  
  360.         public override void UseAbillity(Squad allySquad)
  361.         {
  362.             for (int i = 0; i < _random.Next(1,6); i++)
  363.             {
  364.                 Heal(allySquad.GetRandomSoldier());
  365.             }
  366.             AbillityCounter = 5;
  367.         }
  368.     }
  369.  
  370.     class Infantryman : Soldier
  371.     {
  372.         public Infantryman()
  373.         {
  374.             Specialty = "Штурмовик";
  375.             IsTargetEnemy = false;
  376.             IsGunReady = false;
  377.             IsAvoid = false;
  378.             Number = 0;
  379.             MaxHealth = 0;
  380.             Health = 0;
  381.             Damage = 0;
  382.             AbillityCounter = 0;
  383.         }
  384.  
  385.         public Infantryman(int number, int health, int damage)
  386.         {
  387.             Specialty = "Штурмовик";
  388.             IsTargetEnemy = true;
  389.             IsGunReady = true;
  390.             IsAvoid = false;
  391.             Number = number;
  392.             MaxHealth = health;
  393.             Health = health;
  394.             Damage = damage;
  395.             AbillityCounter = 0;
  396.             _random = new Random();
  397.         }
  398.  
  399.         public override void UseAbillity(Squad enemySquad)
  400.         {
  401.             AttackArea(enemySquad);
  402.             AbillityCounter = 4;
  403.         }
  404.     }
  405.  
  406.     class Sniper : Soldier
  407.     {
  408.         public Sniper()
  409.         {
  410.             Specialty = "Снайпер";
  411.             IsTargetEnemy = false;
  412.             IsGunReady = false;
  413.             IsAvoid = false;
  414.             Number = 0;
  415.             MaxHealth = 0;
  416.             Health = 0;
  417.             Damage = 0;
  418.             AbillityCounter = 0;
  419.         }
  420.  
  421.         public Sniper(int number, int health, int damage)
  422.         {
  423.             Specialty = "Снайпер";
  424.             IsTargetEnemy = true;
  425.             IsGunReady = true;
  426.             IsAvoid = false;
  427.             Number = number;
  428.             MaxHealth = health;
  429.             Health = health;
  430.             Damage = damage;
  431.             AbillityCounter = 3;
  432.         }
  433.  
  434.         public override void UseAbillity(Squad squad)
  435.         {
  436.             IsAvoid = true;
  437.             AbillityCounter = 3;
  438.         }
  439.     }
  440. }
Add Comment
Please, Sign In to add comment