Advertisement
ZhongNi

war

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