Advertisement
VodVas

Гладиаторские бои

Nov 9th, 2023 (edited)
35
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 19.33 KB | Software | 0 0
  1. using System;
  2. using System.Threading.Channels;
  3. using static System.Net.Mime.MediaTypeNames;
  4.  
  5. namespace Гладиаторские_бои
  6. {
  7.     internal class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             Arena arena = new();
  12.  
  13.             arena.Battle();
  14.         }
  15.     }
  16.  
  17.     abstract class Fighter
  18.     {
  19.         private Random _random = new Random();
  20.  
  21.         public Fighter(int id, int health, string name, int damage, int armor)
  22.         {
  23.             Id = id;
  24.             Health = health;
  25.             Name = name;
  26.             Damage = damage;
  27.             Armor = armor;
  28.         }
  29.  
  30.         public int Id { get; protected set; }
  31.         public string Name { get; protected set; }
  32.         public int Health { get; protected set; }
  33.         public int Damage { get; protected set; }
  34.         public int Armor { get; protected set; }
  35.  
  36.         public virtual void ShowStats()
  37.         {
  38.             Console.WriteLine($"<{Id}> {Name}: \n HitPoint: {Health}  Damage: {Damage}  Armor: {Armor}");
  39.         }
  40.  
  41.         public void Attack(Fighter enemy, Fighter fighter)
  42.         {
  43.             UseSpecialAttack(enemy, fighter);
  44.         }
  45.  
  46.         private void UseSpecialAttack(Fighter fighter, Fighter enemy)
  47.         {
  48.             int switchSkill = _random.Next(0, 4);
  49.  
  50.             if (switchSkill == 0)
  51.             {
  52.                 UseSkill1();
  53.             }
  54.             else if (switchSkill == 1)
  55.             {
  56.                 UseSkill2();
  57.             }
  58.             else if (switchSkill == 2)
  59.             {
  60.                 UseSkill3(fighter, enemy);
  61.             }
  62.             else
  63.             {
  64.                 TakeDamage(fighter.Damage);
  65.             }
  66.         }
  67.  
  68.         protected abstract void UseSkill1();
  69.  
  70.         protected abstract void UseSkill2();
  71.  
  72.         protected virtual void UseSkill3(Fighter enemy, Fighter fighter)
  73.         {
  74.             int damageBoost = 10;
  75.             int armorModifier = 2;
  76.  
  77.             enemy.Health -= fighter.Damage + damageBoost - (enemy.Armor / armorModifier);
  78.  
  79.             int finalDamage = fighter.Damage + damageBoost - (enemy.Armor / armorModifier);
  80.  
  81.             Console.ForegroundColor = ConsoleColor.Red;
  82.             Console.WriteLine($"{enemy.Name} получил {finalDamage} урона");
  83.             Console.ForegroundColor = ConsoleColor.White;
  84.         }
  85.  
  86.         protected virtual void TakeDamage(int damage)
  87.         {
  88.             Console.ForegroundColor = ConsoleColor.Red;
  89.             Console.WriteLine($"\nНеудача! {Name} получает {damage - Armor} урона");
  90.             Console.ForegroundColor = ConsoleColor.White;
  91.  
  92.             Health -= (damage - Armor);
  93.         }
  94.     }
  95.  
  96.     class CyborgEngineer : Fighter
  97.     {
  98.         private int _energy;
  99.         private int _damageBuff = 5;
  100.         private int _healthBuff = 10;
  101.         private int _energyDecrease = 25;
  102.         private int _maxEnergyLimit = 76;
  103.         private int _minEnergyLimit = 0;
  104.  
  105.         public CyborgEngineer(int id, int health, string name, int energy, int damage, int armor) : base(id, health, name, damage, armor)
  106.         {
  107.             _energy = energy;
  108.         }
  109.  
  110.         protected override void UseSkill1()
  111.         {
  112.             Console.WriteLine($"\n{Name} использует паровые ускорители, Damage +{_damageBuff}");
  113.  
  114.             Damage += _damageBuff;
  115.         }
  116.  
  117.         protected override void UseSkill2()
  118.         {
  119.             Console.WriteLine($"\n{Name} использует реконструкция: Health +{_healthBuff}, Energy -{_energyDecrease}");
  120.  
  121.             if (_energy > _minEnergyLimit && _energy < _maxEnergyLimit)
  122.             {
  123.                 Health += _healthBuff;
  124.                 _energy -= _energyDecrease;
  125.             }
  126.             else
  127.             {
  128.                 Console.WriteLine("\nНехватка энергии");
  129.             }
  130.         }
  131.  
  132.         protected override void UseSkill3(Fighter fighter, Fighter enemy)
  133.         {
  134.             Console.WriteLine($"\n{Name} использует выстрел из электроружья\n");
  135.  
  136.             base.UseSkill3(fighter, enemy);
  137.         }
  138.  
  139.         public override void ShowStats()
  140.         {
  141.             Console.WriteLine($"<{Id}> {Name}: \n HitPoint: {Health}  Damage: {Damage}  Armor: {Armor} Energy: {_energy}");
  142.         }
  143.     }
  144.  
  145.     class ElectromagneticMage : Fighter
  146.     {
  147.         private Random _random = new Random();
  148.  
  149.         private int _mana;
  150.         private int _armorBuff = 3;
  151.         private int _manaDecrease = 10;
  152.         private int _healthBuff = 10;
  153.         private int _criticalChanceLimit = 20;
  154.         private int _manaLimit = 41;
  155.         private int _manaCheckLimit = 0;
  156.         private int _criticalChanceMin = 0;
  157.         private int _criticalChanceMax = 100;
  158.  
  159.         public ElectromagneticMage(int id, int health, string name, int mana, int damage, int armor) : base(id, health, name, damage, armor)
  160.         {
  161.             _mana = mana;
  162.         }
  163.  
  164.         protected override void UseSkill1()
  165.         {
  166.             Console.WriteLine($"\n{Name} использует магнитное поле: Armor +{_armorBuff}, Mana -{_manaDecrease}");
  167.  
  168.             if (_mana > 0 && _mana < 41)
  169.             {
  170.                 Armor += _armorBuff;
  171.                 _mana -= _manaDecrease;
  172.             }
  173.             else
  174.             {
  175.                 Console.WriteLine("\nНехватка маны");
  176.             }
  177.         }
  178.  
  179.         protected override void UseSkill2()
  180.         {
  181.             Console.Write($"\n{Name} использует электрический щит: ");
  182.  
  183.             int CriticalChance = _random.Next(_criticalChanceMin, _criticalChanceMax);
  184.  
  185.             if (CriticalChance < _criticalChanceLimit && _mana > _manaCheckLimit && _mana < _manaLimit)
  186.             {
  187.                 Console.WriteLine($"...сработал крит шанс! Health +{_healthBuff}, Armor + {_armorBuff}, Mana -{_manaDecrease}");
  188.                 Armor += _armorBuff;
  189.                 Health += _healthBuff;
  190.                 _mana -= _manaDecrease;
  191.             }
  192.             else if (_mana > _manaCheckLimit && _mana < _manaLimit)
  193.             {
  194.                 Console.WriteLine($"Health +{_healthBuff}, Mana -{_manaDecrease}");
  195.                 Health += _healthBuff;
  196.                 _mana -= _manaDecrease;
  197.             }
  198.             else
  199.             {
  200.                 Console.WriteLine("Нехватка маны");
  201.             }
  202.         }
  203.  
  204.         protected override void UseSkill3(Fighter enemy, Fighter fighter)
  205.         {
  206.             Console.WriteLine($"\n{Name} использует Электрическая атака");
  207.  
  208.             base.UseSkill3(enemy, fighter);
  209.         }
  210.  
  211.         public override void ShowStats()
  212.         {
  213.             Console.WriteLine($"<{Id}> {Name}: \n HitPoint: {Health}  Damage: {Damage}  Armor: {Armor} Mana: {_mana}");
  214.         }
  215.     }
  216.  
  217.     class SteamNinja : Fighter
  218.     {
  219.         private int _damageBuff = 10;
  220.         private int _healthDecrease = 10;
  221.         private int _healthLimit = 40;
  222.  
  223.  
  224.         public SteamNinja(int id, int health, string name, int damage, int armor) : base(id, health, name, damage, armor) { }
  225.  
  226.         protected override void UseSkill1()
  227.         {
  228.             Console.WriteLine($"\n{Name} использует заточка катаны: Damage +{_damageBuff}");
  229.  
  230.             Damage += _damageBuff;
  231.         }
  232.  
  233.         protected override void UseSkill2()
  234.         {
  235.             if (Health >= _healthLimit)
  236.             {
  237.                 Console.WriteLine($"\n{Name} использует харакири: Health -{_healthDecrease}, Damage +{_damageBuff}");
  238.  
  239.                 Health -= _healthDecrease;
  240.                 Damage += _damageBuff;
  241.             }
  242.             else
  243.             {
  244.                 UseSkill1();
  245.             }
  246.         }
  247.  
  248.         protected override void UseSkill3(Fighter fighter, Fighter enemy)
  249.         {
  250.             Console.WriteLine($"\n{Name} использует атака катаной");
  251.  
  252.             base.UseSkill3(fighter, enemy);
  253.         }
  254.  
  255.         protected override void TakeDamage(int damage)
  256.         {
  257.             Random random = new Random();
  258.  
  259.             int tryUseAbility = random.Next(0, 2);
  260.  
  261.             if (tryUseAbility == 0)
  262.             {
  263.                 Console.WriteLine($"\n{Name} скрывается в паровом облаке и избегает урона");
  264.             }
  265.             else
  266.             {
  267.                 base.TakeDamage(damage);
  268.             }
  269.         }
  270.     }
  271.  
  272.     class MechanicalAlchemist : Fighter
  273.     {
  274.         private int _steamBomb;
  275.         private int _steamBombDecrease = 1;
  276.         private int _healthBuff = 20;
  277.         private int _armorBuff = 3;
  278.  
  279.         public MechanicalAlchemist(int id, int health, string name, int steamBomb, int damage, int armor) : base(id, health, name, damage, armor)
  280.         {
  281.             _steamBomb = steamBomb;
  282.         }
  283.  
  284.         protected override void UseSkill1()
  285.         {
  286.             Console.WriteLine($"\n{Name} использует эликсир здоровья: Health +{_healthBuff}");
  287.  
  288.             Health += _healthBuff;
  289.         }
  290.  
  291.         protected override void UseSkill2()
  292.         {
  293.             Console.WriteLine($"\n{Name} использует эликсир брони: Armor +{_armorBuff}");
  294.  
  295.             Armor += _armorBuff;
  296.         }
  297.  
  298.         protected override void UseSkill3(Fighter enemy, Fighter fighter)
  299.         {
  300.             Console.WriteLine($"\n{Name} использует паровую бомбу");
  301.  
  302.             if (_steamBomb > 0 && _steamBomb < 6)
  303.             {
  304.                 _steamBomb -= _steamBombDecrease;
  305.  
  306.                 base.UseSkill3(enemy, fighter);
  307.             }
  308.             else
  309.             {
  310.                 Console.WriteLine("\nБомбы закончились");
  311.             }
  312.         }
  313.  
  314.         public override void ShowStats()
  315.         {
  316.             Console.WriteLine($"<{Id}> {Name}: \n HitPoint: {Health}  Damage: {Damage}  Armor: {Armor} Steam bomb: {_steamBomb}");
  317.         }
  318.     }
  319.  
  320.     class HydraulicConjurer : Fighter
  321.     {
  322.         private Random _random = new Random();
  323.  
  324.         private int _armorBuff = 2;
  325.  
  326.         public HydraulicConjurer(int id, int health, string name, int damage, int armor) : base(id, health, name, damage, armor) { }
  327.  
  328.         protected override void UseSkill1()
  329.         {
  330.             Console.WriteLine($"\n{Name} укрепляет гидравлическую броню Armor +{_armorBuff}");
  331.  
  332.             Armor += _armorBuff;
  333.         }
  334.  
  335.         protected override void UseSkill2()
  336.         {
  337.             UseSkill1();
  338.             UseSkill1();
  339.         }
  340.  
  341.         protected override void UseSkill3(Fighter enemy, Fighter fighter)
  342.         {
  343.             int tryCreateTwin = _random.Next(0, 3);
  344.  
  345.             Console.Write("\nПопытка создания двойников...");
  346.  
  347.             if (tryCreateTwin == 0)
  348.             {
  349.                 Console.WriteLine($"{Name} Создает трёх двойников, каждый наносит повышенный урон");
  350.  
  351.                 base.UseSkill3(enemy, fighter);
  352.                 base.UseSkill3(enemy, fighter);
  353.                 base.UseSkill3(enemy, fighter);
  354.             }
  355.             else if (tryCreateTwin == 1)
  356.             {
  357.                 Console.WriteLine($"{Name} Создает четыре двойника, каждый наносит повышенный урон");
  358.  
  359.                 base.UseSkill3(enemy, fighter);
  360.                 base.UseSkill3(enemy, fighter);
  361.                 base.UseSkill3(enemy, fighter);
  362.                 base.UseSkill3(enemy, fighter);
  363.             }
  364.             else
  365.             {
  366.                 Console.WriteLine($"{Name} Создает два двойника, каждый наносит повышенный урон");
  367.                 base.UseSkill3(enemy, fighter);
  368.                 base.UseSkill3(enemy, fighter);
  369.             }
  370.         }
  371.  
  372.         protected override void TakeDamage(int damage)
  373.         {
  374.             int armorModifier = 2;
  375.             int tryCreateIllusion = _random.Next(0, 2);
  376.  
  377.             if (tryCreateIllusion == 0)
  378.             {
  379.                 Console.WriteLine($"\n{Name} создает иллюзию и получает только половину урона");
  380.  
  381.                 Health -= damage / armorModifier;
  382.  
  383.                 Console.WriteLine($"\n{Name} получает {damage / armorModifier} урона");
  384.             }
  385.             else
  386.             {
  387.                 base.TakeDamage(damage);
  388.             }
  389.         }
  390.  
  391.         public override void ShowStats()
  392.         {
  393.             Console.WriteLine($"<{Id}> {Name}: \n HitPoint: {Health}  Damage: {Damage}  Armor: {Armor}");
  394.         }
  395.     }
  396.  
  397.     class Arena
  398.     {
  399.         private Fighter _fighter1;
  400.         private Fighter _fighter2;
  401.  
  402.         private List<Fighter> _fighters = new List<Fighter>();
  403.  
  404.         public Arena()
  405.         {
  406.             FillFightersList();
  407.         }
  408.  
  409.         private void FillFightersList()
  410.         {
  411.             _fighters.Add(new CyborgEngineer(1, 100, "CyborgEngineer", 75, 15, 10));
  412.             _fighters.Add(new SteamNinja(2, 120, "SteamNinja", 20, 5));
  413.             _fighters.Add(new ElectromagneticMage(3, 100, "ElectromagneticMage", 40, 25, 10));
  414.             _fighters.Add(new MechanicalAlchemist(4, 100, "MechanicalAlchemist", 5, 20, 5));
  415.             _fighters.Add(new HydraulicConjurer(5, 100, "HydraulicConjurer", 15, 10));
  416.         }
  417.  
  418.         public void Battle()
  419.         {
  420.             ShowAllFightersStats();
  421.  
  422.             if (TryCreateFighter())
  423.             {
  424.                 Fight();
  425.                 ShowResult();
  426.             }
  427.         }
  428.  
  429.         private bool TryCreateFighter()
  430.         {
  431.             Console.WriteLine("\nБоец 1");
  432.  
  433.             _fighter1 = ChooseFighter();
  434.  
  435.             Console.WriteLine("\nБоец 2");
  436.  
  437.             _fighter2 = ChooseFighter();
  438.  
  439.             if (_fighter1 == null || _fighter2 == null)
  440.             {
  441.                 Console.ForegroundColor = ConsoleColor.Red;
  442.                 Console.WriteLine("Ошибка выбора бойцов");
  443.                 Console.ForegroundColor = ConsoleColor.White;
  444.  
  445.                 _fighters.Clear();
  446.  
  447.                 FillFightersList();
  448.                 TryCreateFighter();
  449.  
  450.                 return true;
  451.             }
  452.             else
  453.             {
  454.                 Console.WriteLine("\nБойцы выбраны");
  455.  
  456.                 return true;
  457.             }
  458.         }
  459.  
  460.         private void Fight()
  461.         {
  462.             int turnNumber = 1;
  463.  
  464.             while (_fighter1.Health > 0 && _fighter2.Health > 0)
  465.             {
  466.                 Console.ForegroundColor = ConsoleColor.DarkYellow;
  467.                 Console.WriteLine($"\nХод номер {turnNumber++}");
  468.                 Console.ForegroundColor = ConsoleColor.White;
  469.  
  470.                 _fighter1.ShowStats();
  471.                 _fighter2.ShowStats();
  472.  
  473.                 if (_fighter1.Health > 0)
  474.                 {
  475.                     _fighter1.Attack(_fighter2, _fighter1);
  476.                 }
  477.  
  478.                 if (_fighter2.Health > 0)
  479.                 {
  480.                     _fighter2.Attack(_fighter1, _fighter2);
  481.                 }
  482.  
  483.                 Thread.Sleep(500);
  484.             }
  485.         }
  486.  
  487.         private void ShowAllFightersStats()
  488.         {
  489.             Console.WriteLine("\nВ мире, где технологии паровых машин и механических устройств слились с боевыми искусствами\n" +
  490.                 "проходит турнир, собравший лучших бойцов со всего мира. Пять уникальных персонажей решили\n" +
  491.                 "принять участие и доказать свое превосходство\n");
  492.             Console.WriteLine("Паровой Киборг-инженер - обладает способность к самовосстановлению, использует электроружье с паровыми ускорителями\n\n" +
  493.                 "Электромагнетический Маг - способен манипулировать электричеством и магнитными полями\n\n" +
  494.                 "Ниндзя-ассасин - скрывается в паровых облаках. Слабо защищен, но имеет большой урон, который может разгонять\n\n" +
  495.                 "Механический алхимик - способен создавать паробомбы и элексиры для усиления\n\n" +
  496.                 "Гидравлический фокусник - может создавать иллюзии, а так же своих двойников, носит гидравлическую броню.\n\n");
  497.  
  498.             for (int i = 0; i < _fighters.Count; i++)
  499.             {
  500.                 Console.ForegroundColor = ConsoleColor.DarkYellow;
  501.                 _fighters[i].ShowStats();
  502.                 Console.ForegroundColor = ConsoleColor.White;
  503.             }
  504.         }
  505.  
  506.         private void ShowResult()
  507.         {
  508.             if (_fighter1.Health < 0 && _fighter2.Health < 0)
  509.             {
  510.                 Console.ForegroundColor = ConsoleColor.DarkGreen;
  511.                 Console.WriteLine("\nНичья");
  512.                 Console.ForegroundColor = ConsoleColor.White;
  513.             }
  514.             else if (_fighter2.Health <= 0)
  515.             {
  516.                 Console.ForegroundColor = ConsoleColor.DarkGreen;
  517.                 Console.WriteLine($"\n{_fighter1.Name} Победил");
  518.                 Console.ForegroundColor = ConsoleColor.White;
  519.  
  520.             }
  521.             else
  522.             {
  523.                 Console.ForegroundColor = ConsoleColor.DarkGreen;
  524.                 Console.WriteLine($"\n{_fighter2.Name} Победил");
  525.                 Console.ForegroundColor = ConsoleColor.White;
  526.             }
  527.         }
  528.  
  529.         private Fighter ChooseFighter()
  530.         {
  531.             Fighter selectFighter = null;
  532.  
  533.             Console.ForegroundColor = ConsoleColor.DarkGreen;
  534.             Console.WriteLine("Выбери героя по ID:");
  535.             Console.ForegroundColor = ConsoleColor.White;
  536.  
  537.             while (selectFighter == null)
  538.             {
  539.                 int userInput = Utility.ReturnInputNumber();
  540.  
  541.                 foreach (var fighter in _fighters)
  542.                 {
  543.                     if (userInput == fighter.Id)
  544.                     {
  545.                         selectFighter = fighter;
  546.  
  547.                         Console.ForegroundColor = ConsoleColor.Blue;
  548.                         Console.WriteLine($"Выбран {fighter.Name}");
  549.                         Console.ForegroundColor = ConsoleColor.White;
  550.  
  551.                         _fighters.Remove(fighter);
  552.  
  553.                         break;
  554.                     }
  555.                 }
  556.             }
  557.  
  558.             return selectFighter;
  559.         }
  560.     }
  561.  
  562.     class Utility
  563.     {
  564.         public static int ReturnInputNumber()
  565.         {
  566.             int number;
  567.  
  568.             while (int.TryParse(Console.ReadLine(), out number) == false)
  569.             {
  570.                 Console.WriteLine("Введено не число, попробуйте еще раз: ");
  571.             }
  572.  
  573.             return number;
  574.         }
  575.     }
  576. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement