Advertisement
MaoChessy

Task 35 - fix

Nov 17th, 2020 (edited)
127
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace CLights
  5. {
  6.     class Program
  7.     {
  8.         public static void Main()
  9.         {
  10.             new Battlefield(new Platoon("Взвод 1"), new Platoon("Взвод 2")).Work();
  11.         }
  12.     }
  13.     public static class RandomStatic
  14.     {
  15.         static private Random _rand = new Random();
  16.         static public int GetNext(int min, int max)
  17.         {
  18.             return _rand.Next(min, max);
  19.         }
  20.     }
  21.     public static class Messager
  22.     {
  23.         static public void ShowMessageWithColor(string message, ConsoleColor color, bool delay)
  24.         {
  25.             ConsoleColor defaultColor = Console.ForegroundColor;
  26.             Console.ForegroundColor = color;
  27.             Console.WriteLine(message);
  28.             Console.ForegroundColor = defaultColor;
  29.             if (delay)
  30.                 Console.ReadKey();
  31.         }
  32.     }
  33.  
  34.     class Battlefield
  35.     {
  36.         private Platoon _side1;
  37.         private Platoon _side2;
  38.         public Battlefield(Platoon platoon1, Platoon platoon2)
  39.         {
  40.             _side1 = platoon1;
  41.             _side2 = platoon2;
  42.         }
  43.         public void Work()
  44.         {
  45.             while (_side1.CheckCombatСapability() && _side2.CheckCombatСapability())
  46.             {
  47.                 Console.Clear();
  48.  
  49.                 _side1.Attack(_side2);
  50.                 if (!(_side1.CheckCombatСapability() && _side2.CheckCombatСapability()))
  51.                     break;
  52.                 _side2.Attack(_side1);
  53.  
  54.                 _side1.ShowInfo();
  55.                 _side2.ShowInfo();
  56.  
  57.                 Console.ReadKey();
  58.             }
  59.             Console.Clear();
  60.  
  61.             if (!_side1.CheckCombatСapability() && _side2.CheckCombatСapability())
  62.             {
  63.                 Messager.ShowMessageWithColor($"{_side2.Name} - Выиграл", ConsoleColor.Green, false);
  64.                 Messager.ShowMessageWithColor($"{_side1.Name} - Проиграл", ConsoleColor.Red, false);
  65.             }
  66.             else if (_side1.CheckCombatСapability() && !_side2.CheckCombatСapability())
  67.             {
  68.                 Messager.ShowMessageWithColor($"{_side1.Name} - Выиграл", ConsoleColor.Green, false);
  69.                 Messager.ShowMessageWithColor($"{_side2.Name} - Проиграл", ConsoleColor.Red, false);
  70.             }
  71.  
  72.             _side1.ShowInfo();
  73.             _side2.ShowInfo();
  74.             Console.ReadKey();
  75.         }
  76.     }
  77.     class Platoon
  78.     {
  79.         private List<Soldier> _soldiers = new List<Soldier>();
  80.         private List<Soldier> _deadSoldiers = new List<Soldier>();
  81.         public string Name { get; private set; }
  82.         public Platoon(string name)
  83.         {
  84.             Name = name;
  85.             for (int i = 0; i < 20; i++)
  86.             {
  87.                 int chance = RandomStatic.GetNext(0, 101);
  88.                 if (chance <= 35)
  89.                     _soldiers.Add(new Guner(i, Name));
  90.                 else if (chance <= 65)
  91.                     _soldiers.Add(new Autoguner(i, Name));
  92.                 else if (chance <= 85)
  93.                     _soldiers.Add(new Sniper(i, Name));
  94.                 else
  95.                     _soldiers.Add(new RPG(i, Name));
  96.             }
  97.         }
  98.         public Soldier GetRandomSoldier()
  99.         {
  100.             if (_soldiers.Count > 0)
  101.                 return _soldiers[RandomStatic.GetNext(0, _soldiers.Count)];
  102.             else
  103.                 return null;
  104.         }
  105.         public void ShowInfo()
  106.         {
  107.             ConsoleColor colorOfHp;
  108.             ConsoleColor defaultColor = ConsoleColor.White;
  109.             Console.WriteLine("\nВзвод: " + Name);
  110.             for (int i = 0; i < _soldiers.Count; i++)
  111.             {
  112.                 char symbolSoldier = _soldiers[i].GetCharInfo(out colorOfHp);
  113.                 Console.ForegroundColor = colorOfHp;
  114.                 Console.Write($"{_soldiers[i].Id}:{symbolSoldier} | ");
  115.                 Console.ForegroundColor = defaultColor;
  116.             }
  117.             for (int i = 0; i < _deadSoldiers.Count; i++)
  118.             {
  119.                 char symbolSoldier = _deadSoldiers[i].GetCharInfo(out colorOfHp);
  120.                 Console.ForegroundColor = colorOfHp;
  121.                 Console.Write($"{_deadSoldiers[i].Id}:{symbolSoldier} | ");
  122.                 Console.ForegroundColor = defaultColor;
  123.             }
  124.             Console.WriteLine();
  125.         }
  126.         public void Attack(Platoon enemyPlatoon)
  127.         {
  128.             MoveDeadBody();
  129.             GetRandomSoldier()?.Atack(enemyPlatoon);
  130.         }
  131.         public bool CheckCombatСapability()
  132.         {
  133.             return _soldiers.Count > 0;
  134.         }
  135.         private void MoveDeadBody()
  136.         {
  137.             for (int i = _soldiers.Count - 1; i >= 0; i--)
  138.             {
  139.                 if (_soldiers[i].Hp <= 0)
  140.                 {
  141.                     _deadSoldiers.Add(_soldiers[i]);
  142.                     _soldiers.RemoveAt(i);
  143.                 }
  144.             }
  145.         }
  146.     }
  147.     abstract class Soldier
  148.     {
  149.         public int Hp { get; protected set; }
  150.         public int Armor { get; protected set; }
  151.         public bool Stealth { get; protected set; } = false;
  152.         public char Symbol { get; protected set; }
  153.         public int Id { get; private set; }
  154.         private string _nameMyPlatoon;
  155.         public Soldier(int id, string namePlatoon)
  156.         {
  157.             Id = id;
  158.             _nameMyPlatoon = namePlatoon;
  159.             Hp = 100;
  160.         }
  161.         abstract public void Atack(Platoon enemyPlatoon);
  162.         public void TakeDamage(int damage)
  163.         {
  164.             Hp -= GetRealDamage(damage);
  165.         }
  166.         public char GetCharInfo(out ConsoleColor color)
  167.         {
  168.             if (Hp <= 0)
  169.                 color = ConsoleColor.DarkMagenta;
  170.             else if (Hp < 25)
  171.                 color = ConsoleColor.Red;
  172.             else if (Hp < 60)
  173.                 color = ConsoleColor.Yellow;
  174.             else
  175.                 color = ConsoleColor.Green;
  176.             return Symbol;
  177.         }
  178.         protected void ShowResultAttack(string typeSoldier, int damage, Soldier enemy)
  179.         {
  180.             Console.WriteLine($"{typeSoldier} {Id}-{Symbol} от {_nameMyPlatoon} Атаковал - {enemy.Id}-{enemy.Symbol} на {enemy.GetRealDamage(damage)}");
  181.         }
  182.         public int GetRealDamage(int damage)
  183.         {
  184.             int realDamage = damage - Armor * 5;
  185.             if (Stealth)
  186.                 realDamage = (int)(realDamage * 0.75f);
  187.             if (realDamage < 0)
  188.                 realDamage = 1;
  189.             return realDamage;
  190.         }
  191.     }
  192.     class RPG : Soldier
  193.     {
  194.         public RPG(int id, string name) : base(id, name)
  195.         {
  196.             Armor = 1;
  197.             Stealth = false;
  198.             Symbol = 'R';
  199.         }
  200.         public override void Atack(Platoon enemyPlatoon)
  201.         {
  202.             int amountTarget = RandomStatic.GetNext(3, 7);
  203.             int damage = RandomStatic.GetNext(50, 80);
  204.             for (int i = 0; i < amountTarget; i++)
  205.             {
  206.                 Soldier enemy = enemyPlatoon.GetRandomSoldier();
  207.                 if (enemy != null)
  208.                 {
  209.                     enemy.TakeDamage(damage);
  210.                     ShowResultAttack("Ракетчик", damage, enemy);
  211.                 }
  212.             }
  213.         }
  214.     }
  215.     class Autoguner : Soldier
  216.     {
  217.         public Autoguner(int id, string name) : base(id, name)
  218.         {
  219.             Armor = 2;
  220.             Stealth = false;
  221.             Symbol = 'A';
  222.         }
  223.         public override void Atack(Platoon enemyPlatoon)
  224.         {
  225.             int amountTarger = RandomStatic.GetNext(0, 5);
  226.             for (int i = 0; i < amountTarger; i++)
  227.             {
  228.                 Soldier enemy = enemyPlatoon.GetRandomSoldier();
  229.                 int damage = RandomStatic.GetNext(40, 45);
  230.                 if (enemy != null)
  231.                 {
  232.                     enemy.TakeDamage(damage);
  233.                     ShowResultAttack("Автоматчик", damage, enemy);
  234.                 }
  235.             }
  236.         }
  237.     }
  238.     class Guner : Soldier
  239.     {
  240.         public Guner(int id, string name) : base(id, name)
  241.         {
  242.             Armor = 3;
  243.             Stealth = false;
  244.             Symbol = 'G';
  245.         }
  246.         public override void Atack(Platoon enemyPlatoon)
  247.         {
  248.             Soldier enemy = enemyPlatoon.GetRandomSoldier();
  249.             int damage = RandomStatic.GetNext(50, 55);
  250.             if (enemy != null)
  251.             {
  252.                 enemy.TakeDamage(damage);
  253.                 ShowResultAttack("Стрелок", damage, enemy);
  254.             }
  255.         }
  256.     }
  257.     class Sniper : Soldier
  258.     {
  259.         public Sniper(int id, string name) : base(id, name)
  260.         {
  261.             Armor = 0;
  262.             Stealth = true;
  263.             Symbol = 'S';
  264.         }
  265.         public override void Atack(Platoon enemyPlatoon)
  266.         {
  267.             Soldier enemy = enemyPlatoon.GetRandomSoldier();
  268.             int damage = 150;
  269.             if (enemy != null)
  270.             {
  271.                 enemy.TakeDamage(damage);
  272.                 ShowResultAttack("Снайпер", damage, enemy);
  273.             }
  274.         }
  275.     }
  276. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement