Advertisement
ZhongNi

Gladiator fights (3)

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