Advertisement
NikaBang

Бойцовский клуб

Aug 9th, 2022 (edited)
76
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.81 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. internal class Program
  5. {
  6.     //Создать 5 бойцов, пользователь выбирает 2 бойцов и они сражаются друг с другом до смерти. У каждого бойца могут быть свои статы.
  7.     //Каждый игрок должен иметь особую способность для атаки, которая свойственна только его классу!
  8.     static void Main(string[] args)
  9.     {
  10.         new Game().Start();
  11.     }
  12.  
  13.     abstract class Warrior
  14.     {
  15.         public string Name { get; private set; }
  16.         public int Health { get; private set; }
  17.         public int Damage { get; private set; }
  18.         public int Armor { get; private set; }
  19.         public int Dodge { get; private set; }
  20.  
  21.         public Warrior(string name, int health, int damage, int armor, int dodge)
  22.         {
  23.             Name = name;
  24.             Health = health;
  25.             Damage = damage;
  26.             Armor = armor;
  27.             Dodge = dodge;
  28.         }
  29.  
  30.         public abstract void ShowAbilityHero();
  31.  
  32.         public abstract int Atack();
  33.  
  34.         public void TakeDamage(int damage)
  35.         {
  36.             if (CalculateRandom())
  37.             {
  38.                 int finalDamage = damage - Armor;
  39.                 if (finalDamage > 0)
  40.                 {
  41.                     Health -= finalDamage;
  42.  
  43.                     Console.WriteLine($"{Name} получил {finalDamage} урона, Здоровье - {Health}");
  44.                 }
  45.             }
  46.             else
  47.             {
  48.                 Console.WriteLine("ПРОМАХ.");
  49.             }
  50.         }
  51.  
  52.         public void ShowInfo()
  53.         {
  54.             Console.ForegroundColor = ConsoleColor.Green;
  55.             Console.Write(Name);
  56.             Console.ForegroundColor = ConsoleColor.Gray;
  57.             Console.Write($" - Здоровье: {Health}, Урон: {Damage}, Броня: {Armor}, Уклон: {Dodge}%\nУникальность: ");
  58.  
  59.             ShowAbilityHero();
  60.         }
  61.  
  62.         protected void TakeHealth(int health)
  63.         {
  64.             Health += health;
  65.         }
  66.  
  67.         protected void TakeDodge(int dodge)
  68.         {
  69.             Dodge += dodge;
  70.         }
  71.  
  72.         private bool CalculateRandom()
  73.         {
  74.             int minRandom = 0;
  75.             int maxRandom = 101;
  76.  
  77.             return new Random().Next(minRandom, maxRandom) > Dodge;
  78.         }
  79.     }
  80.  
  81.     class Gladiator : Warrior
  82.     {
  83.         private int _boostDamage;
  84.         private int _cooldownAbility;
  85.         private int _timeCount;
  86.         public Gladiator() : base("Гладиатор", 150, 15, 5, 10)
  87.         {
  88.             _boostDamage = 2;
  89.             _cooldownAbility = 3;
  90.             _timeCount = 0;
  91.         }
  92.  
  93.         public override int Atack()
  94.         {
  95.             int damage;
  96.  
  97.             if (_timeCount == _cooldownAbility)
  98.             {
  99.                 damage = Damage * _boostDamage;
  100.                 _timeCount = 0;
  101.             }
  102.             else
  103.             {
  104.                 damage = Damage;
  105.                 _timeCount++;
  106.             }
  107.  
  108.             return damage;
  109.         }
  110.  
  111.         public override void ShowAbilityHero()
  112.         {
  113.             Console.WriteLine("Каждые " + _cooldownAbility + " раунда наносит двойной Урон.\n");
  114.         }
  115.     }
  116.  
  117.     class Assasin : Warrior
  118.     {
  119.         private int _multiplierCrit;
  120.         public Assasin() : base("Ассасин", 100, 7, 2, 50)
  121.         {
  122.             _multiplierCrit = 5;
  123.         }
  124.  
  125.         public override int Atack()
  126.         {
  127.             int damage;
  128.             int minRandom = 1;
  129.             int maxRandom = 4;
  130.  
  131.             Random random = new Random();
  132.             int chanceCrit = random.Next(minRandom, maxRandom);
  133.  
  134.             if (chanceCrit == minRandom)
  135.             {
  136.                 damage = Damage * _multiplierCrit;
  137.                 Console.Write(Name + " критует! ");
  138.             }
  139.             else
  140.             {
  141.                 damage = Damage;
  142.             }
  143.  
  144.             return damage;
  145.         }
  146.  
  147.         public override void ShowAbilityHero()
  148.         {
  149.             Console.WriteLine($"С 33% шансом наносит х{_multiplierCrit} крит Урон.\n");
  150.         }
  151.     }
  152.  
  153.     class Barbarian : Warrior
  154.     {
  155.         private int _timeCount;
  156.         private int _timeAction;
  157.         private int _cooldownAbility;
  158.         private int _boostDamage;
  159.  
  160.         public Barbarian() : base("Варвар", 125, 10, 0, 15)
  161.         {
  162.             _timeCount = 5;
  163.             _timeAction = 3;
  164.             _cooldownAbility = 5;
  165.             _boostDamage = 25;
  166.         }
  167.  
  168.         public override int Atack()
  169.         {
  170.             int damage;
  171.  
  172.             if (_timeCount == _cooldownAbility)
  173.             {
  174.                 _timeCount = 0;
  175.             }
  176.  
  177.             if (_timeCount < _timeAction)
  178.             {
  179.                 damage = _boostDamage;
  180.  
  181.                 _timeCount++;
  182.             }
  183.             else
  184.             {
  185.                 damage = Damage;
  186.  
  187.                 _timeCount++;
  188.             }
  189.  
  190.             return damage;
  191.         }
  192.  
  193.         public override void ShowAbilityHero()
  194.         {
  195.             Console.WriteLine($"Каждые {_cooldownAbility} раундов усиливает Урон на {_boostDamage} на {_timeAction} раунда.\n");
  196.         }
  197.     }
  198.  
  199.     class Troll : Warrior
  200.     {
  201.         private int _boostDamage;
  202.         private int _boostDodge;
  203.         private int _minHealth;
  204.         private bool _isAlarm;
  205.         public Troll() : base("Троль", 90, 10, 5, 10)
  206.         {
  207.             _boostDamage = 20;
  208.             _boostDodge = 50;
  209.             _minHealth = 60;
  210.             _isAlarm = false;
  211.         }
  212.  
  213.         public override int Atack()
  214.         {
  215.             int damage;
  216.  
  217.             if (Health < _minHealth && _isAlarm == false)
  218.             {
  219.                 _isAlarm = true;
  220.                 TakeDodge(_boostDodge);
  221.             }
  222.  
  223.             if (_isAlarm == true)
  224.             {
  225.                 damage = Damage + _boostDamage;
  226.             }
  227.             else
  228.             {
  229.                 damage = Damage;
  230.             }
  231.  
  232.             return damage;
  233.         }
  234.  
  235.         public override void ShowAbilityHero()
  236.         {
  237.             Console.WriteLine($"При снижении Здоровья до {_minHealth} увеличивает Уклон на {_boostDodge} и Урон на {_boostDamage} до конца боя.\n");
  238.         }
  239.     }
  240.  
  241.     class Vampire : Warrior
  242.     {
  243.         private int _takeLife;
  244.  
  245.         public Vampire() : base("Вампир", 100, 15, 0, 25)
  246.         {
  247.             _takeLife = 5;
  248.         }
  249.  
  250.         public override int Atack()
  251.         {
  252.             TakeHealth(_takeLife);
  253.             return Damage;
  254.         }
  255.  
  256.         public override void ShowAbilityHero()
  257.         {
  258.             Console.WriteLine($"Каждый раунд увеличивает здоровье на {_takeLife}.\n");
  259.         }
  260.     }
  261.  
  262.     class Game
  263.     {
  264.         private Warrior _wariorOne = null;
  265.         private Warrior _warriorTwo = null;
  266.         private List<Warrior> _warriors = new List<Warrior>
  267.         {
  268.             new Gladiator(),
  269.             new Assasin(),
  270.             new Barbarian(),
  271.             new Troll(),
  272.             new Vampire()
  273.         };
  274.  
  275.         public void Start()
  276.         {
  277.             int indexBlockedWarrior = 0;
  278.  
  279.             for (int i = 0; i < _warriors.Count; i++)
  280.             {
  281.                 Console.Write(i + 1 + ". ");
  282.  
  283.                 _warriors[i].ShowInfo();
  284.             }
  285.  
  286.             Console.Write("Выбери себе воина: ");          
  287.             ChooseWarrior(ref _wariorOne,ref indexBlockedWarrior);
  288.  
  289.             Console.Write("Выбери противника: ");
  290.             ChooseWarrior(ref _warriorTwo, ref indexBlockedWarrior);
  291.  
  292.             Fight();
  293.         }
  294.  
  295.         private void ChooseWarrior(ref Warrior warrior, ref int indexBlockedWarrior)
  296.         {
  297.             while (warrior == null)
  298.             {
  299.                 int indexWarrior = ReadInt(Console.ReadLine());
  300.  
  301.                 if (indexWarrior == indexBlockedWarrior)
  302.                 {
  303.                     Console.WriteLine("Этот воин занят.");
  304.                 }
  305.                 else if (indexWarrior > 0 && indexWarrior <= _warriors.Count)
  306.                 {
  307.                     warrior = _warriors[indexWarrior - 1];
  308.                     indexBlockedWarrior = indexWarrior;
  309.                     Console.WriteLine("Выбран воин - " + warrior.Name + "\n");
  310.                 }
  311.                 else
  312.                 {
  313.                     Console.Write("Ошибка ввода! Повторите: ");
  314.                 }
  315.             }
  316.         }
  317.  
  318.         private void Fight()
  319.         {
  320.             bool inBattle = true;
  321.             int round = 1;
  322.  
  323.             while (inBattle)
  324.             {
  325.                 Console.Clear();
  326.                 Console.WriteLine("Раунд: " + round);
  327.                 Console.WriteLine(_wariorOne.Name + " Здоровье - " + _wariorOne.Health + " VS "
  328.                     + _warriorTwo.Name + " Здоровье - " + _warriorTwo.Health);
  329.                 Console.WriteLine();
  330.                 Console.ReadKey();
  331.  
  332.                 if (_wariorOne.Health > 0 && _warriorTwo.Health > 0)
  333.                 {
  334.                     _warriorTwo.TakeDamage(_wariorOne.Atack());
  335.                     Console.ReadKey();
  336.                     _wariorOne.TakeDamage(_warriorTwo.Atack());
  337.                     Console.ReadKey();
  338.                 }
  339.  
  340.                 if (_wariorOne.Health <= 0 || _warriorTwo.Health <= 0)
  341.                 {
  342.                     ShowResultFight();
  343.                     inBattle = false;
  344.                 }
  345.  
  346.                 round++;
  347.             }
  348.  
  349.             Console.ReadKey();
  350.         }
  351.  
  352.         private void ShowResultFight()
  353.         {
  354.             if (_wariorOne.Health <= 0 && _warriorTwo.Health <= 0)
  355.             {
  356.                 Console.WriteLine("Оба воина погибли!");
  357.             }
  358.  
  359.             if (_wariorOne.Health <= 0)
  360.             {
  361.                 Console.WriteLine(_wariorOne.Name + " ПРОИГРАЛ!");
  362.             }
  363.             else if (_warriorTwo.Health <= 0)
  364.             {
  365.                 Console.WriteLine(_warriorTwo.Name + " ПРОИГРАЛ!");
  366.             }
  367.         }
  368.  
  369.         private int ReadInt(string convert)
  370.         {
  371.             bool success = int.TryParse(convert, out int number);
  372.  
  373.             while (success == false)
  374.             {
  375.                 Console.Write("Ошибка конвертации, повторите ввод: ");
  376.                 success = int.TryParse(Console.ReadLine(), out number);
  377.             }
  378.             return number;
  379.         }
  380.     }
  381. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement