Advertisement
ZhongNi

Gladiator fights (4)

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