Advertisement
Torgach

WarWithStatus

Apr 30th, 2021
956
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 12.80 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 _round = 0;
  21.  
  22.         private Squad _squadLeft;
  23.         private Squad _squadRight;
  24.  
  25.         public Battle()
  26.         {
  27.             _round = 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.         private void InitStage()
  79.         {
  80.             _squadLeft.ChooseRandomFrontmen();
  81.             _squadRight.ChooseRandomFrontmen();
  82.         }
  83.  
  84.         private void FightStage()
  85.         {
  86.             Console.WriteLine("Западный отряд атакует!");
  87.             _squadRight.TakeAction(_squadLeft.Frontman);
  88.  
  89.             Console.WriteLine("Восточный отряд атакует!");
  90.             _squadLeft.TakeAction(_squadRight.Frontman);
  91.         }
  92.  
  93.         private void EndStage()
  94.         {
  95.             _squadLeft.TryDeleteDeadSoldier();
  96.             _squadRight.TryDeleteDeadSoldier();
  97.  
  98.             if(IsSquadsReady())
  99.             {
  100.                 Console.WriteLine("Новый раунд!");
  101.                 _round++;
  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: " + _round);
  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.SoldiersCount < 0)
  138.             {
  139.                 Console.WriteLine("Левый отряд не создан!");
  140.                 return false;
  141.             }
  142.             else if (_squadRight.SoldiersCount < 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.  
  155.         private static Random _rand = new Random(DateTime.Now.Millisecond);
  156.  
  157.         public int SoldiersCount => _soldiers.Count;
  158.         public Soldier Frontman { get; private set; }
  159.  
  160.         public Squad()
  161.         {
  162.             _soldiers = new List<Soldier>(20);
  163.         }
  164.  
  165.         public void CreateSquad()
  166.         {
  167.             Console.WriteLine("Создаем отряд...");
  168.  
  169.             Medic medic = new Medic();
  170.             CreateSoldier(5, medic);
  171.  
  172.             Sniper sniper = new Sniper();
  173.             CreateSoldier(5, sniper);
  174.  
  175.             Infantryman infantryman = new Infantryman();
  176.             CreateSoldier(10, infantryman);
  177.  
  178.             for (int counter = 0; counter < _soldiers.Count; counter++)
  179.             {
  180.                 int swapIndex = _rand.Next(_soldiers.Count);
  181.                 Soldier soldier = _soldiers[swapIndex];
  182.                 _soldiers[swapIndex] = _soldiers[counter];
  183.                 _soldiers[counter] = soldier;
  184.             }
  185.         }
  186.  
  187.         public void TakeAction(Soldier enemyFrontman)
  188.         {
  189.             Frontman.TryAttack(enemyFrontman, GetRandomSoldier(_soldiers));
  190.         }
  191.  
  192.         public int GetHealthSquad()
  193.         {
  194.             int healthSquad = 0;
  195.  
  196.             foreach (var soldier in _soldiers)
  197.             {
  198.                 healthSquad += soldier.Health;
  199.             }
  200.             return healthSquad;
  201.         }
  202.  
  203.         public Soldier ChooseRandomFrontmen()
  204.         {
  205.             List<Soldier> readySoldiers = new List<Soldier>();
  206.  
  207.             foreach (var soldier in _soldiers)
  208.             {
  209.                 if(soldier.GetGunLoadState() == true || soldier.AbillityCounter == 0)
  210.                 {
  211.                     readySoldiers.Add(soldier);
  212.                 }
  213.             }
  214.  
  215.             if(readySoldiers.Count == 0)
  216.             {
  217.                 Frontman = GetRandomSoldier(_soldiers);
  218.             }
  219.             else
  220.             {
  221.                 Frontman = GetRandomSoldier(readySoldiers);
  222.             }
  223.             return Frontman;
  224.         }
  225.  
  226.         public Soldier GetRandomSoldier(List<Soldier> soldiers)
  227.         {
  228.             return soldiers[_rand.Next(0, soldiers.Count)];
  229.         }
  230.  
  231.         public bool IsSoldiersUnready()
  232.         {
  233.             foreach (var soldier in _soldiers)
  234.             {
  235.                 if (soldier.AbillityCounter == 0 && soldier.GetGunLoadState() == true)
  236.                 {
  237.                     return false;
  238.                 }
  239.             }
  240.             return true;
  241.         }
  242.  
  243.         public void Refresh()
  244.         {
  245.             foreach (var soldier in _soldiers)
  246.             {
  247.                 soldier.ReloadGun();
  248.                 soldier.CooldownAbility();
  249.             }
  250.         }
  251.  
  252.         public bool TryDeleteDeadSoldier()
  253.         {
  254.             if (Frontman.Health <= 0)
  255.             {
  256.                 _soldiers.Remove(Frontman);
  257.                 return true;
  258.             }
  259.             return false;
  260.         }
  261.  
  262.         private void CreateSoldier(int soldiersCapasity, Soldier soldier)
  263.         {
  264.             for (int counter = 0; counter < soldiersCapasity; counter++)
  265.             {
  266.                 var type = soldier;
  267.  
  268.                 if (type as Medic != null)
  269.                 {
  270.                     type = new Medic(counter, _rand.Next(50, 100), _rand.Next(25, 50));
  271.                     _soldiers.Add(type);
  272.                 }
  273.                 else if (type as Sniper != null)
  274.                 {
  275.                     type = new Sniper(counter, _rand.Next(50, 70), _rand.Next(85, 105));
  276.                     _soldiers.Add(type);
  277.                 }
  278.                 else if (type as Infantryman != null)
  279.                 {
  280.                     type = new Infantryman(counter, _rand.Next(70, 100), _rand.Next(50, 80));
  281.                     _soldiers.Add(type);
  282.                 }
  283.             }
  284.         }
  285.     }
  286.  
  287.     abstract class Soldier
  288.     {
  289.         protected Status Status;
  290.         protected Random Random = new Random();
  291.  
  292.         public int Number { get; protected set; }
  293.         public int MaxHealth { get; protected set; }
  294.         public int Health { get; protected set; }
  295.         public int Damage { get; protected set; }
  296.         public int AbillityCounter { get; protected set; }
  297.         public string Specialty { get; protected set; }
  298.  
  299.         public abstract void UseAbillity(Soldier soldier);
  300.  
  301.  
  302.         public Soldier()
  303.         {
  304.             Status = new Status();
  305.  
  306.             Status.SetTarget(false);
  307.             Status.SetLoadGun(false);
  308.             Status.SetAvoid(false);
  309.  
  310.             Number = 0;
  311.             MaxHealth = 0;
  312.             Health = 0;
  313.             Damage = 0;
  314.             AbillityCounter = 0;
  315.             Specialty = "Новобранец";
  316.         }
  317.  
  318.         public bool GetAvoidState()
  319.         {
  320.             return Status.IsAvoid;
  321.         }
  322.  
  323.         public bool GetGunLoadState()
  324.         {
  325.             return Status.IsGunLoaded;
  326.         }
  327.  
  328.         public bool GetTargetState()
  329.         {
  330.             return Status.IsTargetEnemy;
  331.         }
  332.  
  333.         public void TryAttack(Soldier enemy, Soldier ally)
  334.         {
  335.             if (Status.IsGunLoaded)
  336.             {
  337.                 Attack(enemy);
  338.             }
  339.             else if (AbillityCounter == 0)
  340.             {
  341.                 if (Status.IsTargetEnemy)
  342.                 {
  343.                     UseAbillity(enemy);
  344.                 }
  345.                 else if (Status.IsTargetEnemy == false)
  346.                 {
  347.                     UseAbillity(ally);
  348.                 }
  349.             }
  350.         }
  351.  
  352.         public void Attack(Soldier enemy)
  353.         {
  354.             if(enemy.Status.IsAvoid == false)
  355.             {
  356.                 enemy.Health -= Damage;
  357.             }
  358.  
  359.             Status.SetLoadGun(false);
  360.         }
  361.  
  362.         public void ReloadGun()
  363.         {
  364.             Status.SetLoadGun(true);
  365.         }
  366.  
  367.         public virtual void Heal(Soldier ally)
  368.         {
  369.             if (Health < MaxHealth)
  370.             {
  371.                 ally.Health += Random.Next(40, 70);
  372.             }
  373.             else
  374.             {
  375.                 ally.Health += Random.Next(10, 30);
  376.             }
  377.         }
  378.  
  379.         public void CooldownAbility()
  380.         {
  381.             if (AbillityCounter > 0)
  382.                 --AbillityCounter;
  383.         }
  384.     }
  385.  
  386.     class Medic : Soldier
  387.     {
  388.         public int ChargeAbility { get; private set; }
  389.  
  390.         public Medic() : base()
  391.         {
  392.  
  393.         }
  394.  
  395.         public Medic(int number, int health, int damage)
  396.         {
  397.             Specialty = "Медик";
  398.             Number = number;
  399.             MaxHealth = health;
  400.             Health = health;
  401.             Damage = damage;
  402.             AbillityCounter = 0;
  403.         }
  404.  
  405.         public override void UseAbillity(Soldier ally)
  406.         {
  407.             Heal(ally);
  408.             AbillityCounter = 5;
  409.         }
  410.     }
  411.  
  412.     class Infantryman : Soldier
  413.     {
  414.         public Infantryman() : base()
  415.         {
  416.  
  417.         }
  418.         public Infantryman(int number, int health, int damage)
  419.         {
  420.             Status.SetTarget(true);
  421.             Status.SetLoadGun(true);
  422.             Status.SetAvoid(false);
  423.  
  424.             Specialty = "Штурмовик";
  425.             Number = number;
  426.             MaxHealth = health;
  427.             Health = health;
  428.             Damage = damage;
  429.         }
  430.  
  431.         public override void UseAbillity(Soldier enemy)
  432.         {
  433.             Health += Random.Next(10, 20);
  434.             AbillityCounter = Random.Next(1, 3);
  435.         }
  436.     }
  437.  
  438.     class Sniper : Soldier
  439.     {
  440.         public Sniper() : base()
  441.         {
  442.  
  443.         }
  444.         public Sniper(int number, int health, int damage)
  445.         {
  446.             Status.SetTarget(true);
  447.             Status.SetLoadGun(true);
  448.             Status.SetAvoid(false);
  449.  
  450.             Specialty = "Снайпер";
  451.             Number = number;
  452.             MaxHealth = health;
  453.             Health = health;
  454.             Damage = damage;
  455.             AbillityCounter = 3;
  456.         }
  457.  
  458.         public override void UseAbillity(Soldier soldier)
  459.         {
  460.             Status.SetAvoid(true);
  461.             AbillityCounter = 3;
  462.         }
  463.     }
  464.  
  465.     class Status
  466.     {
  467.         public bool IsTargetEnemy { get; private set; }
  468.         public bool IsGunLoaded { get; private set; }
  469.         public bool IsAvoid { get; private set; }
  470.  
  471.         public Status()
  472.         {
  473.             IsTargetEnemy = false;
  474.             IsGunLoaded = false;
  475.             IsAvoid = false;
  476.         }
  477.  
  478.         public void SetTarget(bool state)
  479.         {
  480.             IsTargetEnemy = state;
  481.         }
  482.  
  483.         public void SetLoadGun(bool state)
  484.         {
  485.             IsGunLoaded = state;
  486.         }
  487.  
  488.         public void SetAvoid(bool state)
  489.         {
  490.             IsAvoid = state;
  491.         }
  492.     }
  493. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement