Advertisement
TravaMan

Basic_Task26

Jan 1st, 2020
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 12.87 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace Basic_Task26
  5. {
  6.     class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             List<Fighter> fighters = new List<Fighter>();
  11.             fighters.Add(new Fighter("Коричневый меч"));
  12.             fighters.Add(new Berserk("Бешеный Джони"));
  13.             fighters.Add(new Knight("Металлическая бошка"));
  14.             fighters.Add(new WarriorOfBlood("Красный брызг"));
  15.             fighters.Add(new Monk("Спокойный кулак"));
  16.  
  17.             List<Fighter> choosenFighters = new List<Fighter>();
  18.             while (choosenFighters.Count != 2)
  19.             {
  20.                 Console.Clear();
  21.                 for (int i = 0; i < fighters.Count; i++)
  22.                 {
  23.                     Console.Write($"{i+1}. ");
  24.                     fighters[i].ShowFullInfo();
  25.                     Console.WriteLine();
  26.                 }
  27.                 int number = ReadNumberFighter("Введите номер бойца: ", fighters.Count);
  28.  
  29.                 choosenFighters.Add(fighters[number - 1]);
  30.                 fighters.RemoveAt(number - 1);
  31.             }
  32.  
  33.             while(true)
  34.             {
  35.                 choosenFighters[0].ShowInfo();
  36.                 int damage = choosenFighters[0].Hit();
  37.                 Console.WriteLine();
  38.                 Console.WriteLine(choosenFighters[1].toString());
  39.                 if (choosenFighters[1].TakeHit(damage))
  40.                 {
  41.                     break;
  42.                 }
  43.                 Console.WriteLine();
  44.  
  45.                 choosenFighters[1].ShowInfo();
  46.                 damage = choosenFighters[1].Hit();
  47.                 Console.WriteLine();
  48.                 Console.WriteLine(choosenFighters[0].toString());
  49.                 if (choosenFighters[0].TakeHit(damage))
  50.                 {
  51.                     break;
  52.                 }
  53.                 Console.WriteLine();
  54.             }
  55.  
  56.             if (choosenFighters[0].isDead)
  57.             {
  58.                 Console.WriteLine($"{choosenFighters[0].toString()} проиграл");
  59.             } else
  60.             {
  61.                 Console.WriteLine($"{choosenFighters[1].toString()} проиграл");
  62.             }
  63.         }
  64.  
  65.         static int ReadNumberFighter(string str, int max)
  66.         {
  67.             int output = 0;
  68.             string input;
  69.  
  70.             while (true)
  71.             {
  72.                 Console.Write(str);
  73.                 input = Console.ReadLine();
  74.                 Console.Clear();
  75.  
  76.                 if (int.TryParse(input, out output) && output <= max && output > 0)
  77.                 {
  78.                     return output;
  79.                 }
  80.                 else
  81.                 {
  82.                     Console.WriteLine("Введено не верное значение, попробуйте еще!");
  83.                 }
  84.             }
  85.         }
  86.     }
  87.  
  88.     class Fighter
  89.     {
  90.         protected static Random rnd = new Random();
  91.  
  92.         protected string _name;
  93.         protected int _maxHP;
  94.         protected int _currentHP;
  95.         protected int _defence;
  96.         protected int _minDamage;
  97.         protected int _spreadDamage;
  98.         protected int _chanceDodge;
  99.         protected int _chanceBlock;
  100.         protected int _chanceCritical;
  101.  
  102.         public bool isDead => _currentHP <= 0;
  103.         public Fighter(string name, int maxHP, int defence, int minDamage, int spreadDamage, int chanceDodge, int chanceBlock, int chanceCritical)
  104.         {
  105.             _name = name;
  106.  
  107.             if (maxHP <= 0)
  108.             {
  109.                 maxHP = 1;
  110.             }
  111.             _maxHP = maxHP;
  112.             _currentHP = maxHP;
  113.  
  114.             if (defence < 0)
  115.             {
  116.                 defence = 0;
  117.             }
  118.             _defence = defence;
  119.  
  120.             if (minDamage <= 0)
  121.             {
  122.                 minDamage = 1;
  123.             }
  124.             _minDamage = minDamage;
  125.  
  126.             if (spreadDamage < 0)
  127.             {
  128.                 spreadDamage = 0;
  129.             }
  130.             _spreadDamage = spreadDamage;
  131.  
  132.             _chanceDodge = CorrectChance(chanceDodge);
  133.             _chanceBlock = CorrectChance(chanceBlock);
  134.             _chanceCritical = CorrectChance(chanceCritical);
  135.         }
  136.        
  137.         public Fighter(string name)
  138.         {
  139.             _name = name;
  140.  
  141.             _maxHP = rnd.Next(80, 151);
  142.             _currentHP = _maxHP;
  143.  
  144.             _defence = rnd.Next(5, 21);
  145.  
  146.             _minDamage = rnd.Next(10, 21);
  147.             _spreadDamage = rnd.Next(3, 11);
  148.  
  149.             _chanceDodge = rnd.Next(10, 21);
  150.             _chanceBlock = rnd.Next(10, 36);
  151.             _chanceCritical = rnd.Next(15, 26);
  152.         }
  153.  
  154.         protected Fighter()
  155.         {
  156.  
  157.         }
  158.         protected int CorrectChance(int chance)
  159.         {
  160.             if (chance < 0)
  161.             {
  162.                 chance = 0;
  163.             }
  164.             if (chance > 100)
  165.             {
  166.                 chance = 100;
  167.             }
  168.             return chance;
  169.         }
  170.  
  171.         protected int Dodge(int damage)
  172.         {
  173.             if (_chanceDodge >= rnd.Next(1, 101))
  174.             {
  175.                 Console.WriteLine("Уклонился");
  176.                 return 0;
  177.             } else
  178.             {
  179.                 return damage;
  180.             }
  181.         }
  182.  
  183.         protected virtual int Block(int damage)
  184.         {
  185.             if (_chanceBlock >= rnd.Next(1, 101))
  186.             {
  187.                 Console.WriteLine("Заблокировал");
  188.                 return damage / 2;
  189.             } else
  190.             {
  191.                 return damage;
  192.             }
  193.         }
  194.  
  195.         protected virtual int Critical(int damage)
  196.         {
  197.             if (_chanceCritical >= rnd.Next(1, 101))
  198.             {
  199.                 Console.WriteLine("Критический удар!");
  200.                 return damage * 2;
  201.             }
  202.             else
  203.             {
  204.                 return damage;
  205.             }
  206.         }
  207.  
  208.         protected virtual int Damage()
  209.         {
  210.             Console.WriteLine("Наносит удар");
  211.             return Critical(_minDamage + SpreadDamage());
  212.         }
  213.  
  214.         protected virtual int SpreadDamage()
  215.         {
  216.             return rnd.Next(_spreadDamage + 1);
  217.         }
  218.  
  219.         public virtual int Hit()
  220.         {
  221.             return Damage();
  222.         }
  223.  
  224.         public virtual bool TakeHit(int damage)
  225.         {            
  226.             damage = Dodge(damage);
  227.             if (damage != 0)
  228.             {
  229.                 damage = Block(damage - _defence);
  230.                 if (damage > 0)
  231.                 {
  232.                     _currentHP -= damage;
  233.                 }
  234.             }
  235.             return isDead;
  236.         }
  237.  
  238.         public virtual void ShowFullInfo()
  239.         {
  240.             Console.WriteLine($"{toString()} - {_currentHP}/{_maxHP};\n Атака: {_minDamage} - {_minDamage + _spreadDamage}; Защита: {_defence};\n"
  241.                 + $"Уклонение - {_chanceDodge}%; Блокирование - {_chanceBlock}%; Критический удар - {_chanceCritical}%;");
  242.         }
  243.  
  244.         public virtual void ShowInfo()
  245.         {
  246.             Console.WriteLine($"{toString()} - {_currentHP}/{_maxHP}");
  247.         }
  248.  
  249.         public virtual string toString()
  250.         {
  251.             return $"{_name} (Воин)";
  252.         }
  253.     }
  254.  
  255.     class Berserk : Fighter
  256.     {
  257.         public Berserk(string name, int maxHP, int defence, int minDamage, int spreadDamage, int chanceDodge, int chanceBlock, int chanceCritical)
  258.             : base(name, maxHP, defence, minDamage, spreadDamage, chanceDodge, chanceBlock, chanceCritical) { }
  259.         public Berserk(string name) : base ()
  260.         {
  261.             _name = name;
  262.  
  263.             _maxHP = rnd.Next(100, 201);
  264.             _currentHP = _maxHP;
  265.  
  266.             _defence = rnd.Next(0, 13);
  267.  
  268.             _minDamage = rnd.Next(5, 21);
  269.             _spreadDamage = rnd.Next(5, 16);
  270.  
  271.             _chanceDodge = rnd.Next(10, 26);
  272.             _chanceBlock = rnd.Next(5, 21);
  273.             _chanceCritical = rnd.Next(15, 26);
  274.         }
  275.  
  276.         public override int Hit()
  277.         {
  278.             return Damage() + SecondHit();
  279.         }
  280.  
  281.         public int SecondHit()
  282.         {
  283.             Console.WriteLine("Наносит дополнительный удар");
  284.             return Critical(SpreadDamage() + SpreadDamage());
  285.         }
  286.  
  287.         public override string toString()
  288.         {
  289.             return $"{_name} (Варвар)";
  290.         }
  291.  
  292.         public override void ShowFullInfo()
  293.         {
  294.             Console.WriteLine($"{toString()} - {_currentHP}/{_maxHP};\n Атака: {_minDamage} - {_minDamage + _spreadDamage * 3}; Защита: {_defence};\n"
  295.                 + $"Уклонение - {_chanceDodge}%; Блокирование - {_chanceBlock}%; Критический удар - {_chanceCritical}%;");
  296.         }
  297.     }
  298.  
  299.     class Knight : Fighter
  300.     {
  301.         public Knight(string name, int maxHP, int defence, int minDamage, int spreadDamage, int chanceDodge, int chanceBlock, int chanceCritical)
  302.             : base(name, maxHP, defence, minDamage, spreadDamage, chanceDodge, chanceBlock, chanceCritical) { }
  303.         public Knight(string name) : base()
  304.         {
  305.             _name = name;
  306.  
  307.             _maxHP = rnd.Next(120, 251);
  308.             _currentHP = _maxHP;
  309.  
  310.             _defence = rnd.Next(8, 21);
  311.  
  312.             _minDamage = rnd.Next(5, 13);
  313.             _spreadDamage = rnd.Next(2, 11);
  314.  
  315.             _chanceDodge = rnd.Next(5, 21);
  316.             _chanceBlock = rnd.Next(15, 36);
  317.             _chanceCritical = rnd.Next(10, 21);
  318.         }
  319.  
  320.         public override bool TakeHit(int damage)
  321.         {
  322.             damage = Dodge(damage);
  323.             if (damage != 0)
  324.             {
  325.                 damage = Block(damage - Reflex());
  326.                 if (damage > 0)
  327.                 {
  328.                     _currentHP -= damage;
  329.                 }
  330.             }
  331.             return isDead;
  332.         }
  333.  
  334.         public int Reflex()
  335.         {
  336.             if (35 <= rnd.Next(1, 101))
  337.             {
  338.                 Console.WriteLine("Сработали рефлексы");
  339.                 return _defence * 2;
  340.             } else
  341.             {
  342.                 return _defence;
  343.             }
  344.         }
  345.  
  346.         public override string toString()
  347.         {
  348.             return $"{_name} (Рыцарь)";
  349.         }
  350.     }
  351.  
  352.     class WarriorOfBlood : Fighter
  353.     {
  354.         public WarriorOfBlood(string name, int maxHP, int defence, int minDamage, int spreadDamage, int chanceDodge, int chanceBlock, int chanceCritical)
  355.             : base(name, maxHP, defence, minDamage, spreadDamage, chanceDodge, chanceBlock, chanceCritical) { }
  356.  
  357.         public WarriorOfBlood(string name) : base()
  358.         {
  359.             _name = name;
  360.  
  361.             _maxHP = rnd.Next(150, 301);
  362.             _currentHP = _maxHP;
  363.  
  364.             _defence = rnd.Next(0, 6);
  365.  
  366.             _minDamage = rnd.Next(5, 21);
  367.             _spreadDamage = rnd.Next(5, 11);
  368.  
  369.             _chanceDodge = rnd.Next(10, 26);
  370.             _chanceBlock = rnd.Next(0, 16);
  371.             _chanceCritical = rnd.Next(15, 26);
  372.         }
  373.  
  374.         protected override int SpreadDamage()
  375.         {
  376.             int damage = rnd.Next(_spreadDamage + 1);
  377.             if (_currentHP + damage >= _maxHP)
  378.             {
  379.                 _currentHP = _maxHP;
  380.             } else
  381.             {
  382.                 _currentHP += damage;
  383.             }
  384.             return damage;
  385.         }
  386.         public override string toString()
  387.         {
  388.             return $"{_name} (Воин крови)";
  389.         }
  390.     }
  391.  
  392.     class Monk : Fighter
  393.     {
  394.         public Monk(string name, int maxHP, int defence, int minDamage, int spreadDamage, int chanceDodge, int chanceBlock, int chanceCritical)
  395.             : base(name, maxHP, defence, minDamage, spreadDamage, chanceDodge, chanceBlock, chanceCritical) { }
  396.  
  397.         public Monk(string name) : base()
  398.         {
  399.             _name = name;
  400.  
  401.             _maxHP = rnd.Next(60, 151);
  402.             _currentHP = _maxHP;
  403.  
  404.             _defence = rnd.Next(0, 3);
  405.  
  406.             _minDamage = rnd.Next(1, 5);
  407.             _spreadDamage = rnd.Next(1, 11);
  408.  
  409.             _chanceDodge = rnd.Next(20, 51);
  410.             _chanceBlock = rnd.Next(0, 21);
  411.             _chanceCritical = rnd.Next(10, 46);
  412.         }
  413.  
  414.         protected override int Critical(int damage)
  415.         {
  416.             if (_chanceCritical >= rnd.Next(1, 101))
  417.             {
  418.                 Console.WriteLine("Критический удар!");
  419.                 return damage * 3;
  420.             }
  421.             else
  422.             {
  423.                 return damage;
  424.             }
  425.         }
  426.  
  427.         public override int Hit()
  428.         {
  429.             return Damage() + Damage() + Damage();
  430.         }
  431.  
  432.         public override string toString()
  433.         {
  434.             return $"{_name} (Монах)";
  435.         }
  436.     }
  437. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement