using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace gladiatorialFight { class Program { static void Main() { Arena arena = new Arena(); arena.Work(); } } class Arena { private List _figthers = new List(1); private List _survivors = new List(); public void Work() { bool isRun = true; while(isRun) { ChooseFighters(ref isRun); if(isRun) StartFight(); } } private void ChooseFighters(ref bool isRun) { while (_figthers.Count != 2 && isRun) { Console.Write("[1] - выбрать готового бойца\n" + "[2] - выбрать выжившего бойца.\n" + "[3] - выход\n" + "Ввод: "); switch (Console.ReadLine()) { case "1": ChooseRandomFighther(); break; case "2": ChooseSurviour(); break; case "3": isRun = false; break; default: Console.WriteLine("Неправильный ввод!"); break; } } } private void ChooseRandomFighther() { Random rand = new Random(); Console.WriteLine("Выберите бойца:\n" + "[1] - Варвар\n" + "[2] - Маг\n" + "[3] - Лучник\n" + "[4] - Рыцарь\n" + "[5] - Ассассин\n"); Console.Write("Ввод: "); switch (Console.ReadLine()) { case "1": Warrior warrior = new Warrior(rand.Next(70, 100), rand.Next(20, 30), rand.Next(0, 10), "Берсерк"); _figthers.Add(warrior); break; case "2": Mage mage = new Mage(rand.Next(50, 90), rand.Next(20, 40), rand.Next(5, 10), "Маг"); _figthers.Add(mage); break; case "3": Archer archer = new Archer(rand.Next(40, 80), rand.Next(15, 30), rand.Next(0, 10), "Лучник"); _figthers.Add(archer); break; case "4": ShieldMan shieldMan = new ShieldMan(rand.Next(30, 60), rand.Next(20, 35), rand.Next(10, 15), "Рыцарь"); _figthers.Add(shieldMan); break; case "5": Assassin assassin = new Assassin(rand.Next(40, 70), rand.Next(25, 35), rand.Next(0, 6), "Ассассин"); _figthers.Add(assassin); break; default: Console.WriteLine("Ошибка!"); break; } } private void ChooseSurviour() { bool isChose = true; if(_survivors.Count == 0) { Console.WriteLine("Нет выживших бойцов!"); return; } foreach (var survior in _survivors) { Console.WriteLine($"№{_survivors.Count}: {survior.Name}; HP = {survior.CurrentHealth }; DMG = {survior.CurrentDamage}; ARM = {survior.CurrentArmor}"); } Console.Write("Ввод: "); while (isChose) { isChose = int.TryParse(Console.ReadLine(), out int number); if (isChose) { --number; foreach (var figther in _figthers) { if(figther == _survivors[number]) { Console.WriteLine("Этот выживший уже выбран!"); return; } } _figthers.Add(_survivors[number]); isChose = false; } else if (isChose) { Console.WriteLine("Такого выжившего нет. Введите занового."); } } } public void StartFight() { Console.Clear(); while (IsGameover()) { ShowFightersStats(); Console.WriteLine("\n"); Console.WriteLine($"{_figthers[0].Name} наносит удар..."); _figthers[0].Attack(_figthers[1]); Console.WriteLine(); Console.WriteLine($"{_figthers[1].Name} наносит удар..."); _figthers[1].Attack(_figthers[0]); Console.ReadKey(true); Console.Clear(); } ClearFightersList(); } public void ShowFightersStats() { _figthers[0].ShowStats(); Console.WriteLine("====================="); _figthers[1].ShowStats(); } public bool IsGameover() { bool flag = true; if (_figthers[0].IsAlive() == false) { Console.WriteLine("1 боец умер!"); _figthers[1].RefreshStats(); foreach (var fighter in _survivors) { if(fighter == _figthers[1]) { Console.WriteLine("Боец снова выжил!"); flag = false; return flag; } } _survivors.Add(_figthers[1]); flag = false; } else if (_figthers[1].IsAlive() == false) { Console.WriteLine("2 боец умер!"); _figthers[0].RefreshStats(); foreach (var fighter in _survivors) { if (fighter == _figthers[0]) { Console.WriteLine("Боец снова выжил!"); flag = false; return flag; } } _survivors.Add(_figthers[0]); flag = false; } else if (_figthers[0].IsAlive() && _figthers[1].IsAlive() == false) { Console.WriteLine("Оба бойца умерли!"); flag = false; } return flag; } public void ClearFightersList() { Console.WriteLine("Освобождаем Арену..."); _figthers.Clear(); } } abstract class Figther { public bool IsAvoid { get; protected set; } public bool IsPoisonAttack { get; protected set; } public int ReloadAbillityCounter { get; protected set; } public int CurrentHealth { get; protected set; } public int MaxHealth { get; protected set; } public int CurrentDamage { get; protected set; } public int MaxDamage { get; protected set; } public int CurrentArmor { get; protected set; } public int MaxArmor { get; protected set; } public string Name { get; protected set; } public abstract void UseAbility(Figther enemy); public void Attack(Figther enemy) { if (IsAbilityReady()) { UseAbility(enemy); } else { enemy.TakeDamage(CurrentDamage); } } public void TakeDamage(int damage) { if (IsAvoid) { Console.WriteLine(Name + " увернулся!"); IsAvoid = false; return; } else if (IsPoisonAttack) { Console.WriteLine("Ядовитая атака проходит сквозь броню!"); IsPoisonAttack = false; CurrentHealth -= damage; return; } CurrentHealth -= damage - (CurrentArmor / 2); if (CurrentHealth < 0) CurrentHealth = 0; if (CurrentArmor > 0) { CurrentArmor -= damage - (CurrentArmor / 10); if (CurrentArmor < 0) { CurrentArmor = 0; Console.WriteLine($"{Name} теряет броню!"); } } } public virtual bool IsAbilityReady() { if (ReloadAbillityCounter == 0) { Console.WriteLine("Способность готова!"); return true; } else if (ReloadAbillityCounter > 0) { Console.WriteLine("Способность перезаряжается! Осталось: " + ReloadAbillityCounter--); } return false; } public bool IsAlive() { return CurrentHealth > 0; } public virtual void ShowStats() { Console.WriteLine($"{Name}:HP = {CurrentHealth }; DMG = {CurrentDamage}; ARM = {CurrentArmor}"); } public void RefreshStats() { CurrentHealth = MaxHealth; CurrentArmor = MaxArmor; CurrentDamage = MaxDamage; } } class Warrior : Figther { public Warrior(int health, int damage, int armor, string name) { MaxHealth = health; CurrentHealth = health; MaxDamage = damage; CurrentDamage = damage; MaxArmor = armor; CurrentArmor = armor; Name = name; } public override void UseAbility(Figther enemy) { Console.WriteLine("Варвар использует Гриб-Берсерка!"); Random rand = new Random(); CurrentHealth += rand.Next(5, 26); CurrentDamage += rand.Next(5, 11); CurrentArmor -= rand.Next(5, 10); if (CurrentArmor < 0) CurrentArmor = 0; ShowStats(); ReloadAbillityCounter = 3; } public override bool IsAbilityReady() { return base.IsAbilityReady(); } } class Mage : Figther { public Mage(int health, int damage, int armor, string name) { MaxHealth = health; CurrentHealth = health; MaxDamage = damage; CurrentDamage = damage; MaxArmor = armor; CurrentArmor = armor; Name = name; } public override void UseAbility(Figther enemy) { Console.WriteLine("Маг кастует огненный шар!"); ReloadAbillityCounter = 5; Random rand = new Random(); enemy.TakeDamage(rand.Next(20, 40)); } public override bool IsAbilityReady() { return base.IsAbilityReady(); } } class Archer : Figther { public Archer(int health, int damage, int armor, string name) { MaxHealth = health; CurrentHealth = health; MaxDamage = damage; CurrentDamage = damage; MaxArmor = armor; CurrentArmor = armor; Name = name; } public override void UseAbility(Figther enemy) { Console.WriteLine("Лучник стреляет в ответ!"); ReloadAbillityCounter = 2; Random rand = new Random(); enemy.TakeDamage(rand.Next(20, 40)); IsAvoid = true; } public override bool IsAbilityReady() { return base.IsAbilityReady(); } } class ShieldMan : Figther { public ShieldMan(int health, int damage, int armor, string name) { MaxHealth = health; CurrentHealth = health; MaxDamage = damage; CurrentDamage = damage; MaxArmor = armor; CurrentArmor = armor; Name = name; } public override void UseAbility(Figther enemy) { Console.WriteLine("Рыцарь закрылся щитом!"); Random rand = new Random(); CurrentArmor += rand.Next(10, 20); ShowStats(); IsAvoid = true; ReloadAbillityCounter = 2; } public override bool IsAbilityReady() { return base.IsAbilityReady(); } } class Assassin : Figther { public Assassin(int health, int damage, int armor, string name) { MaxHealth = health; CurrentHealth = health; MaxDamage = damage; CurrentDamage = damage; MaxArmor = armor; CurrentArmor = armor; Name = name; } public override void UseAbility(Figther enemy) { Console.WriteLine("Ассассин бросает ядовитые кинжалы!"); Random rand = new Random(); ReloadAbillityCounter = 1; enemy.TakeDamage(rand.Next(20, 30)); } public override bool IsAbilityReady() { return base.IsAbilityReady(); } } }