Advertisement
SPavelA

OOPTask8ColosseumFighting

Oct 25th, 2024 (edited)
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 19.26 KB | Gaming | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace OOPTask8Fighting
  5. {
  6.     internal class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             Colosseum colosseum = new Colosseum();
  11.  
  12.             colosseum.Work();
  13.         }
  14.     }
  15.  
  16.     public class Colosseum
  17.     {
  18.         private List<Fighter> _fighters = new List<Fighter>();
  19.         private Fighter _fighter1;
  20.         private Fighter _fighter2;
  21.  
  22.         public Colosseum()
  23.         {
  24.             Fill();
  25.         }
  26.  
  27.         public void Work()
  28.         {
  29.             const string CommandShowHelloMessage = "1";
  30.             const string CommandInitiateFighting = "2";
  31.             const string CommandExit = "3";
  32.  
  33.             bool isWorking = true;
  34.             string userInput;
  35.  
  36.             while (isWorking)
  37.             {
  38.                 Console.WriteLine("Добро пожаловать в Колизей!");
  39.                 Console.WriteLine($"{CommandShowHelloMessage} - приветственное сообщение");
  40.                 Console.WriteLine($"{CommandInitiateFighting} - начать схватку");
  41.                 Console.WriteLine($"{CommandExit} - покинуть арену");
  42.                 Console.WriteLine("\nВведите команду: ");
  43.                 userInput = Console.ReadLine();
  44.  
  45.                 switch (userInput)
  46.                 {
  47.                     case CommandShowHelloMessage:
  48.                         ShowHelloMessage();
  49.                         break;
  50.  
  51.                     case CommandInitiateFighting:
  52.                         InitiateFighting();
  53.                         break;
  54.  
  55.                     case CommandExit:
  56.                         isWorking = false;
  57.                         break;
  58.  
  59.                     default:
  60.                         Console.WriteLine("Неизвестная команда");
  61.                         break;
  62.                 }
  63.  
  64.                 Console.WriteLine("\nДля продолжения нажмите любую кнопку");
  65.                 Console.ReadKey();
  66.                 Console.Clear();
  67.             }
  68.         }
  69.  
  70.         private void InitiateFighting()
  71.         {
  72.             ChooseFighters();
  73.             ShowStartFightingInfo();
  74.             ShowFighting();
  75.             ShowFinishFightingInfo();
  76.         }
  77.  
  78.         private void ShowFighting()
  79.         {
  80.             while (_fighter1.Health > 0 && _fighter2.Health > 0)
  81.             {
  82.                 Console.ReadKey();
  83.                 Console.WriteLine("Боец 1 атакует:");
  84.                 _fighter1.Attack(_fighter2);
  85.                 Console.WriteLine("Боец 2 атакует:");
  86.                 _fighter2.Attack(_fighter1);
  87.                 Console.Write("\nБоец 1: ");
  88.                 _fighter1.ShowShortInfo();
  89.                 Console.Write("Боец 2: ");
  90.                 _fighter2.ShowShortInfo();
  91.                 Console.WriteLine();
  92.             }
  93.         }
  94.  
  95.         private void ShowStartFightingInfo()
  96.         {
  97.             Console.Clear();
  98.             Console.WriteLine("\nСегодня бьюьются не на жизнь, а на смерть:\n");
  99.             Console.Write("Боец 1: ");
  100.             _fighter1.ShowInfo();
  101.             Console.Write("Боец 2: ");
  102.             _fighter2.ShowInfo();
  103.             Console.WriteLine("\nДля продолжения битвы нажимайте любую клавишу\n");
  104.         }
  105.  
  106.         private void ShowFinishFightingInfo()
  107.         {
  108.             if (_fighter1.Health < 0 && _fighter2.Health < 0)
  109.             {
  110.                 Console.WriteLine("\nНичья\nОба бойца получили ранения несовместимые с жизнью");
  111.             }
  112.             else if (_fighter1.Health < 0)
  113.             {
  114.                 Console.WriteLine("\nБоец 2 победил:");
  115.                 _fighter2.ShowInfo();
  116.             }
  117.             else if (_fighter2.Health < 0)
  118.             {
  119.                 Console.WriteLine("\nБоец 1 победил:");
  120.                 _fighter1.ShowInfo();
  121.             }
  122.  
  123.             Console.WriteLine();
  124.         }
  125.  
  126.         private void ChooseFighters()
  127.         {
  128.             ShowAllFighters();
  129.             Console.Write("\nВведите номер первого бойца: ");
  130.             _fighter1 = (Fighter)GetFighter().Clone();
  131.             Console.Write("\nВведите номер второго бойца: ");
  132.             _fighter2 = (Fighter)GetFighter().Clone();
  133.         }
  134.  
  135.         private Fighter GetFighter()
  136.         {
  137.             int indexFighter = 0;
  138.             bool isCorrectIndexValue = false;
  139.  
  140.             while (isCorrectIndexValue == false)
  141.             {
  142.                 indexFighter = ReadInt() - 1;
  143.  
  144.                 if (indexFighter >= 0 && indexFighter < _fighters.Count)
  145.                 {
  146.                     isCorrectIndexValue = true;
  147.                 }
  148.                 else
  149.                 {
  150.                     Console.Write("Некорректный номер бойца, попробуйте еще: ");
  151.                 }
  152.             }
  153.  
  154.             return _fighters[indexFighter];
  155.         }
  156.  
  157.         private int ReadInt()
  158.         {
  159.             int inputNumber;
  160.  
  161.             while (int.TryParse(Console.ReadLine(), out inputNumber) == false)
  162.             {
  163.                 Console.Write("Это не число, попробуйте еще раз: ");
  164.             }
  165.  
  166.             return inputNumber;
  167.         }
  168.  
  169.         private void Fill()
  170.         {
  171.             const int MinimumHealth = 1000;
  172.             const int MaximumHealth = 1500;
  173.             const int MinimumArmor = 100;
  174.             const int MaximumArmor = 200;
  175.             const int MinimumDamage = 150;
  176.             const int MaximumDamage = 300;
  177.  
  178.             _fighters.Add(new LuckyDamager(UserUtils.GenerateRandomNumber(MinimumHealth, MaximumHealth),
  179.                                             UserUtils.GenerateRandomNumber(MinimumArmor, MaximumArmor),
  180.                                             UserUtils.GenerateRandomNumber(MinimumDamage, MaximumDamage)));
  181.             _fighters.Add(new LuckyDamager(UserUtils.GenerateRandomNumber(MinimumHealth, MaximumHealth),
  182.                                             UserUtils.GenerateRandomNumber(MinimumArmor, MaximumArmor),
  183.                                             UserUtils.GenerateRandomNumber(MinimumDamage, MaximumDamage)));
  184.             _fighters.Add(new StableDamager(UserUtils.GenerateRandomNumber(MinimumHealth, MaximumHealth),
  185.                                             UserUtils.GenerateRandomNumber(MinimumArmor, MaximumArmor),
  186.                                             UserUtils.GenerateRandomNumber(MinimumDamage, MaximumDamage)));
  187.             _fighters.Add(new StableDamager(UserUtils.GenerateRandomNumber(MinimumHealth, MaximumHealth),
  188.                                             UserUtils.GenerateRandomNumber(MinimumArmor, MaximumArmor),
  189.                                             UserUtils.GenerateRandomNumber(MinimumDamage, MaximumDamage)));
  190.             _fighters.Add(new Healer(UserUtils.GenerateRandomNumber(MinimumHealth, MaximumHealth),
  191.                                             UserUtils.GenerateRandomNumber(MinimumArmor, MaximumArmor),
  192.                                             UserUtils.GenerateRandomNumber(MinimumDamage, MaximumDamage)));
  193.             _fighters.Add(new Healer(UserUtils.GenerateRandomNumber(MinimumHealth, MaximumHealth),
  194.                                             UserUtils.GenerateRandomNumber(MinimumArmor, MaximumArmor),
  195.                                             UserUtils.GenerateRandomNumber(MinimumDamage, MaximumDamage)));
  196.             _fighters.Add(new FireBallDamager(UserUtils.GenerateRandomNumber(MinimumHealth, MaximumHealth),
  197.                                             UserUtils.GenerateRandomNumber(MinimumArmor, MaximumArmor),
  198.                                             UserUtils.GenerateRandomNumber(MinimumDamage, MaximumDamage)));
  199.             _fighters.Add(new FireBallDamager(UserUtils.GenerateRandomNumber(MinimumHealth, MaximumHealth),
  200.                                             UserUtils.GenerateRandomNumber(MinimumArmor, MaximumArmor),
  201.                                             UserUtils.GenerateRandomNumber(MinimumDamage, MaximumDamage)));
  202.             _fighters.Add(new Nimble(UserUtils.GenerateRandomNumber(MinimumHealth, MaximumHealth),
  203.                                             UserUtils.GenerateRandomNumber(MinimumArmor, MaximumArmor),
  204.                                             UserUtils.GenerateRandomNumber(MinimumDamage, MaximumDamage)));
  205.             _fighters.Add(new Nimble(UserUtils.GenerateRandomNumber(MinimumHealth, MaximumHealth),
  206.                                             UserUtils.GenerateRandomNumber(MinimumArmor, MaximumArmor),
  207.                                             UserUtils.GenerateRandomNumber(MinimumDamage, MaximumDamage)));
  208.         }
  209.  
  210.         private void ShowAllFighters()
  211.         {
  212.             int fighterNumber = 1;
  213.  
  214.             Console.WriteLine("Эти величайшие гладиаторы готовы отдать жизнь за твое настроение!\n");
  215.  
  216.             foreach (Fighter fighter in _fighters)
  217.             {
  218.                 Console.Write($"{fighterNumber++} - ");
  219.                 fighter.ShowInfo();
  220.             }
  221.         }
  222.  
  223.         private void ShowHelloMessage()
  224.         {
  225.             Console.Clear();
  226.             Console.WriteLine("Добро пожаловать в Колизей!");
  227.             Console.WriteLine("Здесь собрались самые сильные гладиаторы!");
  228.             Console.WriteLine("И пусть начнется бой и прольется кровь!");
  229.         }
  230.     }
  231.  
  232.     public interface IDamagable
  233.     {
  234.         void TakeDamage(int damage);
  235.     }
  236.  
  237.     public class Fighter : IDamagable
  238.     {
  239.         protected string Title;
  240.         protected string Description;
  241.  
  242.         public Fighter(int health, int armor, int damage)
  243.         {
  244.             Health = health;
  245.             Armor = armor;
  246.             Damage = damage;
  247.         }
  248.  
  249.         public int Health { get; protected set; }
  250.         public int Armor { get; protected set; }
  251.         public int Damage { get; protected set; }
  252.  
  253.         public virtual void Attack(IDamagable fighter)
  254.         {
  255.             Console.WriteLine($"Боец \"{Title}\" наносит урон: {Damage}");
  256.             fighter.TakeDamage(Damage);
  257.         }
  258.  
  259.         public virtual void TakeDamage(int damage)
  260.         {
  261.             int takenDamage = GetTakenDamage(damage);
  262.             Console.WriteLine($"Боец \"{Title}\" защищается и получает урон: {takenDamage}");
  263.             Health -= takenDamage;
  264.         }
  265.  
  266.         private int GetTakenDamage(int damage)
  267.         {
  268.             int takenDamage = damage - Armor;
  269.            
  270.             if (takenDamage < 0)
  271.                 takenDamage = 0;
  272.  
  273.             return takenDamage;
  274.         }
  275.  
  276.         public virtual void ShowInfo()
  277.         {
  278.             Console.WriteLine($"\"{Title}\" - {Description}, здоровье: {Health}, броня: {Armor}, атака: {Damage}");
  279.         }
  280.  
  281.         public void ShowShortInfo()
  282.         {
  283.             Console.WriteLine($"\"{Title}\" здоровье: {Health}");
  284.         }
  285.  
  286.         public virtual Fighter Clone()
  287.         {
  288.             return new Fighter(Health, Armor, Damage);
  289.         }
  290.     }
  291.  
  292.     public class LuckyDamager : Fighter
  293.     {
  294.         private const int DamageMultiplier = 2;
  295.  
  296.         public LuckyDamager(int health, int armor, int damage) : base(health, armor, damage)
  297.         {
  298.             Title = "Счастливый кулак";
  299.             Description = $"имеет шанс нанесения урона умноженного на {DamageMultiplier}";
  300.         }
  301.  
  302.         public override void Attack(IDamagable fighter)
  303.         {
  304.             if (UserUtils.IsLuckyTime())
  305.             {
  306.                 int damage = Damage * DamageMultiplier;
  307.  
  308.                 Console.WriteLine($"Бойцу \"{Title}\" повезло, он наносит урон умноженный на {DamageMultiplier} урон: {damage}");
  309.                 fighter.TakeDamage(damage);
  310.             }
  311.             else
  312.             {
  313.                 base.Attack(fighter);
  314.             }
  315.         }
  316.  
  317.         public override Fighter Clone()
  318.         {
  319.             return new LuckyDamager(Health, Armor, Damage);
  320.         }
  321.     }
  322.  
  323.     public class StableDamager : Fighter
  324.     {
  325.         private const int SuperAttackCount = 3;
  326.         private const int SuperAttackTimes = 2;
  327.  
  328.         private int _attackCount = 1;
  329.  
  330.         public StableDamager(int health, int armor, int damage) : base(health, armor, damage)
  331.         {
  332.             Title = "Крепкий кулак";
  333.             Description = "каждый третий удар дважды атакует";
  334.         }
  335.  
  336.         public override void Attack(IDamagable fighter)
  337.         {
  338.             if (_attackCount++ == SuperAttackCount)
  339.             {
  340.                 _attackCount = 1;
  341.                 Console.WriteLine($"Боец \"{Title}\" накопил сил и бьет {SuperAttackTimes} раз с уроном: {Damage}");
  342.  
  343.                 for (int i = 0; i < SuperAttackTimes; i++)
  344.                 {
  345.                     fighter.TakeDamage(Damage);
  346.                 }
  347.             }
  348.             else
  349.             {
  350.                 base.Attack(fighter);
  351.             }
  352.         }
  353.  
  354.         public override Fighter Clone()
  355.         {
  356.             return new StableDamager(Health, Armor, Damage);
  357.         }
  358.     }
  359.  
  360.     public class Healer : Fighter
  361.     {
  362.         private const int MinimumAngerLevel = 20;
  363.         private const int MaximumAngerLevel = 50;
  364.         private const int MinimumTakenAnger = 5;
  365.         private const int MaximumTakenAnger = 10;
  366.  
  367.         private int _anger = 0;
  368.         private int _maxHealth;
  369.  
  370.         public Healer(int health, int armor, int damage, int angerLevel = 0) : base(health, armor, damage)
  371.         {
  372.             Title = "Лекарь";
  373.             Description = "при получении урона накапливает ярость и лечится";
  374.             _maxHealth = health;
  375.  
  376.             if (angerLevel == 0)
  377.             {
  378.                 angerLevel = UserUtils.GenerateRandomNumber(MinimumAngerLevel, MaximumAngerLevel);
  379.             }
  380.  
  381.             AngerLevel = angerLevel;
  382.  
  383.         }
  384.  
  385.         public int AngerLevel { get; private set; }
  386.  
  387.         public override void TakeDamage(int damage)
  388.         {
  389.             base.TakeDamage(damage);
  390.  
  391.             if(Health > 0)
  392.             {
  393.                 int takenAnger = UserUtils.GenerateRandomNumber(MinimumTakenAnger, MaximumTakenAnger);
  394.                
  395.                 _anger += takenAnger;
  396.                 Console.WriteLine($"Боец {Title} получает заряд ярости: {takenAnger}");
  397.  
  398.                 if (_anger >= AngerLevel)
  399.                 {
  400.                     int takenHealth = UserUtils.GenerateRandomNumber(0, Health);
  401.  
  402.                     Console.WriteLine($"Уровень ярости бойца \"{Title}\" достиг максимума: {AngerLevel}, и его здоровье улучшается на: {takenHealth}");
  403.                     Health += takenHealth;
  404.                     _anger -= AngerLevel;
  405.  
  406.                     if (Health > _maxHealth)
  407.                     {
  408.                         Health = _maxHealth;
  409.                         Console.WriteLine($"Боец {Title} полностью восстановил свое здоровье");
  410.                     }
  411.                 }
  412.             }
  413.         }
  414.  
  415.         public override void ShowInfo()
  416.         {
  417.             Console.WriteLine($"\"{Title}\" - {Description}, здоровье: {Health}, броня: {Armor}, атака: {Damage}, пик ярости: {AngerLevel}");
  418.         }
  419.  
  420.         public override Fighter Clone()
  421.         {
  422.             return new Healer(Health, Armor, Damage, AngerLevel);
  423.         }
  424.     }
  425.  
  426.     public class FireBallDamager : Fighter
  427.     {
  428.         private const int MinimumMana = 50;
  429.         private const int MaximumMana = 100;
  430.         private const int MinimumFireBallMana = 15;
  431.         private const int MaximumFireBallMana = 30;
  432.         private const int MinimumPercentFireBallDamage = 110;
  433.         private const int MaximumPercentFireBallDamage = 150;
  434.         private const int ScalePercent = 100;
  435.  
  436.         public FireBallDamager(int health, int armor, int damage, int mana = 0) : base(health, armor, damage)
  437.         {
  438.             Title = "Огненный шар";
  439.             Description = "метает огненные шары, пока не израсходует всю ману";
  440.  
  441.             if (mana == 0)
  442.             {
  443.                 mana = UserUtils.GenerateRandomNumber(MinimumMana, MaximumMana);
  444.             }
  445.  
  446.             Mana = mana;
  447.         }
  448.  
  449.         public int Mana { get; private set; }
  450.  
  451.         public override void Attack(IDamagable fighter)
  452.         {
  453.             int fireBallMana = UserUtils.GenerateRandomNumber(MinimumFireBallMana, MaximumFireBallMana);
  454.  
  455.             if (fireBallMana <= Mana)
  456.             {
  457.                 int damage = Damage * UserUtils.GenerateRandomNumber(MinimumPercentFireBallDamage, MaximumPercentFireBallDamage) / ScalePercent;
  458.  
  459.                 Console.WriteLine($"Бойцу \"{Title}\" на огненный шар понадобилось {fireBallMana} маны и он наносит урон: {damage}");
  460.                 fighter.TakeDamage(damage);
  461.                 Mana -= fireBallMana;
  462.             }
  463.             else
  464.             {
  465.                 base.Attack(fighter);
  466.             }
  467.         }
  468.  
  469.         public override void ShowInfo()
  470.         {
  471.             Console.WriteLine($"\"{Title}\" - {Description}, здоровье: {Health}, броня: {Armor}, атака: {Damage}, мана: {Mana}");
  472.         }
  473.  
  474.         public override Fighter Clone()
  475.         {
  476.             return new FireBallDamager(Health, Armor, Damage, Mana);
  477.         }
  478.     }
  479.  
  480.     public class Nimble : Fighter
  481.     {
  482.         public Nimble(int health, int armor, int damage) : base(health, armor, damage)
  483.         {
  484.             Title = "Шустрый";
  485.             Description = "имеет шанс уклониться от удара";
  486.         }
  487.  
  488.         public override void TakeDamage(int damage)
  489.         {
  490.             if ( UserUtils.IsLuckyTime())
  491.             {
  492.                 Console.WriteLine($"Боец {Title} ловко уклоняется от удара");
  493.             }
  494.             else
  495.             {
  496.                 base.TakeDamage(damage);
  497.             }
  498.         }
  499.  
  500.         public override Fighter Clone()
  501.         {
  502.             return new Nimble(Health, Armor, Damage);
  503.         }
  504.     }
  505.  
  506.     public class UserUtils
  507.     {
  508.         private const int MinimumPercent = 0;
  509.         private const int MaximumPercent = 100;
  510.         private const int HalfPercent = 50;
  511.  
  512.         private static Random s_random = new Random();
  513.        
  514.         public static int GenerateRandomNumber(int minimumNumber, int maximumNumber)
  515.         {
  516.             return s_random.Next(minimumNumber, maximumNumber);
  517.         }
  518.  
  519.         public static bool IsLuckyTime()
  520.         {
  521.             return s_random.Next(MinimumPercent, MaximumPercent) > HalfPercent;
  522.         }
  523.     }
  524. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement