Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace war
- {
- class Program
- {
- static void Main(string[] args)
- {
- Battle battle = new Battle();
- battle.RunMenu();
- }
- }
- class Battle
- {
- int _raund = 0;
- private Squad _squadLeft;
- private Squad _squadRight;
- public Battle()
- {
- _raund = 1;
- _squadLeft = new Squad();
- _squadRight = new Squad();
- }
- public void RunMenu()
- {
- bool isRun = true;
- while (isRun)
- {
- Console.WriteLine("[1] - Создать отряд\n[2] - Запустить бой\n[3] - Выход");
- switch (Console.ReadLine())
- {
- case "1":
- _squadLeft.CreateSquad();
- _squadRight.CreateSquad();
- break;
- case "2":
- StartGame();
- break;
- case "3":
- isRun = false;
- break;
- }
- }
- }
- private void StartGame()
- {
- if (IsGameReady() == false)
- {
- return;
- }
- while (IsGameOver() == false)
- {
- MakeRound();
- Console.ReadKey();
- Console.Clear();
- }
- }
- private void MakeRound()
- {
- InitStage();
- FightStage();
- EndStage();
- }
- public void InitStage()
- {
- _squadLeft.ChooseRandomFrontmen();
- _squadRight.ChooseRandomFrontmen();
- }
- private void FightStage()
- {
- Console.WriteLine("Западный отряд атакует!");
- _squadRight.TakeAction(_squadLeft);
- Console.WriteLine("Восточный отряд атакует!");
- _squadLeft.TakeAction(_squadRight);
- }
- private void EndStage()
- {
- _squadLeft.TryDeleteDeadSoldier();
- _squadRight.TryDeleteDeadSoldier();
- if(IsSquadsReady())
- {
- Console.WriteLine("Новый раунд!");
- _raund++;
- }
- }
- private bool IsSquadsReady()
- {
- if (_squadLeft.IsSoldiersUnready() && _squadRight.IsSoldiersUnready())
- {
- _squadLeft.Refresh();
- _squadRight.Refresh();
- return true;
- }
- return false;
- }
- private bool IsGameOver()
- {
- if (_squadLeft.GetHealthSquad() <= 0)
- {
- Console.WriteLine("Западный отряд умер!");
- return true;
- }
- else if (_squadRight.GetHealthSquad() <= 0)
- {
- Console.WriteLine("Восточный отряд умер!");
- return true;
- }
- Console.WriteLine("Raund: " + _raund);
- Console.WriteLine("\nСилы западного отряда: " + _squadLeft.GetHealthSquad());
- Console.WriteLine("Силы восточного отряда: " + _squadRight.GetHealthSquad() + "\n");
- return false;
- }
- private bool IsGameReady()
- {
- if (_squadLeft.GetSquadSize() < 0)
- {
- Console.WriteLine("Левый отряд не создан!");
- return false;
- }
- else if (_squadRight.GetSquadSize() < 0)
- {
- Console.WriteLine("Правый отряд не создан!");
- return false;
- }
- return true;
- }
- }
- class Squad
- {
- private List<Soldier> _soldiers;
- private static Random _rand = new Random(DateTime.Now.Millisecond);
- private Soldier Frontmen { get; set; }
- public Squad()
- {
- _soldiers = new List<Soldier>(20);
- }
- public void CreateSquad()
- {
- Console.WriteLine("Создаем отряд...");
- Medic medic = new Medic();
- CreateSoldier(5, medic);
- Sniper sniper = new Sniper();
- CreateSoldier(5, sniper);
- Infantryman infantryman = new Infantryman();
- CreateSoldier(10, infantryman);
- for (int counter = 0; counter < _soldiers.Count; counter++)
- {
- int swapIndex = _rand.Next(_soldiers.Count);
- Soldier soldier = _soldiers[swapIndex];
- _soldiers[swapIndex] = _soldiers[counter];
- _soldiers[counter] = soldier;
- }
- }
- public void TakeAction(Squad enemySquad)
- {
- Frontmen.TryAttack(enemySquad.Frontmen, GetRandomSoldier(_soldiers));
- }
- public int GetHealthSquad()
- {
- int healthSquad = 0;
- foreach (var soldier in _soldiers)
- {
- healthSquad += soldier.Health;
- }
- return healthSquad;
- }
- public int GetSquadSize()
- {
- return _soldiers.Count;
- }
- public Soldier ChooseRandomFrontmen()
- {
- List<Soldier> readySoldiers = new List<Soldier>();
- foreach (var soldier in _soldiers)
- {
- if(soldier.IsGunReady || soldier.AbillityCounter == 0)
- {
- readySoldiers.Add(soldier);
- }
- }
- if(readySoldiers.Count == 0)
- {
- Frontmen = GetRandomSoldier(_soldiers);
- }
- else
- {
- Frontmen = GetRandomSoldier(readySoldiers);
- }
- return Frontmen;
- }
- public Soldier GetRandomSoldier(List<Soldier> soldiers)
- {
- return soldiers[_rand.Next(0, soldiers.Count)];
- }
- public bool IsSoldiersUnready()
- {
- foreach (var soldier in _soldiers)
- {
- if (soldier.AbillityCounter == 0 && soldier.IsGunReady)
- {
- return false;
- }
- }
- return true;
- }
- public void Refresh()
- {
- foreach (var soldier in _soldiers)
- {
- soldier.ReloadGun();
- soldier.CooldownAbility();
- }
- }
- public bool TryDeleteDeadSoldier()
- {
- if (Frontmen.Health <= 0)
- {
- _soldiers.Remove(Frontmen);
- return true;
- }
- return false;
- }
- private void CreateSoldier(int soldiersCapasity, Soldier soldier)
- {
- for (int counter = 0; counter < soldiersCapasity; counter++)
- {
- var type = soldier;
- if (type as Medic != null)
- {
- type = new Medic(counter, _rand.Next(50, 100), _rand.Next(25, 50));
- _soldiers.Add(type);
- }
- else if (type as Sniper != null)
- {
- type = new Sniper(counter, _rand.Next(50, 70), _rand.Next(85, 105));
- _soldiers.Add(type);
- }
- else if (type as Infantryman != null)
- {
- type = new Infantryman(counter, _rand.Next(70, 100), _rand.Next(50, 80));
- _soldiers.Add(type);
- }
- }
- }
- }
- abstract class Soldier
- {
- protected Random _random = new Random();
- public bool IsTargetEnemy { get; protected set; }
- public bool IsGunReady { get; protected set; }
- public bool IsAvoid { get; protected set; }
- public int Number { get; protected set; }
- public int MaxHealth { get; protected set; }
- public int Health { get; protected set; }
- public int Damage { get; protected set; }
- public int AbillityCounter { get; protected set; }
- public string Specialty { get; protected set; }
- public abstract void UseAbillity(Soldier soldier);
- public void TryAttack(Soldier enemy, Soldier ally)
- {
- if (IsGunReady)
- {
- Attack(enemy);
- }
- else if (AbillityCounter == 0)
- {
- if (IsTargetEnemy)
- {
- UseAbillity(enemy);
- }
- else if (IsTargetEnemy == false)
- {
- UseAbillity(ally);
- }
- }
- }
- public void Attack(Soldier enemy)
- {
- if(enemy.IsAvoid == false)
- {
- enemy.Health -= Damage;
- }
- IsGunReady = false;
- }
- public virtual void Heal(Soldier ally)
- {
- if (Health < MaxHealth)
- {
- ally.Health += _random.Next(10, 30);
- }
- }
- public void ReloadGun()
- {
- IsGunReady = true;
- }
- public void CooldownAbility()
- {
- if (AbillityCounter > 0)
- --AbillityCounter;
- }
- }
- class Medic : Soldier
- {
- public int ChargeAbility { get; private set; }
- public Medic()
- {
- Specialty = "Медик";
- IsTargetEnemy = false;
- IsGunReady = false;
- IsAvoid = false;
- Number = 0;
- MaxHealth = 0;
- Health = 0;
- Damage = 0;
- AbillityCounter = 0;
- }
- public Medic(int number, int health, int damage)
- {
- Specialty = "Медик";
- IsTargetEnemy = false;
- IsGunReady = false;
- IsAvoid = false;
- Number = number;
- MaxHealth = health;
- Health = health;
- Damage = damage;
- AbillityCounter = 0;
- }
- public override void UseAbillity(Soldier ally)
- {
- Heal(ally);
- AbillityCounter = 5;
- }
- }
- class Infantryman : Soldier
- {
- public Infantryman()
- {
- Specialty = "Штурмовик";
- IsTargetEnemy = false;
- IsGunReady = false;
- IsAvoid = false;
- Number = 0;
- MaxHealth = 0;
- Health = 0;
- Damage = 0;
- }
- public Infantryman(int number, int health, int damage)
- {
- Specialty = "Штурмовик";
- IsTargetEnemy = true;
- IsGunReady = true;
- IsAvoid = false;
- Number = number;
- MaxHealth = health;
- Health = health;
- Damage = damage;
- }
- public override void UseAbillity(Soldier enemy)
- {
- Health += _random.Next(10, 20);
- AbillityCounter = _random.Next(1, 3);
- }
- }
- class Sniper : Soldier
- {
- public Sniper()
- {
- Specialty = "Снайпер";
- IsTargetEnemy = false;
- IsGunReady = false;
- IsAvoid = false;
- Number = 0;
- MaxHealth = 0;
- Health = 0;
- Damage = 0;
- AbillityCounter = 0;
- }
- public Sniper(int number, int health, int damage)
- {
- Specialty = "Снайпер";
- IsTargetEnemy = true;
- IsGunReady = true;
- IsAvoid = false;
- Number = number;
- MaxHealth = health;
- Health = health;
- Damage = damage;
- AbillityCounter = 3;
- }
- public override void UseAbillity(Soldier soldier)
- {
- IsAvoid = true;
- AbillityCounter = 3;
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement