JohnJuly

Homework45

Jul 23rd, 2025
334
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.13 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace Colosseum
  5. {
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             Arena arena = new Arena();
  11.             arena.Run();
  12.         }
  13.     }
  14.  
  15.     abstract class Fighter
  16.     {
  17.         public Fighter(string type, string name, int damage, int defense, int health, string uniqueAbilityDescription)
  18.         {
  19.             Type = type;
  20.             Name = name;
  21.             Damage = damage;
  22.             Defense = defense;
  23.             Health = health;
  24.             UniqueAbilityDescription = uniqueAbilityDescription;
  25.         }
  26.  
  27.         public string Type { get; protected set; }
  28.         public string Name { get; protected set; }
  29.         public int Damage { get; protected set; }
  30.         public int Defense { get; protected set; }
  31.         public int Health { get; protected set; }
  32.         public string UniqueAbilityDescription { get; protected set; }
  33.  
  34.         public virtual void Attack(Fighter opponent)
  35.         {
  36.             int inflictedDamage = Math.Max(0, Damage - opponent.Defense);
  37.  
  38.             Console.WriteLine($"{Name} атакует {opponent.Name} и наносит {inflictedDamage} урона.");
  39.             opponent.TakeDamage(inflictedDamage);
  40.         }
  41.  
  42.         public virtual void TakeDamage(int damage)
  43.         {
  44.             Health = Math.Max(0, Health - damage);
  45.             Console.WriteLine($"{Name} получает {damage} урона. Осталось здоровья: {Health}");
  46.         }
  47.  
  48.         public virtual bool IsAlive() => Health > 0;
  49.  
  50.         public virtual string GetShortStats() =>
  51.             $"( Имя: {Name} | Здоровье: {Health} | Урон: {Damage} | Защита: {Defense} | Способность: {UniqueAbilityDescription})";
  52.  
  53.         public virtual void DisplayStats()
  54.         {
  55.             Console.WriteLine($"  Имя: {Name}");
  56.             Console.WriteLine($"  Тип: {Type}");
  57.             Console.WriteLine($"  Урон: {Damage}");
  58.             Console.WriteLine($"  Защита: {Defense}");
  59.             Console.WriteLine($"  Здоровье: {Health}");
  60.             Console.WriteLine($"  Особая способность: {UniqueAbilityDescription}");
  61.         }
  62.     }
  63.  
  64.     class BasicFighter : Fighter
  65.     {
  66.         public BasicFighter(string name, int damage, int defense, int health)
  67.             : base("Воин", name, damage, defense, health, "Нет особых способностей") { }
  68.     }
  69.  
  70.     class DoubleDamageFighter : Fighter
  71.     {
  72.         private int _doubleDamageChance = 30;
  73.         private int _damageMultiplier = 2;
  74.         private int _randomNumberMin = 1;
  75.         private int _randomNumberMax = 100;
  76.  
  77.         public DoubleDamageFighter(string name, int damage, int defense, int health)
  78.             : base("Двойной Урон", name, damage, defense, health, "Имеет шанс нанести удвоенный урон") { }
  79.  
  80.         public override void Attack(Fighter opponent)
  81.         {
  82.             if (UserUtils.GenerateRandomNumber(_randomNumberMin, _randomNumberMax) <= _doubleDamageChance)
  83.             {
  84.                 int doubledDamage = Math.Max(0, Damage * _damageMultiplier - opponent.Defense);
  85.                 Console.WriteLine($"{Name} использует двойной урон и наносит {doubledDamage} урона!");
  86.                 opponent.TakeDamage(doubledDamage);
  87.             }
  88.             else
  89.             {
  90.                 base.Attack(opponent);
  91.             }
  92.         }
  93.     }
  94.  
  95.     class TripleAttackFighter : Fighter
  96.     {
  97.         private int _attackInterval = 3;
  98.         private int _damageMultiplier = 2;
  99.         private int _attackCounter = 0;
  100.  
  101.         public TripleAttackFighter(string name, int damage, int defense, int health)
  102.             : base("Тройная Атака", name, damage, defense, health, "Каждую третью атаку наносит двойной урон") { }
  103.  
  104.         public override void Attack(Fighter opponent)
  105.         {
  106.             _attackCounter++;
  107.             if (_attackCounter % _attackInterval == 0)
  108.             {
  109.                 int doubleDamage = Math.Max(0, Damage * _damageMultiplier - opponent.Defense);
  110.                 Console.WriteLine($"{Name} использует ДВОЙНОЙ УРОН (каждые три атаки) и наносит {doubleDamage} урона!");
  111.                 opponent.TakeDamage(doubleDamage);
  112.             }
  113.             else
  114.             {
  115.                 base.Attack(opponent);
  116.             }
  117.         }
  118.     }
  119.  
  120.     class RageFighter : Fighter
  121.     {
  122.         private int _rage = 0;
  123.         private int _maxRage = 100;
  124.         private int _healingAmount = 30;
  125.         private int _maxHealthValue = 100;
  126.  
  127.         public RageFighter(string name, int damage, int defense, int health)
  128.             : base("Ярость", name, damage, defense, health, "Получая урон накапливает ярость и лечится") { }
  129.  
  130.         public override void TakeDamage(int damage)
  131.         {
  132.             base.TakeDamage(damage);
  133.             _rage = Math.Min(_rage + damage, _maxRage);
  134.  
  135.             if (_rage == _maxRage && Health > 0)
  136.             {
  137.                 int healedAmount = Math.Min(_healingAmount, _maxHealthValue - Health);
  138.                 Health += healedAmount;
  139.                 Console.WriteLine($"{Name} накапливает ярость и использует лечение! Восстановлено {healedAmount} здоровья. Текущее здоровье: {Health}");
  140.                 _rage = 0;
  141.             }
  142.         }
  143.     }
  144.  
  145.     class MageFighter : Fighter
  146.     {
  147.         private int _mana = 100;
  148.         private int _maxMana = 100;
  149.         private int _fireBallCost = 30;
  150.         private int _fireBallDamageMultiplier = 2;
  151.         private int _manaRegenerationAmount = 10;
  152.  
  153.         public MageFighter(string name, int damage, int defense, int health)
  154.             : base("Маг", name, damage, defense, health, "Использует заклинание огненный шар") { }
  155.  
  156.         public override void Attack(Fighter opponent)
  157.         {
  158.             if (_mana >= _fireBallCost)
  159.             {
  160.                 _mana -= _fireBallCost;
  161.                 int fireBallDamage = Math.Max(0, Damage * _fireBallDamageMultiplier - opponent.Defense);
  162.                 Console.WriteLine($"{Name} использует ОГНЕННЫЙ ШАР и наносит {fireBallDamage} урона! Осталось маны: {_mana}");
  163.                 opponent.TakeDamage(fireBallDamage);
  164.             }
  165.             else
  166.             {
  167.                 base.Attack(opponent);
  168.                 _mana = Math.Min(_maxMana, _mana + _manaRegenerationAmount);
  169.                 Console.WriteLine($"{Name} использует обычную атаку. Осталось маны: {_mana}");
  170.             }
  171.         }
  172.     }
  173.  
  174.     class DodgeFighter : Fighter
  175.     {
  176.         private const int DodgeChance = 30;
  177.         private int _randomNumberMin = 1;
  178.         private int _randomNumberMax = 100;
  179.  
  180.         public DodgeFighter(string name, int damage, int defense, int health)
  181.             : base("Уклонение", name, damage, defense, health, "Имеет шанс уклониться от атаки") { }
  182.  
  183.         public override void TakeDamage(int damage)
  184.         {
  185.             if (UserUtils.GenerateRandomNumber(_randomNumberMin, _randomNumberMax) > DodgeChance)
  186.             {
  187.                 base.TakeDamage(damage);
  188.             }
  189.             else
  190.             {
  191.                 Console.WriteLine($"{Name} УКЛОНЯЕТСЯ от атаки!");
  192.             }
  193.         }
  194.     }
  195.  
  196.     class Arena
  197.     {
  198.         private List<Fighter> availableFighters = new List<Fighter>();
  199.  
  200.         public Arena()
  201.         {
  202.             availableFighters.AddRange(new Fighter[]
  203.             {
  204.                 new DoubleDamageFighter("TempleKnight", 15, 5, 100),
  205.                 new TripleAttackFighter("Knight", 12, 7, 110),
  206.                 new RageFighter("Rager", 10, 8, 120),
  207.                 new MageFighter("Sorcerer", 18, 3, 90),
  208.                 new DodgeFighter("Dodger", 11, 6, 105),
  209.                 new BasicFighter("Warrior", 13, 6, 115)
  210.             });
  211.         }
  212.  
  213.         public void Run()
  214.         {
  215.             const string CommandFight = "go";
  216.             const string CommandExitMenu = "exit";
  217.  
  218.             bool isProgramUp = true;
  219.  
  220.             while (isProgramUp)
  221.             {
  222.                 Console.WriteLine("Добро пожаловать на арену Колизея!");
  223.                 Console.WriteLine($"\nВыберите действие: \n1) Введите '{CommandFight}' чтобы посмотреть бой " +
  224.                                   $"\n2) Введите '{CommandExitMenu}' чтобы выйти");
  225.  
  226.                 string userInput = Console.ReadLine();
  227.  
  228.                 switch (userInput)
  229.                 {
  230.                     case CommandFight:
  231.                         ConductFight();
  232.                         break;
  233.  
  234.                     case CommandExitMenu:
  235.                         isProgramUp = false;
  236.                         break;
  237.  
  238.                     default:
  239.                         Console.WriteLine("Неверная команда!!!");
  240.                         break;
  241.                 }
  242.  
  243.                 Console.ReadKey();
  244.                 Console.Clear();
  245.             }
  246.         }
  247.  
  248.         private void ConductFight()
  249.         {
  250.             Console.WriteLine("\nСписок доступных бойцов:");
  251.             for (int i = 0; i < availableFighters.Count; i++)
  252.             {
  253.                 Console.WriteLine($"{i + 1}. {availableFighters[i].Name} ({availableFighters[i].Type}) {availableFighters[i].GetShortStats()}");
  254.             }
  255.  
  256.             Fighter fighter1 = ChooseFighter("первого");
  257.             if (fighter1 == null) return;
  258.  
  259.             Fighter fighter2 = ChooseFighter("второго");
  260.             if (fighter2 == null) return;
  261.  
  262.             StartFight(fighter1, fighter2);
  263.         }
  264.  
  265.         private Fighter ChooseFighter(string ordinalNumber)
  266.         {
  267.             while (true)
  268.             {
  269.                 Console.Write($"Выберите порядковый номер {ordinalNumber} бойца: ");
  270.                 if (int.TryParse(Console.ReadLine(), out int fighterNumber))
  271.                 {
  272.                     if (fighterNumber >= 1 && fighterNumber <= availableFighters.Count)
  273.                     {
  274.                         return CreateFighterCopy(availableFighters[fighterNumber - 1]);
  275.                     }
  276.                     else
  277.                     {
  278.                         Console.WriteLine("Неверный номер бойца. Пожалуйста, выберите номер из списка.");
  279.                     }
  280.                 }
  281.                 else
  282.                 {
  283.                     Console.WriteLine("Неверный ввод. Пожалуйста, введите число.");
  284.                 }
  285.             }
  286.         }
  287.  
  288.         private Fighter CreateFighterCopy(Fighter fighter)
  289.         {
  290.             if (fighter is DoubleDamageFighter)
  291.                 return new DoubleDamageFighter(fighter.Name, fighter.Damage, fighter.Defense, fighter.Health);
  292.             if (fighter is TripleAttackFighter)
  293.                 return new TripleAttackFighter(fighter.Name, fighter.Damage, fighter.Defense, fighter.Health);
  294.             if (fighter is RageFighter)
  295.                 return new RageFighter(fighter.Name, fighter.Damage, fighter.Defense, fighter.Health);
  296.             if (fighter is MageFighter)
  297.                 return new MageFighter(fighter.Name, fighter.Damage, fighter.Defense, fighter.Health);
  298.             if (fighter is DodgeFighter)
  299.                 return new DodgeFighter(fighter.Name, fighter.Damage, fighter.Defense, fighter.Health);
  300.             if (fighter is BasicFighter)
  301.                 return new BasicFighter(fighter.Name, fighter.Damage, fighter.Defense, fighter.Health);
  302.  
  303.             return null;
  304.         }
  305.  
  306.         private void StartFight(Fighter fighter1, Fighter fighter2)
  307.         {
  308.             Console.WriteLine("\n=== Начинается бой! ===");
  309.             Console.WriteLine($"Боец 1: {fighter1.Name} ({fighter1.Type})");
  310.             Console.WriteLine($"Боец 2: {fighter2.Name} ({fighter2.Type})");
  311.  
  312.             int round = 1;
  313.  
  314.             while (fighter1.IsAlive() && fighter2.IsAlive())
  315.             {
  316.                 Console.WriteLine($"\n--- Раунд {round} ---");
  317.  
  318.                 fighter1.Attack(fighter2);
  319.                 if (!fighter2.IsAlive())
  320.                 {
  321.                     Console.WriteLine($"{fighter2.Name} повержен!");
  322.                     break;
  323.                 }
  324.  
  325.                 fighter2.Attack(fighter1);
  326.                 if (!fighter1.IsAlive())
  327.                 {
  328.                     Console.WriteLine($"{fighter1.Name} повержен!");
  329.                     break;
  330.                 }
  331.  
  332.                 Console.WriteLine($"\nСтатистика после раунда {round}:");
  333.                 Console.WriteLine($"  {fighter1.Name}: Здоровье = {fighter1.Health}");
  334.                 Console.WriteLine($"  {fighter2.Name}: Здоровье = {fighter2.Health}");
  335.  
  336.                 Console.WriteLine("\nНажмите любую клавишу для продолжения...");
  337.                 Console.ReadKey();
  338.                 Console.Clear();
  339.                 round++;
  340.             }
  341.  
  342.             Console.WriteLine("\n=== Бой окончен! ===");
  343.             if (fighter1.IsAlive())
  344.             {
  345.                 Console.WriteLine($"Победил {fighter1.Name}!");
  346.             }
  347.             else if (fighter2.IsAlive())
  348.             {
  349.                 Console.WriteLine($"Победил {fighter2.Name}!");
  350.             }
  351.             else
  352.             {
  353.                 Console.WriteLine("Ничья!");
  354.             }
  355.  
  356.             Console.ReadKey();
  357.         }
  358.     }
  359.  
  360.     public static class UserUtils
  361.     {
  362.         private static Random s_random = new Random();
  363.  
  364.         public static int GenerateRandomNumber(int min, int max)
  365.         {
  366.             return s_random.Next(min, max + 1);
  367.         }
  368.     }
  369. }
Advertisement
Add Comment
Please, Sign In to add comment