Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- internal class Program
- {
- static void Main(string[] args)
- {
- PlatoonBattle battle = new PlatoonBattle();
- battle.SimulateBattle();
- }
- }
- public static class UserUtils
- {
- private static Random s_random = new Random();
- public static int GenerateRandomNumber(int minRandom, int maxRandom)
- {
- return s_random.Next(minRandom, maxRandom);
- }
- }
- public abstract class Soldier
- {
- protected int MaxHealth;
- protected int Health;
- protected int Damage;
- protected int Armor;
- protected double MultiplierDamage;
- protected Soldier(int maxHealth, int damage, int armor, double multiplierDamage)
- {
- MultiplierDamage = multiplierDamage;
- MaxHealth = maxHealth;
- Damage = damage;
- Armor = armor;
- Health = MaxHealth;
- }
- public bool IsAlive => Health > 0;
- public void Attack(List<Soldier> enemySoldiers)
- {
- if (IsAlive && enemySoldiers.Count > 0)
- PerformAttack(enemySoldiers);
- }
- protected abstract void PerformAttack(List<Soldier> enemySoldiers);
- protected void DealDamage(Soldier target)
- {
- int rawDamage = (int)(Damage * MultiplierDamage);
- target.TakeDamage(rawDamage);
- }
- private void TakeDamage(int damage)
- {
- int actualDamage = damage - Armor;
- if (actualDamage < 1)
- actualDamage = 1;
- Health -= actualDamage;
- }
- }
- public class Regular : Soldier
- {
- public Regular() : base(maxHealth: 100, damage: 20, armor: 5, multiplierDamage: 1.0)
- {
- }
- protected override void PerformAttack(List<Soldier> aliveEnemies)
- {
- int index = UserUtils.GenerateRandomNumber(0, aliveEnemies.Count);
- Soldier enemy = aliveEnemies[index];
- DealDamage(enemy);
- }
- }
- public class Heavy : Soldier
- {
- public Heavy() : base(maxHealth: 130, damage: 20, armor: 10, multiplierDamage: 1.8)
- {
- }
- protected override void PerformAttack(List<Soldier> aliveEnemies)
- {
- int index = UserUtils.GenerateRandomNumber(0, aliveEnemies.Count);
- Soldier enemy = aliveEnemies[index];
- DealDamage(enemy);
- }
- }
- public class MultiNoRepeat : Soldier
- {
- private int _numTargets = 3;
- public MultiNoRepeat() : base(maxHealth: 90, damage: 18, armor: 4, multiplierDamage: 0.8)
- {
- }
- protected override void PerformAttack(List<Soldier> aliveEnemies)
- {
- int targetsCount = _numTargets;
- if (targetsCount > aliveEnemies.Count)
- targetsCount = aliveEnemies.Count;
- List<Soldier> temp = new List<Soldier>(aliveEnemies);
- for (int i = 0; i < targetsCount; i++)
- {
- int index = UserUtils.GenerateRandomNumber(0, temp.Count);
- Soldier enemy = temp[index];
- temp.RemoveAt(index);
- DealDamage(enemy);
- }
- }
- }
- public class MultiRepeat : Soldier
- {
- private int _targetsCount = 5;
- public MultiRepeat() : base(maxHealth: 80, damage: 15, armor: 3, multiplierDamage: 0.6)
- {
- }
- protected override void PerformAttack(List<Soldier> aliveEnemies)
- {
- for (int i = 0; i < _targetsCount; i++)
- {
- int index = UserUtils.GenerateRandomNumber(0, aliveEnemies.Count);
- Soldier enemy = aliveEnemies[index];
- DealDamage(enemy);
- }
- }
- }
- public class Platoon
- {
- private List<Soldier> _soldiers = new List<Soldier>();
- public Platoon(List<Soldier> soldiers)
- {
- _soldiers.AddRange(soldiers);
- }
- public bool HasAlive()
- {
- for (int i = 0; i < _soldiers.Count; i++)
- {
- if (_soldiers[i].IsAlive)
- return true;
- }
- return false;
- }
- public int CountAlive()
- {
- int count = 0;
- for (int i = 0; i < _soldiers.Count; i++)
- {
- if (_soldiers[i].IsAlive)
- count++;
- }
- return count;
- }
- public void Attack(Platoon enemyPlatoon)
- {
- foreach (Soldier soldier in _soldiers)
- {
- if (soldier.IsAlive)
- soldier.Attack(enemyPlatoon._soldiers);
- }
- }
- public void RemovingDeadSoldiers()
- {
- for (int i = 0; i < _soldiers.Count; ++i)
- {
- if (_soldiers[i].IsAlive == false)
- _soldiers.Remove(_soldiers[i]);
- }
- }
- }
- public class PlatoonBattle
- {
- private Platoon _platoon1;
- private Platoon _platoon2;
- public PlatoonBattle()
- {
- _platoon1 = new Platoon(new List<Soldier>
- {
- new Regular(),
- new Regular(),
- new Heavy(),
- new MultiNoRepeat(),
- new MultiRepeat(),
- new MultiRepeat(),
- new MultiNoRepeat(),
- new Heavy()
- });
- _platoon2 = new Platoon(new List<Soldier>
- {
- new Regular(),
- new MultiNoRepeat(),
- new Heavy(),
- new MultiRepeat(),
- new Regular(),
- new Heavy(),
- new MultiRepeat(),
- new MultiNoRepeat()
- });
- }
- public void SimulateBattle()
- {
- int round = 1;
- while (_platoon1.HasAlive() && _platoon2.HasAlive())
- {
- Console.WriteLine($"\nРаунд {round}");
- if (round % 2 != 0)
- {
- _platoon1.Attack(_platoon2);
- _platoon2.RemovingDeadSoldiers();
- Console.WriteLine("После атаки Взвода 1:");
- PrintStatus();
- if (_platoon2.HasAlive() == false)
- break;
- _platoon2.Attack(_platoon1);
- _platoon1.RemovingDeadSoldiers();
- Console.WriteLine("После атаки Взвода 2:");
- PrintStatus();
- }
- else
- {
- _platoon2.Attack(_platoon1);
- _platoon1.RemovingDeadSoldiers();
- Console.WriteLine("После атаки Взвода 2:");
- PrintStatus();
- if (_platoon1.HasAlive() == false)
- break;
- _platoon1.Attack(_platoon2);
- _platoon2.RemovingDeadSoldiers();
- Console.WriteLine("После атаки Взвода 1:");
- PrintStatus();
- }
- round++;
- }
- int alive1 = _platoon1.CountAlive();
- int alive2 = _platoon2.CountAlive();
- if (alive1 > 0 && alive2 == 0)
- {
- Console.WriteLine($"\nПобедил ВЗВОД 1! Выживших бойцов: {alive1}");
- }
- else
- {
- Console.WriteLine($"\nПобедил ВЗВОД 2! Выживших бойцов: {alive2}");
- }
- }
- private void PrintStatus()
- {
- Console.WriteLine($"Живых в 1 = {_platoon1.CountAlive()}, в 2 = {_platoon2.CountAlive()}");
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment