RedFlys

Home work - coliseum

Dec 24th, 2021 (edited)
1,177
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 14.26 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace Home_Work
  8. {
  9.     class Program
  10.     {
  11.         static void Main(string[] args)
  12.         {
  13.             Coliseum coliseum = new Coliseum();
  14.             coliseum.Work();
  15.         }
  16.     }
  17.  
  18.     class Coliseum
  19.     {        
  20.         private Gladiator _firstGladiator;
  21.         private Gladiator _secondGladiator;
  22.         private int _countFight;
  23.  
  24.         public Coliseum()
  25.         {
  26.             _countFight = 0;          
  27.         }
  28.  
  29.         public void Work()
  30.         {
  31.             ShowGreeting();
  32.             ManageBattles();
  33.             ShowFinish();
  34.         }
  35.  
  36.         private void ShowGreeting()
  37.         {
  38.             Console.WriteLine("Сегодня на бои будет смотреть сам Цезарь. Не разочаруйте его.");
  39.             Console.WriteLine("Вам предстоит выбирать, кто будет сражаться.");
  40.         }
  41.  
  42.         private void ManageBattles()
  43.         {
  44.             bool isWorking = true;
  45.  
  46.             while (isWorking == true)
  47.             {
  48.                 Console.ReadKey();
  49.                 Console.Clear();
  50.  
  51.                 Console.WriteLine("1. Провести бой. \n2. Выйти");
  52.  
  53.                 switch (Console.ReadLine())
  54.                 {
  55.                     case "1":
  56.                         ArrangeFight();
  57.                         break;
  58.  
  59.                     case "2":
  60.                         isWorking = false;
  61.                         break;
  62.  
  63.                     default:
  64.                         Console.WriteLine("Такого варианта нет.");
  65.                         break;
  66.                 }                
  67.             }
  68.         }
  69.        
  70.         private void ArrangeFight()
  71.         {
  72.             ChooseFighters();
  73.             Fight();
  74.             AnnounceWinner();
  75.             _countFight++;
  76.         }
  77.  
  78.         private void ChooseFighters()
  79.         {
  80.             GladiarotCreator gladiarotCreator = new GladiarotCreator();
  81.             _firstGladiator = gladiarotCreator.ChooseGladiator();
  82.             _secondGladiator = gladiarotCreator.ChooseGladiator();
  83.         }
  84.  
  85.         private void Fight()
  86.         {
  87.             while (_firstGladiator.IsAlive == true && _secondGladiator.IsAlive == true)
  88.             {
  89.                 Console.Clear();
  90.  
  91.                 if (_firstGladiator.CanAttack == true)
  92.                 {
  93.                     _firstGladiator.Attack(_secondGladiator);
  94.                 }          
  95.                
  96.                 if (_secondGladiator.CanAttack == true)
  97.                 {
  98.                     _secondGladiator.Attack(_firstGladiator);
  99.                 }
  100.  
  101.                 Console.ReadKey();
  102.             }
  103.         }
  104.  
  105.         private void AnnounceWinner()
  106.         {
  107.             if (_firstGladiator.IsAlive == false && _secondGladiator.IsAlive == false)
  108.             {
  109.                 Console.WriteLine("Случилось невероятное! Ничья!");
  110.             }
  111.             else if (_firstGladiator.IsAlive == true)
  112.             {
  113.                 Console.WriteLine($"Победил {_firstGladiator.FullName}");
  114.             }
  115.             else
  116.             {
  117.                 Console.WriteLine($"Победил {_secondGladiator.FullName}");
  118.             }
  119.         }
  120.  
  121.         private void ShowFinish()
  122.         {
  123.             Console.WriteLine($"Вы провели {_countFight} боёв.");
  124.             Console.WriteLine("Цезарь остался вами доволен. Ваша голова не будет висеть над воротами.");
  125.             Console.ReadKey();
  126.         }
  127.     }
  128.  
  129.     class Gladiator
  130.     {
  131.         protected static Random Random;
  132.         protected static int PresetMaximumPercentage;
  133.  
  134.         protected string ClassName;
  135.         protected string Specification;
  136.         protected string Name;
  137.         protected float Health;
  138.         protected int Damage;
  139.         protected int Armor;
  140.         protected int ChanceSpecialAttack;
  141.         protected int ChanceDodge;
  142.         protected bool IsTied;
  143.  
  144.         static Gladiator()
  145.         {
  146.             Random = new Random();
  147.             PresetMaximumPercentage = 101;            
  148.         }
  149.  
  150.         public Gladiator(string name = "Ноунейм")
  151.         {
  152.             Name = name;
  153.             ClassName = "Нищий";
  154.             Specification = "О нём ничего не известно";
  155.             Health = 50;
  156.             Damage = 50;
  157.             Armor = 1;
  158.             ChanceSpecialAttack = 50;
  159.             ChanceDodge = 50;
  160.             IsTied = false;
  161.         }
  162.  
  163.         public bool IsAlive => Health > 0;
  164.         public bool CanAttack => IsTied == false && IsAlive == true;
  165.         public string FullName => $"{ClassName} {Name}";
  166.  
  167.         public string ShowInfo()
  168.         {
  169.             return $"{ClassName} - {Specification}";
  170.         }
  171.  
  172.         public void TakeDamage(float damage)
  173.         {
  174.             if (IsTied == true)
  175.             {
  176.                 Health -= damage;
  177.                 IsTied = false;
  178.  
  179.                 Console.WriteLine($"{FullName} связан сетью и не может защититься. Получает {damage} урона и освобождается.");                
  180.             }
  181.             else if (ChanceDodge > Random.Next(PresetMaximumPercentage))
  182.             {
  183.                 Console.WriteLine($"{FullName} уклонился от атаки.");
  184.             }
  185.             else
  186.             {
  187.                 float realDamage = damage / Armor;
  188.                 Health -= realDamage;
  189.  
  190.                 Console.WriteLine($"{FullName} защищается и получает {realDamage} урона.");
  191.             }
  192.         }        
  193.  
  194.         public void GetOnNet()
  195.         {
  196.             IsTied = true;
  197.  
  198.             Console.WriteLine($"{FullName} попадается в сети.");
  199.         }
  200.  
  201.         public virtual void Attack(Gladiator gladiator)
  202.         {
  203.             gladiator.TakeDamage(Damage);
  204.         }
  205.     }
  206.  
  207.     class Gaul : Gladiator
  208.     {
  209.         private int _strongHit;
  210.  
  211.         public Gaul(string name) : base(name)
  212.         {
  213.             ClassName = "Галл";
  214.             Specification = "Средние показатели атаки, но хорошая защита. Использует копьё и маленький щит, большая часть тела закрыта броней.";
  215.             Health = 70;
  216.             Damage = 40;
  217.             Armor = 7;
  218.             ChanceSpecialAttack = 50;
  219.             ChanceDodge = 30;
  220.             _strongHit = 80;
  221.         }
  222.  
  223.         public override void Attack(Gladiator gladiator)
  224.         {
  225.             float realDamage;
  226.  
  227.             if (ChanceSpecialAttack > Random.Next(PresetMaximumPercentage))
  228.             {
  229.                 realDamage = _strongHit;
  230.  
  231.                 Console.WriteLine($"{FullName} наносит сильный удар.");
  232.             }
  233.             else
  234.             {
  235.                 realDamage = Damage;
  236.  
  237.                 Console.WriteLine($"{FullName} наносит обычный удар.");
  238.             }
  239.  
  240.            gladiator.TakeDamage(realDamage);
  241.         }
  242.     }
  243.  
  244.     class Diemaher : Gladiator
  245.     {
  246.         private int _damageForAdd;
  247.  
  248.         public Diemaher(string name) : base(name)
  249.         {
  250.             ClassName = "Димахер";
  251.             Specification = "Высокие показатели атаки и слабая защита. Использует 2 меча, почти отсутсвует защита.";
  252.             Health = 60;
  253.             Damage = 100;
  254.             Armor = 2;
  255.             ChanceSpecialAttack = 50;
  256.             ChanceDodge = 75;
  257.             _damageForAdd = 10;
  258.         }
  259.  
  260.         public override void Attack(Gladiator gladiator)
  261.         {
  262.             if (ChanceSpecialAttack > Random.Next(PresetMaximumPercentage))
  263.             {
  264.                 Damage += _damageForAdd;
  265.                
  266.                 Console.WriteLine($"{FullName} начинает бить с большей яростью.");
  267.             }
  268.             else
  269.             {
  270.                 Console.WriteLine($"{FullName} наносит обычный удар.");
  271.             }
  272.  
  273.             gladiator.TakeDamage(Damage);
  274.         }
  275.     }
  276.  
  277.     class Murmillion : Gladiator
  278.     {
  279.         private int _armorForAdd;
  280.  
  281.         public Murmillion(string name) : base(name)
  282.         {
  283.             ClassName = "Мурмиллон";
  284.             Specification = "Самый тяжёлый боец, но слабые атаки. Оснащён одноручным мечом и огромным щитом.";
  285.             Health = 90;
  286.             Damage = 30;
  287.             Armor = 10;
  288.             ChanceSpecialAttack = 50;
  289.             ChanceDodge = 30;
  290.             _armorForAdd = 1;
  291.         }
  292.  
  293.         public override void Attack(Gladiator gladiator)
  294.         {
  295.             if (ChanceSpecialAttack > Random.Next(PresetMaximumPercentage))
  296.             {
  297.                 Armor += _armorForAdd;
  298.  
  299.                 Console.Write($"{FullName} привык к атакам и улучшил защиту. ");
  300.             }
  301.  
  302.             Console.WriteLine($"{FullName} наносит обычный удар.");
  303.  
  304.             gladiator.TakeDamage(Damage);
  305.         }
  306.     }
  307.  
  308.     class Thracian : Gladiator
  309.     {
  310.         private int _countAttack;
  311.  
  312.         public Thracian(string name) : base(name)
  313.         {
  314.             ClassName = "Фракиец";
  315.             Specification = "Средние показатели атаки и защиты. Оснащён одноручным мечом и средним щитом, брони не много.";
  316.             Health = 70;
  317.             Damage = 50;
  318.             Armor = 5;
  319.             ChanceSpecialAttack = 50;
  320.             ChanceDodge = 50;
  321.             _countAttack = 2;
  322.         }
  323.  
  324.         public override void Attack(Gladiator gladiator)
  325.         {
  326.             float realDamage;
  327.  
  328.             if (ChanceSpecialAttack > Random.Next(PresetMaximumPercentage))
  329.             {
  330.                 realDamage = Damage * _countAttack;
  331.  
  332.                 Console.WriteLine($"{FullName} успевает нанести {_countAttack} удара.");
  333.             }
  334.             else
  335.             {
  336.                 realDamage = Damage;
  337.  
  338.                 Console.WriteLine($"{FullName} наносит обычный удар.");
  339.             }
  340.  
  341.             gladiator.TakeDamage(realDamage);
  342.         }
  343.     }
  344.  
  345.     class Retiary : Gladiator
  346.     {
  347.         public Retiary(string name) : base(name)
  348.         {
  349.             ClassName = "Ретиарий";
  350.             Specification = "Слабые показатели атаки и защиты. Оснащён трезубцем и сетью, брони мало.";
  351.             Health = 70;
  352.             Damage = 30;
  353.             Armor = 3;
  354.             ChanceSpecialAttack = 45;
  355.             ChanceDodge = 50;
  356.         }
  357.  
  358.         public override void Attack(Gladiator gladiator)
  359.         {
  360.             if (ChanceSpecialAttack > Random.Next(PresetMaximumPercentage))
  361.             {
  362.                 Console.WriteLine($"{FullName} кидает сеть и ловит противника.");
  363.  
  364.                 gladiator.GetOnNet();
  365.             }
  366.             else
  367.             {
  368.                 float realDamage = Damage;
  369.  
  370.                 Console.WriteLine($"{FullName} наносит обычный удар.");
  371.  
  372.                 gladiator.TakeDamage(realDamage);
  373.             }
  374.         }
  375.     }
  376.  
  377.     class GladiarotCreator
  378.     {
  379.         private List<Gladiator> _allGladiators;
  380.  
  381.         public GladiarotCreator()
  382.         {
  383.             _allGladiators = new List<Gladiator> {
  384.             new Gaul(""),
  385.             new Diemaher(""),
  386.             new Murmillion(""),
  387.             new Thracian(""),
  388.             new Retiary("") };
  389.         }
  390.         public Gladiator ChooseGladiator()
  391.         {
  392.             bool isChoosed = false;
  393.             string name;
  394.  
  395.             Console.Clear();
  396.             Console.Write("Введите, как объявить гладиатора: ");
  397.             name = Console.ReadLine();
  398.  
  399.             while (isChoosed == false)
  400.             {
  401.                 Gladiator gladiator;
  402.  
  403.                 Console.Clear();
  404.                 Console.WriteLine($"Выберите тип гладиатора: ");
  405.                 ShowAllGladiator();
  406.                 gladiator = _allGladiators[GetIndex()];
  407.  
  408.                 switch (gladiator)
  409.                 {
  410.                     case Gaul:
  411.                         return new Gaul(name);
  412.  
  413.                     case Diemaher:
  414.                         return new Diemaher(name);
  415.  
  416.                     case Murmillion:
  417.                         return new Murmillion(name);
  418.  
  419.                     case Thracian:
  420.                         return new Thracian(name);
  421.  
  422.                     case Retiary:
  423.                         return new Retiary(name);
  424.                 }
  425.  
  426.                 Console.ReadKey();
  427.             }
  428.  
  429.             return null;
  430.         }
  431.  
  432.         private void ShowAllGladiator()
  433.         {
  434.             int index = 1;
  435.  
  436.             foreach (Gladiator gladiator in _allGladiators)
  437.             {
  438.                 Console.WriteLine($"{index}. {gladiator.ShowInfo()}");
  439.  
  440.                 index++;
  441.             }
  442.         }
  443.  
  444.         private int GetIndex()
  445.         {
  446.             int index = 0;
  447.             bool isGetIndex = false;
  448.             string userInput;
  449.  
  450.             while (isGetIndex == false)
  451.             {              
  452.                 Console.Write("\nВведите индекс: ");
  453.                 userInput = Console.ReadLine();
  454.  
  455.                 if(Int32.TryParse(userInput, out index))
  456.                 {
  457.                     if (index > 0 && index <= _allGladiators.Count)
  458.                     {
  459.                         isGetIndex = true;
  460.                     }
  461.                     else
  462.                     {
  463.                         Console.WriteLine("Введите индекс гладиатора.");
  464.                     }
  465.                 }
  466.                 else
  467.                 {
  468.                     Console.WriteLine("Введите целое число.");
  469.                 }
  470.             }
  471.  
  472.             return index - 1;
  473.         }
  474.     }
  475. }
Add Comment
Please, Sign In to add comment