Advertisement
holllowknight

ДЗ Бои

Apr 6th, 2020 (edited)
168
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 7.32 KB | None | 0 0
  1. using System;
  2.  
  3. namespace Battle
  4. {
  5.     class Program
  6.     {
  7.         static void Main(string[] args)
  8.         {
  9.             Arena arena = new Arena();
  10.             arena.ShowFighters();
  11.             arena.ChooseFighters();
  12.             arena.FightBattle();
  13.             arena.ShowWinner();
  14.         }
  15.     }
  16.  
  17.     class Arena
  18.     {
  19.         private Fighter _rightFighter;
  20.         private Fighter _leftFighter;
  21.  
  22.         private Fighter[] _fighters = new Fighter[]
  23.         {
  24.                 new Warrior("Gorro", 96, 10, 20),
  25.                 new Vampire("Crowser", 100, 9, 22),
  26.                 new Knight("Basil", 103, 11, 19),
  27.                 new PowerMan("Diablo", 97, 10, 21),
  28.                 new FateKnight("Phill", 100, 11, 20),
  29.         };
  30.  
  31.         public void ShowFighters()
  32.         {
  33.             for (int i = 0; i < _fighters.Length; i++)
  34.             {
  35.                 Console.Write(i + 1 + "\t");
  36.                 _fighters[i].ShowStats();
  37.             }
  38.         }
  39.  
  40.         public void ChooseFighters()
  41.         {
  42.             int leftFighterIndex;
  43.             Console.Write("\nВыберите бойца правых врат: ");
  44.             int rightFighterIndex = UserUtils.GetLimitedNumberFromUser(1, _fighters.Length) - 1;
  45.             _rightFighter = _fighters[rightFighterIndex];
  46.             Console.Write("Выберите бойца левых врат: ");
  47.  
  48.             do {
  49.                 leftFighterIndex = UserUtils.GetLimitedNumberFromUser(1, _fighters.Length) - 1;
  50.             }
  51.             while (rightFighterIndex == leftFighterIndex);
  52.  
  53.             _leftFighter = _fighters[leftFighterIndex];
  54.         }
  55.  
  56.         public void FightBattle()
  57.         {
  58.             Console.WriteLine($"\nНачинаем битву между {_rightFighter.Name} и {_leftFighter.Name}");
  59.  
  60.             while (_rightFighter.Health > 0 && _leftFighter.Health > 0)
  61.             {
  62.                 _rightFighter.Attack(_leftFighter);
  63.                 _leftFighter.Attack(_rightFighter);
  64.                 _rightFighter.ShowStats();
  65.                 _leftFighter.ShowStats();
  66.             }
  67.         }
  68.  
  69.         public void ShowWinner()
  70.         {
  71.             if (_rightFighter.Health > 0)
  72.                 Console.WriteLine($"Победил боец правых врат {_rightFighter.Name}");
  73.             else if (_leftFighter.Health > 0)
  74.                 Console.WriteLine($"Победил боец левых врат {_leftFighter.Name}");
  75.             else
  76.                 Console.WriteLine("Сегодня победителя нет");
  77.         }
  78.     }
  79.  
  80.     class UserUtils
  81.     {
  82.         public static int GetNumberFromUser()
  83.         {
  84.             string userInput;
  85.             int userNumber;
  86.             bool isNumber = false;
  87.  
  88.             do
  89.             {
  90.                 userInput = Console.ReadLine();
  91.                 isNumber = int.TryParse(userInput, out userNumber);
  92.             }
  93.             while (isNumber == false);
  94.  
  95.             return userNumber;
  96.         }
  97.  
  98.         public static int GetLimitedNumberFromUser(int minValue, int maxValue)
  99.         {
  100.             int userNumber;
  101.  
  102.             do
  103.             {
  104.                 userNumber = GetNumberFromUser();
  105.             }
  106.             while (userNumber < minValue || userNumber > maxValue);
  107.  
  108.             return userNumber;
  109.         }
  110.     }
  111.  
  112.     abstract class Fighter
  113.     {
  114.         protected static Random Random;
  115.         protected int SpecialAttackChance = 33;
  116.         protected int MaxChance = 100;
  117.         protected int CooldownTime = 3;
  118.         protected int Cooldown;
  119.  
  120.         static Fighter()
  121.         {
  122.             Random = new Random();
  123.         }
  124.  
  125.         public Fighter(string name, int health, int armor, int damage)
  126.         {
  127.             Name = name;
  128.             Health = health;
  129.             Armor = armor;
  130.             Damage = damage;
  131.             Cooldown = 0;
  132.         }
  133.  
  134.         public string Name { get; protected set; }
  135.         public int Health { get; protected set; }
  136.         public int Armor { get; protected set; }
  137.         public int Damage { get; protected set; }
  138.  
  139.         public abstract void InflictSpecial(Fighter rival);
  140.  
  141.         public virtual void ApplyDamage(int damage)
  142.         {
  143.             if (damage > Armor)
  144.                 Health -= damage - Armor;
  145.         }
  146.  
  147.         public void Attack(Fighter rival)
  148.         {
  149.             if (Cooldown != 0)
  150.                 Cooldown--;
  151.  
  152.             if (Cooldown == 0 && Random.Next(MaxChance) < SpecialAttackChance)
  153.             {
  154.                 InflictSpecial(rival);
  155.                 Cooldown = CooldownTime;
  156.             }
  157.             else
  158.             {
  159.                 rival.ApplyDamage(Damage);
  160.             }
  161.         }
  162.  
  163.         public void ShowStats()
  164.         {
  165.             Console.WriteLine($"{Name}\t HP:{Health} DMG:{Damage} Armor:{Armor}");
  166.         }
  167.     }
  168.  
  169.     class Warrior : Fighter
  170.     {
  171.         private int _damageMultiplyer = 2;
  172.  
  173.         public Warrior(string name, int health, int armor, int damage) : base(name, health, armor, damage) { }
  174.  
  175.         public override void InflictSpecial(Fighter rival)
  176.         {
  177.             Console.WriteLine($"{Name} применяет Двойной Удар");
  178.             rival.ApplyDamage(Damage * _damageMultiplyer);
  179.         }
  180.     }
  181.  
  182.     class Vampire : Fighter
  183.     {
  184.         private float _damageToHealthMultiplyer = 0.5f;
  185.  
  186.         public Vampire(string name, int health, int armor, int damage) : base(name, health, armor, damage) { }
  187.  
  188.         public override void InflictSpecial(Fighter rival)
  189.         {
  190.             Console.WriteLine($"{Name} применяет Укус Вампира");
  191.             Health += (int)(Damage * _damageToHealthMultiplyer);
  192.             rival.ApplyDamage(Damage);
  193.         }
  194.     }
  195.  
  196.     class Knight : Fighter
  197.     {
  198.         private int _extraArmor;
  199.  
  200.         public Knight(string name, int health, int armor, int damage) : base(name, health, armor, damage)
  201.         {
  202.             _extraArmor = 0;
  203.         }
  204.  
  205.         public override void ApplyDamage(int damage)
  206.         {
  207.             Armor += _extraArmor;
  208.             base.ApplyDamage(damage);
  209.             Armor -= _extraArmor;
  210.             _extraArmor = 0;
  211.         }
  212.  
  213.         public override void InflictSpecial(Fighter rival)
  214.         {
  215.             Console.WriteLine($"{Name} применяет Кражу Доспехов");
  216.             _extraArmor = rival.Armor;
  217.             rival.ApplyDamage(Damage);
  218.         }
  219.     }
  220.  
  221.     class PowerMan : Fighter
  222.     {
  223.         public PowerMan(string name, int health, int armor, int damage) : base(name, health, armor, damage) { }
  224.  
  225.         public override void InflictSpecial(Fighter rival)
  226.         {
  227.             Console.WriteLine($"{Name} применяет Разрушение Доспехов");
  228.             int damage = Damage + rival.Armor;
  229.             rival.ApplyDamage(damage);
  230.         }
  231.     }
  232.  
  233.     class FateKnight : Fighter
  234.     {
  235.         private float _damageMultiplyer = 2.5f;
  236.  
  237.         public FateKnight(string name, int health, int armor, int damage) : base(name, health, armor, damage) { }
  238.  
  239.         public override void InflictSpecial(Fighter rival)
  240.         {
  241.             Console.WriteLine($"{Name} применяет Удар Судьбы");
  242.             int damage = Random.Next((int)(Damage * _damageMultiplyer));
  243.             rival.ApplyDamage(damage);
  244.         }
  245.     }
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement