Advertisement
ZhongNi

Gladiator fights (5)

Oct 20th, 2024 (edited)
21
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.21 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Reflection;
  4.  
  5. namespace Classes
  6. {
  7.     internal class Program
  8.     {
  9.         static void Main()
  10.         {
  11.             Arena arena = new Arena();
  12.             arena.Work();
  13.         }
  14.     }
  15.  
  16.     class Arena
  17.     {
  18.         public void Work()
  19.         {
  20.             bool isWorking = true;
  21.  
  22.             while (isWorking)
  23.             {
  24.                 List<Fighter> fighters = new List<Fighter>() {
  25.                 new DoubleDamageWarrior(),
  26.                 new TwiceStrikesWarrior(),
  27.                 new HealingWarrior(),
  28.                 new MageWarrior(),
  29.                 new EvadingWarrior()};
  30.  
  31.                 for (int i = 0; i < fighters.Count; i++)
  32.                 {
  33.                     Console.Write($"" +
  34.                         $"{i + 1} - {fighters[i].Name}\n" +
  35.                         $"");
  36.                 }
  37.  
  38.                 int selectedFightersCount = 2;
  39.                 Fighter[] selectedFighters = new Fighter[selectedFightersCount];
  40.  
  41.                 for (int i = 0; i < selectedFighters.Length; i++)
  42.                 {
  43.                     int fighterType = SelectMenu(i, fighters.Count);
  44.  
  45.                     if (fighterType == fighters.Count)
  46.                     {
  47.                         isWorking = false;
  48.                         i = selectedFighters.Length;
  49.                         continue;
  50.                     }
  51.  
  52.                     selectedFighters[i] = SelectFighter(fighters, fighterType, i);
  53.                 }
  54.  
  55.                 if (isWorking)
  56.                 {
  57.                     Fight(selectedFighters);
  58.                     DecideWinner(selectedFighters);
  59.                     Console.WriteLine("\nPress something");
  60.                     Console.ReadKey();
  61.                     Console.Clear();
  62.                 }
  63.             }
  64.         }
  65.  
  66.         private Fighter SelectFighter(List<Fighter> fighters, int fighterType, int indexFighter)
  67.         {
  68.             Fighter fighter = fighters[fighterType].Clone();
  69.             fighter.AddIndex(indexFighter + 1);
  70.             Console.WriteLine($"Fighter {fighter.Name} has {fighter.Health} health, {fighter.Damage} damage");
  71.  
  72.             return fighter;
  73.         }
  74.  
  75.         private int SelectMenu(int indexFighter, int fightersCount)
  76.         {
  77.             bool hasChosen = false;
  78.             int fighterType = 0;
  79.             int commandExit = fightersCount + 1;
  80.  
  81.             while (hasChosen == false)
  82.             {
  83.                 Console.WriteLine($"\nChoose {indexFighter + 1} fighter 1 - {fightersCount}, or {commandExit} for exit");
  84.  
  85.                 hasChosen = int.TryParse(Console.ReadLine(), out fighterType);
  86.  
  87.                 if (hasChosen && (fighterType <= 0 || fighterType > commandExit))
  88.                 {
  89.                     hasChosen = false;
  90.                     Console.WriteLine("select a fighter");
  91.                 }
  92.             }
  93.  
  94.             fighterType--;
  95.  
  96.             return fighterType;
  97.         }
  98.  
  99.         private void Fight(Fighter[] fighter)
  100.         {
  101.             bool isWarriorsAlive = true;
  102.             int turn = 1;
  103.  
  104.             Console.WriteLine();
  105.  
  106.             while (isWarriorsAlive)
  107.             {
  108.                 Console.WriteLine($"Turn {turn}");
  109.                 turn++;
  110.  
  111.                 fighter[1].Attack(fighter[0]);
  112.                 fighter[0].Attack(fighter[1]);
  113.                 fighter[0].ShowHealth();
  114.                 fighter[1].ShowHealth();
  115.  
  116.                 isWarriorsAlive = fighter[0].IsAlive && fighter[1].IsAlive;
  117.             }
  118.         }
  119.  
  120.         private void DecideWinner(Fighter[] fighter)
  121.         {
  122.             if (fighter[0].IsAlive == false && fighter[1].IsAlive == false)
  123.             {
  124.                 UserUtils.PrintGreenMessage($"\nDraw!");
  125.             }
  126.             else if (fighter[0].IsAlive)
  127.             {
  128.                 UserUtils.PrintGreenMessage($"\nWarrior {fighter[0].Name} wins!");
  129.             }
  130.             else if (fighter[1].IsAlive)
  131.             {
  132.                 UserUtils.PrintGreenMessage($"\nWarrior {fighter[1].Name} wins!");
  133.             }
  134.         }
  135.     }
  136.  
  137.     public interface IDamageable
  138.     {
  139.         void TakeDamage(int damage);
  140.     }
  141.  
  142.     abstract class Fighter : IDamageable
  143.     {
  144.         protected Fighter(string name)
  145.         {
  146.             Name = name;
  147.             InitializeStats();
  148.         }
  149.  
  150.         public int Health { get; protected set; }
  151.         public int Damage { get; protected set; }
  152.         public string Name { get; protected set; }
  153.         public bool IsAlive => Health > 0;
  154.  
  155.         public virtual void Attack(IDamageable damageable)
  156.         {
  157.             damageable.TakeDamage(Damage);
  158.         }
  159.  
  160.         public virtual void TakeDamage(int damage)
  161.         {
  162.             Health -= damage;
  163.             Console.WriteLine($"Warrior {Name} took {damage} damage");
  164.         }
  165.  
  166.         public abstract void MakeSpecialAttack();
  167.  
  168.         public abstract Fighter Clone();
  169.  
  170.         public void ShowHealth()
  171.         {
  172.             Health = Health > 0 ? Health : 0;
  173.             Console.WriteLine($"Warrior {Name} {Health} health left");
  174.         }
  175.  
  176.         public void AddIndex(int index)
  177.         {
  178.             Name = index + " " + Name;
  179.         }
  180.  
  181.         private void InitializeStats()
  182.         {
  183.             int minHealth = 120;
  184.             int maxHealth = 160;
  185.             int health = UserUtils.GenerateRandomNumber(minHealth, maxHealth + 1);
  186.  
  187.             int minDamage = 18;
  188.             int maxDamage = 23;
  189.             int damage = UserUtils.GenerateRandomNumber(minDamage, maxDamage + 1);
  190.  
  191.             Health = health;
  192.             Damage = damage;
  193.         }
  194.     }
  195.  
  196.     class UserUtils
  197.     {
  198.         private static Random s_random = new Random();
  199.  
  200.         public static int GenerateRandomNumber(int min, int max) => s_random.Next(min, max);
  201.  
  202.         public static void PrintGreenMessage(string message)
  203.         {
  204.             Console.ForegroundColor = ConsoleColor.Green;
  205.             Console.WriteLine(message);
  206.             Console.ResetColor();
  207.         }
  208.     }
  209.  
  210.     class DoubleDamageWarrior : Fighter
  211.     {
  212.         private int _simpleDamage;
  213.  
  214.         public DoubleDamageWarrior() : base("Double Damage Warrior")
  215.         {
  216.             _simpleDamage = Damage;
  217.         }
  218.  
  219.         public override void MakeSpecialAttack()
  220.         {
  221.             int probability = 3;
  222.             int minProbability = 0;
  223.             int maxProbability = 9;
  224.  
  225.             if (UserUtils.GenerateRandomNumber(minProbability, maxProbability + 1) < probability)
  226.             {
  227.                 int damageMultiplier = 2;
  228.                 Damage = _simpleDamage * damageMultiplier;
  229.  
  230.                 UserUtils.PrintGreenMessage($"Warrior {Name} make Special Attack damage X{damageMultiplier}");
  231.             }
  232.             else
  233.             {
  234.                 Damage = _simpleDamage;
  235.             }
  236.         }
  237.  
  238.         public override void Attack(IDamageable damageable)
  239.         {
  240.             MakeSpecialAttack();
  241.  
  242.             base.Attack(damageable);
  243.         }
  244.  
  245.         public override Fighter Clone() => new DoubleDamageWarrior();
  246.     }
  247.  
  248.     class TwiceStrikesWarrior : Fighter
  249.     {
  250.         private int _hitCount = 1;
  251.         private bool _haveRepeat = false;
  252.  
  253.         public TwiceStrikesWarrior() : base("Twice Strikes Warrior") { }
  254.  
  255.         public override void MakeSpecialAttack()
  256.         {
  257.             int criticalAttackPeriod = 3;
  258.             int resetCounter = 1;
  259.  
  260.             if (_hitCount == criticalAttackPeriod)
  261.             {
  262.                 _haveRepeat = true;
  263.                 _hitCount = resetCounter;
  264.  
  265.                 UserUtils.PrintGreenMessage($"Warrior {Name} make Special Attack damage Repeat Hit");
  266.             }
  267.             else
  268.             {
  269.                 _haveRepeat = false;
  270.                 _hitCount++;
  271.             }
  272.  
  273.         }
  274.  
  275.         public override void Attack(IDamageable damageable)
  276.         {
  277.             MakeSpecialAttack();
  278.  
  279.             base.Attack(damageable);
  280.  
  281.             if (_haveRepeat && IsAlive)
  282.             {
  283.                 base.Attack(damageable);
  284.             }
  285.         }
  286.  
  287.         public override Fighter Clone() => new TwiceStrikesWarrior();
  288.     }
  289.  
  290.     class HealingWarrior : Fighter
  291.     {
  292.         private int _rage;
  293.         private int _normalHealth;
  294.         private int _maxHealth;
  295.  
  296.         public HealingWarrior() : base("Healing Warrior")
  297.         {
  298.             _normalHealth = Health;
  299.             _maxHealth = Health;
  300.         }
  301.  
  302.         public override void MakeSpecialAttack()
  303.         {
  304.             int rageThreshold = 80;
  305.             int healthRecovery = 30;
  306.             _rage = _normalHealth - Health;
  307.  
  308.             if (_rage > rageThreshold && Health > 0)
  309.             {
  310.                 Health += healthRecovery;
  311.                 Health = Health > _maxHealth ? _maxHealth : Health;
  312.                 _normalHealth = _normalHealth - rageThreshold + healthRecovery;
  313.  
  314.                 UserUtils.PrintGreenMessage($"Warrior {Name} make Special Attack Health +{healthRecovery}");
  315.             }
  316.         }
  317.  
  318.         public override void TakeDamage(int damage)
  319.         {
  320.             Health -= damage;
  321.             Console.WriteLine($"Warrior {Name} took {damage} damage");
  322.  
  323.             MakeSpecialAttack();
  324.         }
  325.  
  326.         public override Fighter Clone() => new HealingWarrior();
  327.     }
  328.  
  329.     class MageWarrior : Fighter
  330.     {
  331.         private int _mana = 45;
  332.         private int _mageDamage = 20;
  333.         private int _spellCosts = 20;
  334.         private int _simpleDamage;
  335.  
  336.         public MageWarrior() : base("Mage Warrior")
  337.         {
  338.             _simpleDamage = Damage;
  339.         }
  340.  
  341.         public override void MakeSpecialAttack()
  342.         {
  343.             if (_mana > _spellCosts)
  344.             {
  345.                 _mana -= _spellCosts;
  346.                 Damage = _simpleDamage + _mageDamage;
  347.  
  348.                 UserUtils.PrintGreenMessage($"Warrior {Name} make Special Attack Fireball");
  349.             }
  350.             else
  351.             {
  352.                 Damage = _simpleDamage;
  353.             }
  354.         }
  355.  
  356.         public override void Attack(IDamageable damageable)
  357.         {
  358.             MakeSpecialAttack();
  359.  
  360.             base.Attack(damageable);
  361.         }
  362.  
  363.         public override Fighter Clone() => new MageWarrior();
  364.     }
  365.  
  366.     class EvadingWarrior : Fighter
  367.     {
  368.         private bool _isEvading = false;
  369.         private int _simpleDamage;
  370.  
  371.         public EvadingWarrior() : base("Evading Warrior")
  372.         {
  373.             _simpleDamage = Damage;
  374.         }
  375.  
  376.         public override void TakeDamage(int damage)
  377.         {
  378.             MakeSpecialAttack();
  379.  
  380.             if (_isEvading)
  381.             {
  382.                 damage = 0;
  383.  
  384.                 UserUtils.PrintGreenMessage($"Warrior {Name} make Special Attack Evading");
  385.             }
  386.  
  387.             Health -= damage;
  388.             Console.WriteLine($"Warrior {Name} took {damage} damage");
  389.         }
  390.  
  391.         public override void MakeSpecialAttack()
  392.         {
  393.             int probability = 3;
  394.             int minProbability = 0;
  395.             int maxProbability = 9;
  396.  
  397.             _isEvading = UserUtils.GenerateRandomNumber(minProbability, maxProbability + 1) < probability;
  398.         }
  399.  
  400.         public override Fighter Clone() => new EvadingWarrior();
  401.     }
  402. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement