NikaBang

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

Feb 13th, 2026 (edited)
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.44 KB | Gaming | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Drawing;
  4. using System.Reflection;
  5.  
  6. internal class Program
  7. {
  8.     static void Main(string[] args)
  9.     {
  10.         Arena arena = new Arena();
  11.         arena.Run();
  12.     }
  13. }
  14.  
  15. public static class UserUtils
  16. {
  17.     private static Random s_random = new Random();
  18.  
  19.     public static bool GenerateRandomNumber(int chancePercent)
  20.     {
  21.         int minRandom = 0;
  22.         int maxRandom = 100;
  23.  
  24.         return chancePercent >= s_random.Next(minRandom, maxRandom+1);
  25.     }
  26. }
  27.  
  28. public interface IDamageable
  29. {
  30.     bool IsAlive { get; }
  31.     void TakeDamage(int damage);
  32. }
  33.  
  34. public abstract class Fighter : IDamageable
  35. {
  36.     protected Fighter(string name, int damage, int defense, int maxHealth)
  37.     {
  38.         Name = name;
  39.         Damage = damage;
  40.         Defense = defense;
  41.         MaxHealth = maxHealth;
  42.         Health = maxHealth;
  43.     }
  44.  
  45.     public string Name { get; protected set; }
  46.     public int Damage { get; protected set; }
  47.     public int Defense { get; protected set; }
  48.     public int Health { get; protected set; }
  49.     public int MaxHealth { get; protected set; }
  50.  
  51.     public bool IsAlive => Health > 0;
  52.  
  53.     public virtual void TakeDamage(int damage)
  54.     {
  55.         int finalDamage = damage - Defense;
  56.  
  57.         if (finalDamage < 0)
  58.             finalDamage = 0;
  59.  
  60.         Health -= finalDamage;
  61.  
  62.         if (Health < 0)
  63.             Health = 0;
  64.  
  65.         Console.WriteLine($"{Name} получает {finalDamage} урона. Текущее здоровье: {Health}/{MaxHealth}");
  66.     }
  67.  
  68.     public abstract Fighter Clone();
  69.  
  70.     public abstract void Attack(IDamageable target);
  71.  
  72.     public virtual void PrintStats()
  73.     {
  74.         Console.WriteLine(
  75.             $"{Name}: Здоровье {Health}/{MaxHealth}, Урон {Damage}, Защита {Defense}");
  76.     }
  77.  
  78.     protected int BaseAttackDamage()
  79.     {
  80.         return Damage;
  81.     }
  82. }
  83.  
  84. public class CritFighter : Fighter
  85. {
  86.     private int _critChancePercent;
  87.     private int _critMultiplier;
  88.     public CritFighter(string name, int damage, int defense, int maxHealth) : base(name, damage, defense, maxHealth)
  89.     {
  90.         _critChancePercent = 20;
  91.         _critMultiplier = 3;
  92.     }
  93.  
  94.     public override Fighter Clone()
  95.     {
  96.         return new CritFighter(Name, Damage, Defense, MaxHealth);
  97.     }
  98.  
  99.     public override void Attack(IDamageable target)
  100.     {
  101.         int damage = BaseAttackDamage();
  102.         bool isCrit = UserUtils.GenerateRandomNumber(_critChancePercent);
  103.  
  104.         if (isCrit)
  105.         {
  106.             damage *= _critMultiplier;
  107.  
  108.             Console.WriteLine($"{Name} наносит КРИТИЧЕСКИЙ удар!");
  109.         }
  110.         else
  111.         {
  112.             Console.WriteLine($"{Name} атакует противника.");
  113.         }
  114.  
  115.         target.TakeDamage(damage);
  116.     }
  117. }
  118.  
  119. public class BurstFighter : Fighter
  120. {
  121.     private int _attackCounter = 0;
  122.  
  123.     public BurstFighter(string name, int damage, int defense, int maxHealth) : base(name, damage, defense, maxHealth)
  124.     {
  125.     }
  126.  
  127.     public override Fighter Clone()
  128.     {
  129.         return new BurstFighter(Name, Damage, Defense, MaxHealth);
  130.     }
  131.  
  132.     public override void Attack(IDamageable target)
  133.     {
  134.         int seriesOfBlows = 3;
  135.         int damage = BaseAttackDamage();
  136.         _attackCounter++;
  137.  
  138.         if (_attackCounter % seriesOfBlows == 0)
  139.         {
  140.             Console.WriteLine($"{Name} проводит серию ударов! Двойная атака!");
  141.             target.TakeDamage(damage);
  142.  
  143.             _attackCounter = 0;
  144.         }
  145.         else
  146.         {
  147.             Console.WriteLine($"{Name} атакует противника.");
  148.         }
  149.  
  150.         target.TakeDamage(damage);
  151.     }
  152. }
  153.  
  154. public class RageFighter : Fighter
  155. {
  156.     private int _rage;
  157.     private int _maxRage;
  158.     private int _healAmount;
  159.  
  160.     public RageFighter(string name, int damage, int defense, int maxHealth) : base(name, damage, defense, maxHealth)
  161.     {
  162.         _rage = 0;
  163.         _maxRage = 40;
  164.         _healAmount = 15;
  165.     }
  166.  
  167.     public override Fighter Clone()
  168.     {
  169.         return new RageFighter(Name, Damage, Defense, MaxHealth);
  170.     }
  171.  
  172.     public override void TakeDamage(int damage)
  173.     {
  174.         int beforeHealth = Health;
  175.         int criticalHealth = 25;
  176.  
  177.         base.TakeDamage(damage);
  178.  
  179.         int taken = beforeHealth - Health;
  180.  
  181.         if (taken > 0)
  182.         {
  183.             _rage += taken;
  184.  
  185.             if (Health < criticalHealth)
  186.                 _rage += taken;
  187.  
  188.             if (_rage > _maxRage)
  189.                 _rage = _maxRage;
  190.  
  191.             Console.WriteLine($"{Name} накапливает ярость: {_rage}/{_maxRage}");
  192.         }
  193.         if (_rage >= _maxRage && IsAlive)
  194.         {
  195.             _rage = 0;
  196.             Health += _healAmount;
  197.  
  198.             if (Health > MaxHealth)
  199.                 Health = MaxHealth;
  200.  
  201.             Console.WriteLine($"{Name} впадает в ярость и исцеляется на {_healAmount} HP. Текущее здоровье: {Health}/{MaxHealth}");
  202.         }
  203.     }
  204.  
  205.     public override void Attack(IDamageable target)
  206.     {
  207.         int damage = BaseAttackDamage();
  208.  
  209.         target.TakeDamage(damage);
  210.     }
  211. }
  212.  
  213. public class MageFighter : Fighter
  214. {
  215.     private int _maxMana;
  216.     private int _mana;
  217.     private int _fireballCost;
  218.     private int _fireballDamage;
  219.  
  220.     public MageFighter(string name, int damage, int defense, int maxHealth) : base(name, damage, defense, maxHealth)
  221.     {
  222.         _maxMana = 100;
  223.         _mana = _maxMana;
  224.         _fireballCost = 35;
  225.         _fireballDamage = 10;
  226.     }
  227.  
  228.     public override Fighter Clone()
  229.     {
  230.         return new MageFighter(Name, Damage, Defense, MaxHealth);
  231.     }
  232.  
  233.     public override void Attack(IDamageable target)
  234.     {
  235.         int damage = BaseAttackDamage();
  236.  
  237.         if (_fireballCost <= _mana)
  238.         {
  239.             _mana -= _fireballCost;
  240.  
  241.             damage += _fireballDamage;
  242.  
  243.             target.TakeDamage(damage);
  244.  
  245.             Console.WriteLine($"{Name} использует заклинание \"Огненный шар\" и наносит повышенный урон!");
  246.         }
  247.         else
  248.         {
  249.             Console.WriteLine($"{Name} атакует обычной атакой (недостаточно маны для огненного шара).");
  250.  
  251.             target.TakeDamage(damage);
  252.         }
  253.     }
  254. }
  255.  
  256. public class DodgeFighter : Fighter
  257. {
  258.     private int _dodgeChancePercent;
  259.  
  260.     public DodgeFighter(string name, int damage, int defense, int maxHealth) : base(name, damage, defense, maxHealth)
  261.     {
  262.         _dodgeChancePercent = 20;
  263.     }
  264.  
  265.     public override Fighter Clone()
  266.     {
  267.         return new DodgeFighter(Name, Damage, Defense, MaxHealth);
  268.     }
  269.  
  270.     public override void TakeDamage(int damage)
  271.     {
  272.         if (UserUtils.GenerateRandomNumber(_dodgeChancePercent))
  273.         {
  274.             Console.WriteLine($"{Name} ловко уклоняется от атаки и не получает урона!");
  275.         }
  276.         else
  277.         {
  278.             base.TakeDamage(damage);
  279.         }
  280.     }
  281.  
  282.     public override void Attack(IDamageable target)
  283.     {
  284.         int damage = BaseAttackDamage();
  285.  
  286.         target.TakeDamage(damage);
  287.     }
  288. }
  289.  
  290. public class Arena
  291. {
  292.     private List<Fighter> _fighters = new List<Fighter>();
  293.  
  294.     public Arena()
  295.     {
  296.         _fighters.Add(new CritFighter("Критик", 14, 5, 100));
  297.         _fighters.Add(new BurstFighter("Берсерк", 12, 6, 120));
  298.         _fighters.Add(new RageFighter("Ярость", 15, 7, 80));
  299.         _fighters.Add(new MageFighter("Маг", 20, 4, 100));
  300.         _fighters.Add(new DodgeFighter("Ловкач", 20, 8, 90));
  301.     }
  302.  
  303.     public void Run()
  304.     {
  305.         const string CommandShowWelcome = "1";
  306.         const string CommandShowFighters = "2";
  307.         const string CommandExit = "3";
  308.  
  309.         bool isRun = true;
  310.  
  311.         ShowWelcome();
  312.  
  313.         while (isRun)
  314.         {
  315.             Console.Clear();
  316.             Console.WriteLine($"Главное меню:\n" +
  317.                 $"{CommandShowWelcome} - Приветственное сообщение.\n" +
  318.                 $"{CommandShowFighters} - Посмотреть бой.\n" +
  319.                 $"{CommandExit} - Выход из программы.\n" +
  320.                 $"Ваш выбор: ");
  321.  
  322.             switch (Console.ReadLine())
  323.             {
  324.                 case CommandShowWelcome:
  325.                     ShowWelcome();
  326.                     break;
  327.  
  328.                 case CommandShowFighters:
  329.                     ShowFight();
  330.                     break;
  331.  
  332.                 case CommandExit:
  333.                     isRun = false;
  334.                     break;
  335.  
  336.                 default:
  337.                     Console.WriteLine("Ошибка ввода.");
  338.                     break;
  339.             }
  340.  
  341.             Console.WriteLine("Программа завершена.");
  342.         }
  343.     }
  344.  
  345.     private void ShowWelcome()
  346.     {
  347.         Console.Clear();
  348.         Console.WriteLine("" +
  349.             "╔══════════════════════════════════════╗\n" +
  350.             "║  Добро пожаловать на арену Колизея!  ║\n" +
  351.             "╚══════════════════════════════════════╝");
  352.         Console.ReadKey();
  353.     }
  354.  
  355.     private void ShowFight()
  356.     {
  357.         Console.Clear();
  358.  
  359.         ShowFighters();
  360.  
  361.         Console.Write("выбери первого бойца: ");
  362.         Fighter fighter1 = ChooseFighter();
  363.  
  364.         Console.Write("Выбери второго бойца: ");
  365.         Fighter fighter2 = ChooseFighter();
  366.  
  367.         FightToDeath(fighter1, fighter2);
  368.  
  369.         Console.ReadKey(true);
  370.     }
  371.  
  372.     private void FightToDeath(Fighter fighter1, Fighter fighter2)
  373.     {
  374.         while (fighter1.IsAlive && fighter2.IsAlive)
  375.         {
  376.             fighter1.Attack(fighter2);
  377.             Console.WriteLine();
  378.             fighter2.Attack(fighter1);
  379.         }
  380.  
  381.         Fighter? winner = fighter1.IsAlive ? fighter1 : fighter2.IsAlive ? fighter2 : null;
  382.         Console.WriteLine(winner != null
  383.             ? $"Победил {winner.Name}"
  384.             : "Оба бойца погибли! Ничья!");
  385.     }
  386.  
  387.     private void ShowFighters()
  388.     {
  389.         for (int i = 0; i < _fighters.Count; i++)
  390.         {
  391.             Console.Write(i + 1 + ". ");
  392.             _fighters[i].PrintStats();
  393.             Console.WriteLine();
  394.         }
  395.     }
  396.  
  397.     private Fighter ChooseFighter()
  398.     {
  399.         int userInput;
  400.         int indexFighter;
  401.         bool isValid;
  402.  
  403.         do
  404.         {
  405.             userInput = ReadNumber();
  406.             isValid = userInput > 0 && userInput <= _fighters.Count;
  407.  
  408.             if (isValid == false)
  409.             {
  410.                 Console.Write("Нет бойца под таким номером. Попробуйте ещё раз: ");
  411.             }
  412.         }
  413.         while (isValid == false);
  414.  
  415.         indexFighter = userInput - 1;
  416.         return _fighters[indexFighter].Clone();
  417.     }
  418.  
  419.     private int ReadNumber()
  420.     {
  421.         int number;
  422.  
  423.         while (int.TryParse(Console.ReadLine(), out number) == false)
  424.         {
  425.             Console.Write("Это не число. Попробуйте ещё раз: ");
  426.         }
  427.  
  428.         return number;
  429.     }
  430. }
Advertisement
Add Comment
Please, Sign In to add comment