Dr_Max_Experience

Task 8

Apr 8th, 2022 (edited)
903
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 8.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 ООП
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             Arena arena = new Arena();
  14.  
  15.             arena.Play();
  16.         }
  17.     }
  18.  
  19.     class Arena
  20.     {
  21.         private Fighter[] _fighters;
  22.  
  23.         public Arena()
  24.         {
  25.             _fighters = CreateFighters();
  26.         }
  27.  
  28.         public void Play()
  29.         {
  30.             bool isPlay = true;
  31.  
  32.             while (isPlay)
  33.             {
  34.                 Console.Clear();
  35.  
  36.                 for (int i = 0; i < _fighters.Length; i++)
  37.                 {
  38.                     Console.Write($"#{i + 1} | ");
  39.                     _fighters[i].ShowInfo();
  40.                 }
  41.  
  42.                 Fighter firstFighter = SelectFighter("первого");
  43.                 Fighter secondFighter = SelectFighter("второго");
  44.  
  45.                 Fight(firstFighter, secondFighter);
  46.  
  47.                 ShowWinner(firstFighter, secondFighter);
  48.  
  49.                 Console.ReadKey();
  50.             }
  51.         }
  52.  
  53.         private Fighter[] CreateFighters()
  54.         {
  55.             Fighter[] fighters = {
  56.                 new Warrior("Jack", 140, 4, 12, 0),
  57.                 new Magician("Ceul", 140, 2, 14, 30),
  58.                 new Witch("Sony", 100, 0, 14, 0),
  59.                 new Soldier("Luis", 140, 2, 16, 1),
  60.                 new Monk("Fred", 110, 0, 12, 0)
  61.             };
  62.  
  63.             return fighters;
  64.         }
  65.  
  66.         private Fighter SelectFighter(string sequence)
  67.         {
  68.             int fighterIndex;
  69.             bool correctImput = false;
  70.  
  71.             while (correctImput == false)
  72.             {
  73.                 Console.Write($"\nВведите номер {sequence} бойца: ");
  74.                 string userInput = Console.ReadLine();
  75.  
  76.                 correctImput = int.TryParse(userInput, out fighterIndex);
  77.  
  78.                 --fighterIndex;
  79.  
  80.                 if (fighterIndex >= 0 && fighterIndex < _fighters.Length)
  81.                 {
  82.                     Fighter[] fighters = CreateFighters();
  83.                     return fighters[fighterIndex];
  84.                 }
  85.                 else
  86.                 {
  87.                     correctImput = false;
  88.                     Console.WriteLine("Некорректный ввод!");
  89.                     Console.ReadKey();
  90.                 }
  91.             }
  92.  
  93.             return null;
  94.         }
  95.  
  96.         private void Fight(Fighter firstFighter, Fighter secondFighter)
  97.         {
  98.             bool isFight = true;
  99.             bool actsFirstFighter = true;
  100.  
  101.             while (isFight)
  102.             {
  103.                 Console.Clear();
  104.  
  105.                 firstFighter.ShowInfo();
  106.                 secondFighter.ShowInfo();
  107.  
  108.                 if (actsFirstFighter)
  109.                 {
  110.                     Console.WriteLine("Действия ПЕРВОГО бойца:");
  111.                     firstFighter.ToAttack(secondFighter);
  112.                     actsFirstFighter = false;
  113.                 }
  114.                 else
  115.                 {
  116.                     Console.WriteLine("Действия ВТОРОГО бойца:");
  117.                     secondFighter.ToAttack(firstFighter);
  118.                     actsFirstFighter = true;
  119.                 }
  120.  
  121.                 if (firstFighter.Health <= 0 || secondFighter.Health <= 0)
  122.                     isFight = false;
  123.  
  124.                 Console.ReadKey();
  125.             }
  126.         }
  127.  
  128.         private void ShowWinner(Fighter firstFighter, Fighter secondFighter)
  129.         {
  130.             if (firstFighter.Health <= 0)
  131.                 Console.WriteLine($"Выиграл второй боец по имени {secondFighter.Name}!");
  132.             else
  133.                 Console.WriteLine($"Выиграл первый боец по имени {firstFighter.Name}!");
  134.         }
  135.     }
  136.  
  137.     abstract class Fighter
  138.     {
  139.         protected string Type;
  140.         protected int Armor;
  141.         protected int Damage;
  142.         protected int ChanceUseSkill;
  143.         protected int NumberHit = 0;
  144.         protected int СountHit;
  145.         protected string DescriptionFeature;
  146.         public string Name { get; protected set; }
  147.         public int Health { get; protected set; }
  148.  
  149.         public Fighter(string name, int health, int armor, int damage, int chanceUseSkill)
  150.         {
  151.             Name = name;
  152.             Health = health;
  153.             Armor = armor;
  154.             Damage = damage;
  155.             ChanceUseSkill = chanceUseSkill;
  156.         }
  157.  
  158.         public void ShowInfo()
  159.         {
  160.             Console.WriteLine($"{Name} | {Type} | {Health} HP | {Armor} ARM | {Damage} DMG | {DescriptionFeature}");
  161.         }
  162.  
  163.         public virtual int GiveDamage()
  164.         {
  165.             NumberHit++;
  166.             return Damage;
  167.         }
  168.  
  169.         public virtual void TakeDamage(int damage)
  170.         {
  171.             if (damage == 0)
  172.             {
  173.             Console.WriteLine("BLOCK!");
  174.             }
  175.             else if (Armor >= damage)
  176.             {
  177.                 Health -= 1;
  178.                 Console.WriteLine($"HIT = 1");
  179.             }
  180.             else
  181.             {
  182.                 Health -= damage - Armor;
  183.                 Console.WriteLine($"HIT = {damage - Armor}");
  184.             }
  185.         }
  186.  
  187.         public void ToAttack(Fighter opponent)
  188.         {
  189.             opponent.TakeDamage(GiveDamage());
  190.         }
  191.  
  192.         protected bool UseSkillOnChance(int probability)
  193.         {
  194.             Random random = new Random();
  195.             int percent = 101;
  196.             int chance = random.Next(percent);
  197.  
  198.             return (chance < probability);
  199.         }
  200.     }
  201.  
  202.     class Warrior : Fighter
  203.     {
  204.         public Warrior(string name, int health, int armor, int damage, int chanceUseSkill) : base(name, health, armor, damage, chanceUseSkill)
  205.         {
  206.             СountHit = 3;
  207.             Type = "Воин  ";
  208.             DescriptionFeature = $"Каждый 3 удар наносит удвоенный урон";
  209.         }
  210.  
  211.         public override int GiveDamage()
  212.         {
  213.             base.GiveDamage();
  214.  
  215.             int damage = Damage;
  216.  
  217.             if (NumberHit % СountHit == 0)
  218.             {
  219.                 damage += damage;
  220.                 Console.WriteLine("CRITICAL!");
  221.             }
  222.  
  223.             return damage;
  224.         }
  225.     }
  226.  
  227.     class Magician : Fighter
  228.     {
  229.         public Magician(string name, int health, int armor, int damage, int chanceUseSkill) : base(name, health, armor, damage, chanceUseSkill)
  230.         {
  231.             Type = "Маг   ";
  232.             DescriptionFeature = $"Имеет {ChanceUseSkill}% увернуться от полученного урона";
  233.         }
  234.  
  235.         public override void TakeDamage(int damage)
  236.         {
  237.             if (UseSkillOnChance(ChanceUseSkill))
  238.                 damage = 0;
  239.                
  240.             base.TakeDamage(damage);
  241.         }
  242.     }
  243.  
  244.     class Witch : Fighter
  245.     {
  246.         public Witch(string name, int health, int armor, int damage, int chanceUseSkill) : base(name, health, armor, damage, chanceUseSkill)
  247.         {
  248.             Type = "Ведьма";
  249.             DescriptionFeature = $"При получении урона немного себя лечит";
  250.         }
  251.  
  252.         public override void TakeDamage(int damage)
  253.         {
  254.             base.TakeDamage(damage);
  255.             int healthUp = 0;
  256.  
  257.             if (Health > 0)
  258.                 healthUp = Convert.ToInt32(Math.Round(Math.Sqrt(Health)));
  259.  
  260.             if(healthUp > 0)
  261.                 Console.WriteLine($"+{healthUp} HP (Ведьма немного излечилась!)");
  262.  
  263.             Health += healthUp;
  264.         }
  265.     }
  266.  
  267.     class Soldier : Fighter
  268.     {
  269.         public Soldier(string name, int health, int armor, int damage, int chanceUseSkill) : base(name, health, armor, damage, chanceUseSkill)
  270.         {
  271.             Type = "Солдат";
  272.             DescriptionFeature = $"Имеет {chanceUseSkill}% шанс сдаться!";
  273.         }
  274.  
  275.         public override void TakeDamage(int damage)
  276.         {
  277.             if (UseSkillOnChance(ChanceUseSkill))
  278.             {
  279.                 damage = int.MaxValue;
  280.                 Console.WriteLine("Солдат сдался!");
  281.             }
  282.  
  283.             base.TakeDamage(damage);
  284.         }
  285.     }
  286.  
  287.     class Monk : Fighter
  288.     {
  289.         public Monk(string name, int health, int armor, int damage, int chanceUseSkill) : base(name, health, armor, damage, chanceUseSkill)
  290.         {
  291.             Type = "Монах ";
  292.             DescriptionFeature = $"Получает в 2 раза меньше урона";
  293.         }
  294.  
  295.         public override void TakeDamage(int damage)
  296.         {
  297.             int reductionFactorDamage = 2;
  298.             damage /= reductionFactorDamage;
  299.  
  300.             base.TakeDamage(damage);
  301.         }
  302.     }
  303. }
Add Comment
Please, Sign In to add comment