Advertisement
ZhongNi

war(2)

Oct 25th, 2024
12
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.53 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace Classes
  6. {
  7.     internal class Program
  8.     {
  9.         static void Main()
  10.         {
  11.             Battle battle = new Battle();
  12.             battle.Fight();
  13.         }
  14.     }
  15.  
  16.     class Battle
  17.     {
  18.         private Platoon[] _platoons;
  19.         private List<Soldier> _soldiers;
  20.  
  21.         public Battle()
  22.         {
  23.             _soldiers = new List<Soldier>()
  24.             {
  25.                 new SimpleSoldier(),
  26.                 new SimpleMultipleSoldier(),
  27.                 new ShotgunSoldier(),
  28.                 new MachineGunSoldier()
  29.             };
  30.  
  31.             _platoons = new Platoon[2]
  32.             {
  33.                 new Platoon(_soldiers),
  34.                 new Platoon(_soldiers)
  35.             };
  36.         }
  37.  
  38.         public void Fight()
  39.         {
  40.             int indexFirstPlat = 0;
  41.             int indexSecondPlat = 1;
  42.  
  43.             _platoons[indexFirstPlat].ShowAlive(indexFirstPlat);
  44.             _platoons[indexSecondPlat].ShowAlive(indexSecondPlat);
  45.  
  46.             Console.WriteLine("Press something...");
  47.             Console.ReadKey();
  48.  
  49.             bool haveAlive = true;
  50.             int turnCount = 1;
  51.             int maxTurnCount = 20;
  52.  
  53.             while (haveAlive)
  54.             {
  55.                 List<Soldier> survivorsPlatoon0 = _platoons[indexFirstPlat].GetAlive();
  56.                 List<Soldier> survivorsPlatoon1 = _platoons[indexSecondPlat].GetAlive();
  57.  
  58.                 Attack(survivorsPlatoon0, survivorsPlatoon1);
  59.                 Attack(survivorsPlatoon1, survivorsPlatoon0);
  60.  
  61.                 Console.Clear();
  62.  
  63.                 _platoons[indexFirstPlat].ShowAlive(indexFirstPlat);
  64.                 _platoons[indexSecondPlat].ShowAlive(indexSecondPlat);
  65.  
  66.                 int leftPosition = 0;
  67.  
  68.                 Console.SetCursorPosition(leftPosition, Math.Max(_platoons[indexFirstPlat].GetAlive().Count, _platoons[indexSecondPlat].GetAlive().Count));
  69.                 Console.WriteLine("Press something...");
  70.                 Console.ReadKey();
  71.  
  72.                 haveAlive = _platoons[indexFirstPlat].HaveAlive() && _platoons[indexSecondPlat].HaveAlive();
  73.  
  74.                 if (turnCount++ > maxTurnCount)
  75.                 {
  76.                     haveAlive = false;
  77.                 }
  78.             }
  79.  
  80.             DecideWinner(_platoons);
  81.         }
  82.  
  83.         private void DecideWinner(Platoon[] platoons)
  84.         {
  85.             Console.ForegroundColor = ConsoleColor.DarkYellow;
  86.  
  87.             if (platoons[0].HaveAlive() && platoons[1].HaveAlive())
  88.             {
  89.                 Console.WriteLine($"\nDraw!");
  90.             }
  91.             else if (platoons[0].HaveAlive() == false && platoons[1].HaveAlive() == false)
  92.             {
  93.                 Console.WriteLine($"\nDraw!");
  94.             }
  95.             else if (platoons[0].HaveAlive())
  96.             {
  97.                 Console.WriteLine($"\nLeft platoon wins!");
  98.             }
  99.             else if (platoons[1].HaveAlive())
  100.             {
  101.                 Console.WriteLine($"\nRight platoon wins!");
  102.             }
  103.  
  104.             Console.ResetColor();
  105.         }
  106.  
  107.         private void Attack(List<Soldier> attackPlatoon, List<Soldier> opponentPlatoon)
  108.         {
  109.             foreach (var soldier in attackPlatoon)
  110.             {
  111.                 {
  112.                     soldier.Attack(opponentPlatoon);
  113.                 }
  114.             }
  115.         }
  116.     }
  117.  
  118.     class Platoon
  119.     {
  120.         private List<Soldier> _soldiers;
  121.  
  122.         public Platoon(List<Soldier> soldiers)
  123.         {
  124.             Create(soldiers);
  125.         }
  126.  
  127.         public List<Soldier> GetAlive()
  128.         {
  129.             List<Soldier> aliveSoldiers = new List<Soldier>();
  130.  
  131.             foreach (var soldier in _soldiers)
  132.             {
  133.                 if (soldier.IsAlive)
  134.                 {
  135.                     aliveSoldiers.Add(soldier);
  136.                 }
  137.             }
  138.  
  139.             return aliveSoldiers;
  140.         }
  141.  
  142.         public bool HaveAlive()
  143.         {
  144.             bool haveAlive = _soldiers.Any(soldiers => soldiers.IsAlive);
  145.  
  146.             return haveAlive;
  147.         }
  148.  
  149.         public void ShowAlive(int index)
  150.         {
  151.             var aliveSoldiers = _soldiers.Where(soldiers => soldiers.IsAlive).OrderBy(soldiers => soldiers.Type).ThenBy(soldiers => soldiers.Health);
  152.  
  153.             int topPosition = 0;
  154.             int leftIndent = 35;
  155.             int leftIndentDefault = 0;
  156.             int leftPosition = index == 1 ? leftIndent : leftIndentDefault;
  157.  
  158.             foreach (var soldier in aliveSoldiers)
  159.             {
  160.                 switch (soldier.Type)
  161.                 {
  162.                     case Type.Simple:
  163.                         Console.ForegroundColor = ConsoleColor.DarkRed;
  164.                         break;
  165.                     case Type.SimpleMultiple:
  166.                         Console.ForegroundColor = ConsoleColor.DarkGreen;
  167.                         break;
  168.                     case Type.Shotgun:
  169.                         Console.ForegroundColor = ConsoleColor.DarkMagenta;
  170.                         break;
  171.                     case Type.MachineGun:
  172.                         Console.ForegroundColor = ConsoleColor.DarkYellow;
  173.                         break;
  174.                 }
  175.  
  176.                 Console.SetCursorPosition(leftPosition, topPosition++);
  177.                 Console.WriteLine($"{soldier.Type} - health: {soldier.Health}");
  178.                 Console.ResetColor();
  179.             }
  180.         }
  181.  
  182.         private void Create(List<Soldier> soldiers)
  183.         {
  184.             _soldiers = new List<Soldier>();
  185.  
  186.             int platoonSize = 28;
  187.             // для корректного отображения макс = 29 по объему буфера
  188.  
  189.             for (int i = 0; i < platoonSize; i++)
  190.             {
  191.                 int typeSoldier = UserUtil.GenerateRandomNumber(soldiers.Count);
  192.                 _soldiers.Add(soldiers[typeSoldier].Clone());
  193.             }
  194.         }
  195.     }
  196.  
  197.     interface IDamageable
  198.     {
  199.         void TakeDamage(int damage);
  200.     }
  201.  
  202.     abstract class Soldier : IDamageable
  203.     {
  204.         public Soldier()
  205.         {
  206.             Initialize();
  207.         }
  208.  
  209.         public Type Type { get; protected set; }
  210.         public int Health { get; protected set; }
  211.         public int Damage { get; protected set; }
  212.         public int Armor { get; protected set; }
  213.         public bool IsAlive => Health > 0;
  214.  
  215.         public virtual void Attack(List<Soldier> damageable)
  216.         {
  217.             List<IDamageable> damageableSoldiers = new List<IDamageable>();
  218.  
  219.             Soldier damageableSoldier = damageable[UserUtil.GenerateRandomNumber(damageable.Count)];
  220.             damageableSoldiers.Add(damageableSoldier);
  221.  
  222.             foreach (var soldier in damageableSoldiers)
  223.             {
  224.                 soldier.TakeDamage(Damage);
  225.             }
  226.         }
  227.  
  228.         public virtual void TakeDamage(int damage)
  229.         {
  230.             Health -= damage - Armor;
  231.         }
  232.  
  233.         abstract public Soldier Clone();
  234.  
  235.         private void Initialize()
  236.         {
  237.             int minHealth = 8;
  238.             int maxHealth = 11;
  239.             int minDamage = 3;
  240.             int maxDamage = 5;
  241.             int minArmor = 1;
  242.             int maxArmor = 3;
  243.  
  244.             Health = UserUtil.GenerateRandomNumber(minHealth, maxHealth + 1);
  245.             Damage = UserUtil.GenerateRandomNumber(minDamage, maxDamage + 1);
  246.             Armor = UserUtil.GenerateRandomNumber(minArmor, maxArmor + 1);
  247.         }
  248.     }
  249.  
  250.     class SimpleSoldier : Soldier
  251.     {
  252.         public SimpleSoldier()
  253.         {
  254.             Type = Type.Simple;
  255.         }
  256.  
  257.         public override Soldier Clone()
  258.         {
  259.             return new SimpleSoldier();
  260.         }
  261.     }
  262.  
  263.     class SimpleMultipleSoldier : Soldier
  264.     {
  265.         public SimpleMultipleSoldier()
  266.         {
  267.             Type = Type.SimpleMultiple;
  268.         }
  269.  
  270.         public override void TakeDamage(int damage)
  271.         {
  272.             int damageModifier = 2;
  273.             Health -= (damage - Armor) * damageModifier;
  274.         }
  275.  
  276.         public override Soldier Clone()
  277.         {
  278.             return new SimpleMultipleSoldier();
  279.         }
  280.     }
  281.  
  282.     class ShotgunSoldier : Soldier
  283.     {
  284.         public ShotgunSoldier()
  285.         {
  286.             Type = Type.Shotgun;
  287.         }
  288.  
  289.         public override void Attack(List<Soldier> damageable)
  290.         {
  291.             int damageableCount = 3;
  292.  
  293.             if (damageable.Count < damageableCount)
  294.             {
  295.                 damageableCount = damageable.Count;
  296.             }
  297.  
  298.             List<IDamageable> damageableSoldiers = new List<IDamageable>();
  299.  
  300.             for (int i = 0; i < damageableCount; i++)
  301.             {
  302.                 Soldier damageableSoldier = damageable[UserUtil.GenerateRandomNumber(damageable.Count)];
  303.  
  304.                 if (damageableSoldiers.Contains(damageableSoldier))
  305.                 {
  306.                     i--;
  307.                 }
  308.                 else
  309.                 {
  310.                     damageableSoldiers.Add(damageableSoldier);
  311.                 }
  312.             }
  313.  
  314.             foreach (var soldier in damageableSoldiers)
  315.             {
  316.                 soldier.TakeDamage(Damage);
  317.             }
  318.         }
  319.  
  320.         public override Soldier Clone()
  321.         {
  322.             return new ShotgunSoldier();
  323.         }
  324.     }
  325.  
  326.     class MachineGunSoldier : Soldier
  327.     {
  328.         public MachineGunSoldier()
  329.         {
  330.             Type = Type.MachineGun;
  331.         }
  332.  
  333.         public override void Attack(List<Soldier> damageable)
  334.         {
  335.             int damageableCount = 5;
  336.  
  337.             List<IDamageable> damageableSoldiers = new List<IDamageable>();
  338.  
  339.             for (int i = 0; i < damageableCount; i++)
  340.             {
  341.                 Soldier damageableSoldier = damageable[UserUtil.GenerateRandomNumber(damageable.Count)];
  342.  
  343.                 damageableSoldiers.Add(damageableSoldier);
  344.             }
  345.  
  346.             foreach (var soldier in damageableSoldiers)
  347.             {
  348.                 soldier.TakeDamage(Damage);
  349.             }
  350.         }
  351.  
  352.         public override Soldier Clone()
  353.         {
  354.             return new MachineGunSoldier();
  355.         }
  356.     }
  357.  
  358.     enum Type
  359.     {
  360.         Simple,
  361.         SimpleMultiple,
  362.         Shotgun,
  363.         MachineGun
  364.     }
  365.  
  366.     class UserUtil
  367.     {
  368.         private static Random s_random = new Random();
  369.  
  370.         public static int GenerateRandomNumber(int min, int max)
  371.         {
  372.             return s_random.Next(min, max);
  373.         }
  374.  
  375.         public static int GenerateRandomNumber(int max)
  376.         {
  377.             return s_random.Next(max);
  378.         }
  379.     }
  380. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement