Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- namespace Colosseum
- {
- class Program
- {
- static void Main(string[] args)
- {
- Arena arena = new Arena();
- arena.Run();
- }
- }
- abstract class Fighter
- {
- public Fighter(string type, string name, int damage, int defense, int health, string uniqueAbilityDescription)
- {
- Type = type;
- Name = name;
- Damage = damage;
- Defense = defense;
- Health = health;
- UniqueAbilityDescription = uniqueAbilityDescription;
- }
- public string Type { get; protected set; }
- public string Name { get; protected set; }
- public int Damage { get; protected set; }
- public int Defense { get; protected set; }
- public int Health { get; protected set; }
- public string UniqueAbilityDescription { get; protected set; }
- public virtual void Attack(Fighter opponent)
- {
- int inflictedDamage = Math.Max(0, Damage - opponent.Defense);
- Console.WriteLine($"{Name} атакует {opponent.Name} и наносит {inflictedDamage} урона.");
- opponent.TakeDamage(inflictedDamage);
- }
- public virtual void TakeDamage(int damage)
- {
- Health = Math.Max(0, Health - damage);
- Console.WriteLine($"{Name} получает {damage} урона. Осталось здоровья: {Health}");
- }
- public virtual bool IsAlive() => Health > 0;
- public virtual string GetShortStats() =>
- $"( Имя: {Name} | Здоровье: {Health} | Урон: {Damage} | Защита: {Defense} | Способность: {UniqueAbilityDescription})";
- public virtual void DisplayStats()
- {
- Console.WriteLine($" Имя: {Name}");
- Console.WriteLine($" Тип: {Type}");
- Console.WriteLine($" Урон: {Damage}");
- Console.WriteLine($" Защита: {Defense}");
- Console.WriteLine($" Здоровье: {Health}");
- Console.WriteLine($" Особая способность: {UniqueAbilityDescription}");
- }
- }
- class BasicFighter : Fighter
- {
- public BasicFighter(string name, int damage, int defense, int health)
- : base("Воин", name, damage, defense, health, "Нет особых способностей") { }
- }
- class DoubleDamageFighter : Fighter
- {
- private int _doubleDamageChance = 30;
- private int _damageMultiplier = 2;
- private int _randomNumberMin = 1;
- private int _randomNumberMax = 100;
- public DoubleDamageFighter(string name, int damage, int defense, int health)
- : base("Двойной Урон", name, damage, defense, health, "Имеет шанс нанести удвоенный урон") { }
- public override void Attack(Fighter opponent)
- {
- if (UserUtils.GenerateRandomNumber(_randomNumberMin, _randomNumberMax) <= _doubleDamageChance)
- {
- int doubledDamage = Math.Max(0, Damage * _damageMultiplier - opponent.Defense);
- Console.WriteLine($"{Name} использует двойной урон и наносит {doubledDamage} урона!");
- opponent.TakeDamage(doubledDamage);
- }
- else
- {
- base.Attack(opponent);
- }
- }
- }
- class TripleAttackFighter : Fighter
- {
- private int _attackInterval = 3;
- private int _damageMultiplier = 2;
- private int _attackCounter = 0;
- public TripleAttackFighter(string name, int damage, int defense, int health)
- : base("Тройная Атака", name, damage, defense, health, "Каждую третью атаку наносит двойной урон") { }
- public override void Attack(Fighter opponent)
- {
- _attackCounter++;
- if (_attackCounter % _attackInterval == 0)
- {
- int doubleDamage = Math.Max(0, Damage * _damageMultiplier - opponent.Defense);
- Console.WriteLine($"{Name} использует ДВОЙНОЙ УРОН (каждые три атаки) и наносит {doubleDamage} урона!");
- opponent.TakeDamage(doubleDamage);
- }
- else
- {
- base.Attack(opponent);
- }
- }
- }
- class RageFighter : Fighter
- {
- private int _rage = 0;
- private int _maxRage = 100;
- private int _healingAmount = 30;
- private int _maxHealthValue = 100;
- public RageFighter(string name, int damage, int defense, int health)
- : base("Ярость", name, damage, defense, health, "Получая урон накапливает ярость и лечится") { }
- public override void TakeDamage(int damage)
- {
- base.TakeDamage(damage);
- _rage = Math.Min(_rage + damage, _maxRage);
- if (_rage == _maxRage && Health > 0)
- {
- int healedAmount = Math.Min(_healingAmount, _maxHealthValue - Health);
- Health += healedAmount;
- Console.WriteLine($"{Name} накапливает ярость и использует лечение! Восстановлено {healedAmount} здоровья. Текущее здоровье: {Health}");
- _rage = 0;
- }
- }
- }
- class MageFighter : Fighter
- {
- private int _mana = 100;
- private int _maxMana = 100;
- private int _fireBallCost = 30;
- private int _fireBallDamageMultiplier = 2;
- private int _manaRegenerationAmount = 10;
- public MageFighter(string name, int damage, int defense, int health)
- : base("Маг", name, damage, defense, health, "Использует заклинание огненный шар") { }
- public override void Attack(Fighter opponent)
- {
- if (_mana >= _fireBallCost)
- {
- _mana -= _fireBallCost;
- int fireBallDamage = Math.Max(0, Damage * _fireBallDamageMultiplier - opponent.Defense);
- Console.WriteLine($"{Name} использует ОГНЕННЫЙ ШАР и наносит {fireBallDamage} урона! Осталось маны: {_mana}");
- opponent.TakeDamage(fireBallDamage);
- }
- else
- {
- base.Attack(opponent);
- _mana = Math.Min(_maxMana, _mana + _manaRegenerationAmount);
- Console.WriteLine($"{Name} использует обычную атаку. Осталось маны: {_mana}");
- }
- }
- }
- class DodgeFighter : Fighter
- {
- private const int DodgeChance = 30;
- private int _randomNumberMin = 1;
- private int _randomNumberMax = 100;
- public DodgeFighter(string name, int damage, int defense, int health)
- : base("Уклонение", name, damage, defense, health, "Имеет шанс уклониться от атаки") { }
- public override void TakeDamage(int damage)
- {
- if (UserUtils.GenerateRandomNumber(_randomNumberMin, _randomNumberMax) > DodgeChance)
- {
- base.TakeDamage(damage);
- }
- else
- {
- Console.WriteLine($"{Name} УКЛОНЯЕТСЯ от атаки!");
- }
- }
- }
- class Arena
- {
- private List<Fighter> availableFighters = new List<Fighter>();
- public Arena()
- {
- availableFighters.AddRange(new Fighter[]
- {
- new DoubleDamageFighter("TempleKnight", 15, 5, 100),
- new TripleAttackFighter("Knight", 12, 7, 110),
- new RageFighter("Rager", 10, 8, 120),
- new MageFighter("Sorcerer", 18, 3, 90),
- new DodgeFighter("Dodger", 11, 6, 105),
- new BasicFighter("Warrior", 13, 6, 115)
- });
- }
- public void Run()
- {
- const string CommandFight = "go";
- const string CommandExitMenu = "exit";
- bool isProgramUp = true;
- while (isProgramUp)
- {
- Console.WriteLine("Добро пожаловать на арену Колизея!");
- Console.WriteLine($"\nВыберите действие: \n1) Введите '{CommandFight}' чтобы посмотреть бой " +
- $"\n2) Введите '{CommandExitMenu}' чтобы выйти");
- string userInput = Console.ReadLine();
- switch (userInput)
- {
- case CommandFight:
- ConductFight();
- break;
- case CommandExitMenu:
- isProgramUp = false;
- break;
- default:
- Console.WriteLine("Неверная команда!!!");
- break;
- }
- Console.ReadKey();
- Console.Clear();
- }
- }
- private void ConductFight()
- {
- Console.WriteLine("\nСписок доступных бойцов:");
- for (int i = 0; i < availableFighters.Count; i++)
- {
- Console.WriteLine($"{i + 1}. {availableFighters[i].Name} ({availableFighters[i].Type}) {availableFighters[i].GetShortStats()}");
- }
- Fighter fighter1 = ChooseFighter("первого");
- if (fighter1 == null) return;
- Fighter fighter2 = ChooseFighter("второго");
- if (fighter2 == null) return;
- StartFight(fighter1, fighter2);
- }
- private Fighter ChooseFighter(string ordinalNumber)
- {
- while (true)
- {
- Console.Write($"Выберите порядковый номер {ordinalNumber} бойца: ");
- if (int.TryParse(Console.ReadLine(), out int fighterNumber))
- {
- if (fighterNumber >= 1 && fighterNumber <= availableFighters.Count)
- {
- return CreateFighterCopy(availableFighters[fighterNumber - 1]);
- }
- else
- {
- Console.WriteLine("Неверный номер бойца. Пожалуйста, выберите номер из списка.");
- }
- }
- else
- {
- Console.WriteLine("Неверный ввод. Пожалуйста, введите число.");
- }
- }
- }
- private Fighter CreateFighterCopy(Fighter fighter)
- {
- if (fighter is DoubleDamageFighter)
- return new DoubleDamageFighter(fighter.Name, fighter.Damage, fighter.Defense, fighter.Health);
- if (fighter is TripleAttackFighter)
- return new TripleAttackFighter(fighter.Name, fighter.Damage, fighter.Defense, fighter.Health);
- if (fighter is RageFighter)
- return new RageFighter(fighter.Name, fighter.Damage, fighter.Defense, fighter.Health);
- if (fighter is MageFighter)
- return new MageFighter(fighter.Name, fighter.Damage, fighter.Defense, fighter.Health);
- if (fighter is DodgeFighter)
- return new DodgeFighter(fighter.Name, fighter.Damage, fighter.Defense, fighter.Health);
- if (fighter is BasicFighter)
- return new BasicFighter(fighter.Name, fighter.Damage, fighter.Defense, fighter.Health);
- return null;
- }
- private void StartFight(Fighter fighter1, Fighter fighter2)
- {
- Console.WriteLine("\n=== Начинается бой! ===");
- Console.WriteLine($"Боец 1: {fighter1.Name} ({fighter1.Type})");
- Console.WriteLine($"Боец 2: {fighter2.Name} ({fighter2.Type})");
- int round = 1;
- while (fighter1.IsAlive() && fighter2.IsAlive())
- {
- Console.WriteLine($"\n--- Раунд {round} ---");
- fighter1.Attack(fighter2);
- if (!fighter2.IsAlive())
- {
- Console.WriteLine($"{fighter2.Name} повержен!");
- break;
- }
- fighter2.Attack(fighter1);
- if (!fighter1.IsAlive())
- {
- Console.WriteLine($"{fighter1.Name} повержен!");
- break;
- }
- Console.WriteLine($"\nСтатистика после раунда {round}:");
- Console.WriteLine($" {fighter1.Name}: Здоровье = {fighter1.Health}");
- Console.WriteLine($" {fighter2.Name}: Здоровье = {fighter2.Health}");
- Console.WriteLine("\nНажмите любую клавишу для продолжения...");
- Console.ReadKey();
- Console.Clear();
- round++;
- }
- Console.WriteLine("\n=== Бой окончен! ===");
- if (fighter1.IsAlive())
- {
- Console.WriteLine($"Победил {fighter1.Name}!");
- }
- else if (fighter2.IsAlive())
- {
- Console.WriteLine($"Победил {fighter2.Name}!");
- }
- else
- {
- Console.WriteLine("Ничья!");
- }
- Console.ReadKey();
- }
- }
- public static class UserUtils
- {
- private static Random s_random = new Random();
- public static int GenerateRandomNumber(int min, int max)
- {
- return s_random.Next(min, max + 1);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment