lovelyvook

Unit_44

Aug 1st, 2024 (edited)
416
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.63 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace Ijunior
  5. {
  6.     internal class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             Arena arena = new Arena();
  11.             arena.Work();
  12.         }
  13.     }
  14.  
  15.     class Arena
  16.     {
  17.         private Fighter _firstFighter;
  18.         private Fighter _secondFigher;
  19.  
  20.         public void Work()
  21.         {
  22.             const string CommandPlay = "1";
  23.             const string CommandExit = "2";
  24.  
  25.             bool isWork = true;
  26.  
  27.             while (isWork)
  28.             {
  29.                 Console.Write($"{CommandPlay} - играть" +
  30.                               $"\n{CommandExit} - выйти" +
  31.                               $"\nВведите номер: ");
  32.  
  33.                 switch (Console.ReadLine())
  34.                 {
  35.                     case CommandPlay:
  36.                         Play();
  37.                         break;
  38.  
  39.                     case CommandExit:
  40.                         isWork = false;
  41.                         break;
  42.  
  43.                     default:
  44.                         Console.WriteLine("Некорректный ввод");
  45.                         break;
  46.                 }
  47.             }
  48.         }
  49.  
  50.         private void CreateFighters(List<Fighter> fighters)
  51.         {
  52.             fighters.Add(new Knight("Рыцарь"));
  53.             fighters.Add(new Paladin("Паладин"));
  54.             fighters.Add(new Barbarian("Варвар"));
  55.             fighters.Add(new Magician("Маг"));
  56.             fighters.Add(new Ninja("Ниндзя"));
  57.         }
  58.  
  59.         private void ShowFighters(List<Fighter> fighters)
  60.         {
  61.             string separator = new string('-', 10);
  62.  
  63.             for (int i = 0; i < fighters.Count; i++)
  64.             {
  65.                 Console.Write(i + 1 + " ");
  66.                 fighters[i].ShowInfo();
  67.                 Console.WriteLine(separator);
  68.             }
  69.         }
  70.  
  71.         private Fighter SelectFighter()
  72.         {
  73.             List<Fighter> fighters = new List<Fighter>();
  74.             Fighter fighter = null;
  75.  
  76.             Console.Clear();
  77.             fighters.Clear();
  78.             CreateFighters(fighters);
  79.             ShowFighters(fighters);
  80.  
  81.             while (fighter == null)
  82.             {
  83.                 Console.Write("Выберите бойца: ");
  84.  
  85.                 if (int.TryParse(Console.ReadLine(), out int number))
  86.                 {
  87.                     if (number > 0 && number <= fighters.Count)
  88.                     {
  89.                         fighter = fighters[number - 1];
  90.                     }
  91.                     else
  92.                     {
  93.                         Console.WriteLine("Такого номера нет");
  94.                     }
  95.                 }
  96.                 else
  97.                 {
  98.                     Console.WriteLine("Некорректный ввод");
  99.                 }
  100.             }
  101.  
  102.             return fighter;
  103.         }
  104.  
  105.         private void Play()
  106.         {
  107.             _firstFighter = SelectFighter();
  108.             _secondFigher = SelectFighter();
  109.  
  110.             Fight();
  111.             ShowResult();
  112.         }
  113.  
  114.         private void Fight()
  115.         {
  116.             int round = 1;
  117.  
  118.             Console.Clear();
  119.  
  120.             while (_firstFighter.Health > 0 && _secondFigher.Health > 0)
  121.             {
  122.                 Console.WriteLine("Раунд: " + round);
  123.                 round++;
  124.  
  125.                 _firstFighter.Attack(_secondFigher);
  126.                 _secondFigher.Attack(_firstFighter);
  127.  
  128.                 Console.WriteLine();
  129.             }
  130.         }
  131.  
  132.         private void ShowResult()
  133.         {
  134.             string separator = new string('*', 5);
  135.  
  136.             Console.Write(separator + " ");
  137.  
  138.             if (_firstFighter.Health <= 0 && _secondFigher.Health <= 0)
  139.             {
  140.                 Console.Write("Ничья. Оба бойца умерли");
  141.             }
  142.             else if (_firstFighter.Health > _secondFigher.Health)
  143.             {
  144.                 Console.Write(_firstFighter.Name + " выиграл");
  145.             }
  146.             else
  147.             {
  148.                 Console.Write(_secondFigher.Name + " выиграл");
  149.             }
  150.  
  151.             Console.WriteLine(" " + separator + "\n");
  152.         }
  153.     }
  154.  
  155.     class Fighter
  156.     {
  157.         public Fighter(string name)
  158.         {
  159.             Name = name;
  160.             Health = CreateHealth();
  161.             Damage = CreateDamage();
  162.         }
  163.  
  164.         public string Name { get; }
  165.         public int Health { get; protected set; }
  166.         public int Damage { get; }
  167.  
  168.         public virtual void Attack(Fighter attackedFighter)
  169.         {
  170.             Console.WriteLine($"{Name} наносит {attackedFighter.Name} урон: {Damage}");
  171.             attackedFighter.TakeDamage(Damage);
  172.         }
  173.  
  174.         public virtual void TakeDamage(int damage)
  175.         {
  176.             Health -= damage;
  177.             Console.WriteLine($"{Name} получает {damage} урона. Здоровье: {Health}");
  178.         }
  179.  
  180.         public void ShowInfo()
  181.         {
  182.             Console.WriteLine($"Имя: {Name} \nЗдоровье: {Health} | Урон: {Damage}");
  183.         }
  184.  
  185.         private int CreateHealth()
  186.         {
  187.             int minHealth = 85;
  188.             int maxHealth = 101;
  189.  
  190.             return Utils.GetRandomNumber(minHealth, maxHealth);
  191.         }
  192.  
  193.         private int CreateDamage()
  194.         {
  195.             int minDamage = 10;
  196.             int maxDamage = 16;
  197.  
  198.             return Utils.GetRandomNumber(minDamage, maxDamage);
  199.         }
  200.     }
  201.  
  202.     class Knight : Fighter
  203.     {
  204.         public Knight(string name) : base(name) { }
  205.  
  206.         public override void Attack(Fighter attackedFighter)
  207.         {
  208.             int minChanceIncreaseDamage = 0;
  209.             int maxChanceIncreaseDamage = 3;
  210.             int percentIncreaseDamage = 2;
  211.  
  212.             if (Utils.GetRandomNumber(minChanceIncreaseDamage, maxChanceIncreaseDamage) == 0)
  213.             {
  214.                 int increaseDamage = Damage * percentIncreaseDamage;
  215.                 Console.WriteLine($"{Name} наносит {attackedFighter.Name} двойной урон: {increaseDamage}");
  216.                 attackedFighter.TakeDamage(increaseDamage);
  217.             }
  218.             else
  219.             {
  220.                 base.Attack(attackedFighter);
  221.             }
  222.         }
  223.     }
  224.  
  225.     class Paladin : Fighter
  226.     {
  227.         private int _counterSpecialAttack;
  228.  
  229.         public Paladin(string name) : base(name)
  230.         {
  231.             _counterSpecialAttack = 0;
  232.         }
  233.  
  234.         public override void Attack(Fighter attackedFighter)
  235.         {
  236.             int triggerSpecialAttack = 3;
  237.             int counterAttack = 2;
  238.  
  239.             _counterSpecialAttack++;
  240.  
  241.             if (_counterSpecialAttack == triggerSpecialAttack)
  242.             {
  243.                 for (int i = 0; i < counterAttack; i++)
  244.                 {
  245.                     Console.WriteLine($"{Name} наносит {attackedFighter.Name} урон: {Damage}");
  246.                     attackedFighter.TakeDamage(Damage);
  247.                 }
  248.  
  249.                 _counterSpecialAttack = 0;
  250.             }
  251.             else
  252.             {
  253.                 base.Attack(attackedFighter);
  254.             }
  255.         }
  256.     }
  257.  
  258.     class Barbarian : Fighter
  259.     {
  260.         private int _heal;
  261.         private int _rage;
  262.  
  263.         public Barbarian(string name) : base(name)
  264.         {
  265.             _heal = 15;
  266.             _rage = 0;
  267.         }
  268.  
  269.         public override void TakeDamage(int damage)
  270.         {
  271.             int triggerHeal = 3;
  272.  
  273.             base.TakeDamage(damage);
  274.  
  275.             if (_rage == triggerHeal)
  276.             {
  277.                 _rage = 0;
  278.                 Health += _heal;
  279.                 Console.WriteLine($"{Name} лечится на {_heal}. Здоровье: {Health}");
  280.             }
  281.             else
  282.             {
  283.                 _rage++;
  284.                 Console.Write("Ярость повышена.\n");
  285.             }
  286.         }
  287.     }
  288.  
  289.     class Magician : Fighter
  290.     {
  291.         private int _mana;
  292.         private int _fireballDamage;
  293.         private int _fireballCost;
  294.  
  295.         public Magician(string name) : base(name)
  296.         {
  297.             _mana = 30;
  298.             _fireballDamage = Damage + 10;
  299.             _fireballCost = 10;
  300.         }
  301.  
  302.         public override void Attack(Fighter attackedFighter)
  303.         {
  304.             if (IsManaEnough())
  305.             {
  306.                 _mana -= _fireballCost;
  307.  
  308.                 Console.WriteLine($"{Name} наносит {attackedFighter.Name} урон заклинанием 'Огненный шар': {_fireballDamage}");
  309.                 attackedFighter.TakeDamage(_fireballDamage);
  310.             }
  311.             else
  312.             {
  313.                 base.Attack(attackedFighter);
  314.             }
  315.         }
  316.  
  317.         private bool IsManaEnough()
  318.         {
  319.             return _mana - _fireballCost >= 0;
  320.         }
  321.     }
  322.  
  323.     class Ninja : Fighter
  324.     {
  325.         public Ninja(string name) : base(name) { }
  326.  
  327.         public override void TakeDamage(int damage)
  328.         {
  329.             int minChanceEvasion = 0;
  330.             int maxChanceEvasion = 5;
  331.  
  332.             if (Utils.GetRandomNumber(minChanceEvasion, maxChanceEvasion) == 0)
  333.             {
  334.                 Console.WriteLine($"{Name} уворачивается от атаки. Здоровье: {Health}");
  335.             }
  336.             else
  337.             {
  338.                 base.TakeDamage(damage);
  339.             }
  340.         }
  341.     }
  342.  
  343.     class Utils
  344.     {
  345.         private static Random s_random = new Random();
  346.  
  347.         public static int GetRandomNumber(int minValue, int maxValue)
  348.         {
  349.             return s_random.Next(minValue, maxValue);
  350.         }
  351.     }
  352. }
Advertisement
Add Comment
Please, Sign In to add comment