Advertisement
SPavelA

OOPTask10War

Oct 26th, 2024 (edited)
70
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 11.22 KB | Gaming | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. namespace OOPTask10War
  5. {
  6.     internal class Program
  7.     {
  8.         static void Main(string[] args)
  9.         {
  10.             War war = new War();
  11.  
  12.             war.Initiate();
  13.         }
  14.     }
  15.  
  16.     public class War
  17.     {
  18.         private Squad _squad1 = new Squad();
  19.         private Squad _squad2 = new Squad();
  20.  
  21.         public void Initiate()
  22.         {
  23.             ShowStartInfo();
  24.             Fight();
  25.             ShowFinishInfo();
  26.         }
  27.  
  28.         private void Fight()
  29.         {
  30.             while (_squad1.IsAlive && _squad2.IsAlive)
  31.             {
  32.                 Console.Clear();
  33.                 Console.WriteLine("Взвод 1 атакует!\n");
  34.                 _squad1.Attack(_squad2);
  35.                 Console.WriteLine("\nВзвод 2 атакует!\n");
  36.                 _squad2.Attack(_squad1);
  37.                 _squad1.BuryDiedWarriors();
  38.                 _squad2.BuryDiedWarriors();
  39.                 Console.Write("\nзвод 1: ");
  40.                 _squad1.ShowShortInfo();
  41.                 Console.Write("\nзвод 2: ");
  42.                 _squad2.ShowShortInfo();
  43.                 Console.ReadKey();
  44.             }
  45.         }
  46.  
  47.         private void ShowStartInfo()
  48.         {
  49.             Console.WriteLine("Столкновение неизбежно...");
  50.             Console.Write("\nВзвод 1: ");
  51.             _squad1.ShowInfo();
  52.             Console.Write("\nВзвод 2: ");
  53.             _squad2.ShowInfo();
  54.             Console.WriteLine("\nДля начала и продолжения столкновения нажимайте любую клавишу");
  55.             Console.ReadKey();
  56.         }
  57.  
  58.         private void ShowFinishInfo()
  59.         {
  60.             Console.Clear();
  61.             Console.WriteLine("Схватка окончена...");
  62.  
  63.             if(_squad1.IsAlive == false && _squad2.IsAlive == false)
  64.             {
  65.                 Console.WriteLine("\nВ войне нет победителей...\nСдохли все...\n");
  66.             }
  67.             else if (_squad1.IsAlive == false)
  68.             {
  69.                 Console.WriteLine("Победил взвод 2: ");
  70.                 _squad2.ShowInfo();
  71.             }
  72.             else if (_squad2.IsAlive == false)
  73.             {
  74.                 Console.WriteLine("Победил взвод 1: ");
  75.                 _squad1.ShowInfo();
  76.             }
  77.  
  78.             Console.WriteLine();
  79.             Console.ReadKey();
  80.         }
  81.     }
  82.  
  83.     public interface IDamagableWarrior
  84.     {
  85.         void TakeDamage(int damage);
  86.     }
  87.  
  88.     public interface IDamagableSquad
  89.     {
  90.         IDamagableWarrior GetRandomWarrior();
  91.  
  92.         List<IDamagableWarrior> GetRandomWarriors(int count);
  93.     }
  94.  
  95.  
  96.     public class Squad : IDamagableSquad
  97.     {
  98.         private const int MinimumWarriorsCount = 10;
  99.         private const int MaximumWarriorsCount = 30;
  100.         private const int MinimumWarriorHealth = 1000;
  101.         private const int MaximumWarriorHealth = 2000;
  102.         private const int MinimumWarriorArmor = 30;
  103.         private const int MaximumWarriorArmor = 100;
  104.         private const int MinimumWarriorDamage = 70;
  105.         private const int MaximumWarriorDamage = 150;
  106.  
  107.         private List<Warrior> _warriors = new List<Warrior>();
  108.  
  109.         public Squad()
  110.         {
  111.             CreateWarriors();
  112.         }
  113.  
  114.         public bool IsAlive => _warriors.Count > 0;
  115.  
  116.         public void BuryDiedWarriors()
  117.         {
  118.             List<Warrior> diedWarriors = new List<Warrior>();
  119.            
  120.             foreach(Warrior warrior in _warriors)
  121.             {
  122.                 if (warrior.IsAlive == false)
  123.                     diedWarriors.Add(warrior);
  124.             }
  125.  
  126.             foreach(Warrior warrior in diedWarriors)
  127.             {
  128.                 _warriors.Remove(warrior);
  129.             }
  130.         }
  131.  
  132.         private void CreateWarriors()
  133.         {
  134.             List<Warrior> warriorTypes = new List<Warrior>();
  135.  
  136.             warriorTypes.Add(new Warrior(0, 0, 0));
  137.             warriorTypes.Add(new StrongWarrior(0, 0, 0));
  138.             warriorTypes.Add(new MultipleWarrior(0, 0, 0));
  139.             warriorTypes.Add(new FastWarrior(0, 0, 0));
  140.  
  141.             int warriorsCount = UserUtils.GenerateRandomNumber(MinimumWarriorsCount, MaximumWarriorsCount);
  142.  
  143.             for (int i = 0; i < warriorsCount; i++)
  144.             {
  145.                 _warriors.Add(warriorTypes[UserUtils.GenerateRandomNumber(0, warriorTypes.Count)].
  146.                     CreateNewWarrior(UserUtils.GenerateRandomNumber(MinimumWarriorHealth, MaximumWarriorHealth),
  147.                                     UserUtils.GenerateRandomNumber(MinimumWarriorArmor, MaximumWarriorArmor),
  148.                                     UserUtils.GenerateRandomNumber(MinimumWarriorDamage, MaximumWarriorDamage)
  149.                     ));
  150.             }
  151.         }
  152.  
  153.         public IDamagableWarrior GetRandomWarrior()
  154.         {
  155.             return _warriors[UserUtils.GenerateRandomNumber(0, _warriors.Count)];
  156.         }
  157.  
  158.         public List<IDamagableWarrior> GetRandomWarriors(int count)
  159.         {
  160.             List<IDamagableWarrior> randomWarriors = new List<IDamagableWarrior>();
  161.            
  162.             if (count > _warriors.Count)
  163.                 count = _warriors.Count;
  164.  
  165.             while (randomWarriors.Count < count)
  166.             {
  167.                 IDamagableWarrior warrior = GetRandomWarrior();
  168.  
  169.                 if (randomWarriors.Contains(warrior) == false)
  170.                     randomWarriors.Add(warrior);
  171.             }
  172.  
  173.             return randomWarriors;
  174.         }
  175.  
  176.         public void ShowShortInfo()
  177.         {
  178.             Console.WriteLine($"во взводе {_warriors.Count} воинов");
  179.         }
  180.  
  181.         public void ShowInfo()
  182.         {
  183.             ShowShortInfo();
  184.             Console.WriteLine();
  185.            
  186.             foreach (Warrior warrior in _warriors)
  187.             {
  188.                 warrior.ShowInfo();
  189.             }
  190.         }
  191.  
  192.         public void Attack(IDamagableSquad squad)
  193.         {
  194.             foreach(Warrior warrior in _warriors)
  195.             {
  196.                 warrior.Attack(squad);
  197.             }
  198.         }
  199.     }
  200.  
  201.     public class Warrior: IDamagableWarrior
  202.     {
  203.         protected string Title;
  204.         protected string Description;
  205.         protected int Health;
  206.         protected int Armor;
  207.         protected int Damage;
  208.  
  209.         public Warrior(int health, int armor, int damage)
  210.         {
  211.             Health = health;
  212.             Armor = armor;
  213.             Damage = damage;
  214.             Title = "простой воин";
  215.             Description = "атакует одного противника обычной атакой";
  216.         }
  217.  
  218.         public bool IsAlive => Health > 0;
  219.  
  220.         public void ShowInfo()
  221.         {
  222.             Console.WriteLine($"{Title} - {Description}, Здоровье: {Health}, Броня: {Armor}, Атака: {Damage}");
  223.         }
  224.  
  225.         public virtual void TakeDamage(int damage)
  226.         {
  227.             int takenDamage = GetTakenDamage(damage);
  228.             Console.WriteLine($"\"{Title}\" защищается и получает урон: {takenDamage}");
  229.             Health -= takenDamage;
  230.         }
  231.  
  232.         private int GetTakenDamage(int damage)
  233.         {
  234.             int takenDamage = damage - Armor;
  235.  
  236.             if (takenDamage < 0)
  237.                 takenDamage = 0;
  238.  
  239.             return takenDamage;
  240.         }
  241.  
  242.         public virtual void Attack(IDamagableSquad squad)
  243.         {
  244.             Console.WriteLine($"Боец \"{Title}\" наносит урон: {Damage}");
  245.             squad.GetRandomWarrior().TakeDamage(Damage);
  246.         }
  247.  
  248.         public virtual Warrior CreateNewWarrior(int health, int armor, int damage)
  249.         {
  250.             return new Warrior(health, armor, damage);
  251.         }
  252.     }
  253.  
  254.     public class StrongWarrior : Warrior
  255.     {
  256.         private const int MinimumDamagePercent = 110;
  257.         private const int MaximumDamagePercent = 200;
  258.         private const int PercentScale = 100;
  259.  
  260.         public StrongWarrior(int health, int armor, int damage): base(health, armor, damage)
  261.         {
  262.             Title = "сильный воин";
  263.             Description = "атакует одного противника мощной атакой";
  264.         }
  265.  
  266.         public override void Attack(IDamagableSquad squad)
  267.         {
  268.             int damage = Damage * UserUtils.GenerateRandomNumber(MinimumDamagePercent, MaximumDamagePercent) / PercentScale;
  269.  
  270.             Console.WriteLine($"\"{Title}\" наносит увеличенный урон: {damage}");
  271.             squad.GetRandomWarrior().TakeDamage(damage);
  272.         }
  273.  
  274.         public override Warrior CreateNewWarrior(int health, int armor, int damage)
  275.         {
  276.             return new StrongWarrior(health, armor, damage);
  277.         }
  278.     }
  279.  
  280.     public class MultipleWarrior : Warrior
  281.     {
  282.         private const int MinimumTargetCount = 2;
  283.         private const int MaximumTargetCount = 6;
  284.  
  285.         public MultipleWarrior(int health, int armor, int damage) : base(health, armor, damage)
  286.         {
  287.             Title = "массовый воин";
  288.             Description = "атакует нескольких противников обычной атакой";
  289.         }
  290.  
  291.         public override void Attack(IDamagableSquad squad)
  292.         {
  293.             List<IDamagableWarrior> warriors = squad.GetRandomWarriors(UserUtils.GenerateRandomNumber(MinimumTargetCount, MaximumTargetCount));
  294.  
  295.             Console.WriteLine($"\"{Title}\" наносит {warriors.Count} врагам обычный урон: {Damage}");
  296.  
  297.             foreach (IDamagableWarrior warrior in warriors)
  298.             {
  299.                 warrior.TakeDamage(Damage);
  300.             }
  301.         }
  302.  
  303.         public override Warrior CreateNewWarrior(int health, int armor, int damage)
  304.         {
  305.             return new MultipleWarrior(health, armor, damage);
  306.         }
  307.     }
  308.  
  309.     public class FastWarrior : Warrior
  310.     {
  311.         private const int MinimumAttackCount = 2;
  312.         private const int MaximumAttackCount = 6;
  313.  
  314.         public FastWarrior(int health, int armor, int damage) : base(health, armor, damage)
  315.         {
  316.             Title = "быстрый воин";
  317.             Description = "успевает атаковать несколько раз обычной атакой";
  318.         }
  319.  
  320.         public override void Attack(IDamagableSquad squad)
  321.         {
  322.             int attackCount = UserUtils.GenerateRandomNumber(MinimumAttackCount, MaximumAttackCount);
  323.  
  324.             Console.WriteLine($"\"{Title}\" проводит {attackCount} атак врагам с обычным уроном: {Damage}");
  325.  
  326.             for(int i = 0; i < attackCount; i++)
  327.             {
  328.                 squad.GetRandomWarrior().TakeDamage(Damage);
  329.             }
  330.         }
  331.  
  332.         public override Warrior CreateNewWarrior(int health, int armor, int damage)
  333.         {
  334.             return new FastWarrior(health, armor, damage);
  335.         }
  336.     }
  337.  
  338.     public class UserUtils
  339.     {
  340.         private static Random s_random = new Random();
  341.  
  342.         public static int GenerateRandomNumber(int minimumNumber, int maximumNumber)
  343.         {
  344.             return s_random.Next(minimumNumber, maximumNumber);
  345.         }
  346.     }
  347. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement