Advertisement
Torgach

FixWar

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