Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System;
- using System.Collections.Generic;
- using System.Drawing;
- using System.Reflection;
- internal class Program
- {
- static void Main(string[] args)
- {
- Arena arena = new Arena();
- arena.Run();
- }
- }
- public static class UserUtils
- {
- private static Random s_random = new Random();
- public static bool GenerateRandomNumber(int chancePercent)
- {
- int minRandom = 0;
- int maxRandom = 100;
- return chancePercent >= s_random.Next(minRandom, maxRandom+1);
- }
- }
- public interface IDamageable
- {
- bool IsAlive { get; }
- void TakeDamage(int damage);
- }
- public abstract class Fighter : IDamageable
- {
- protected Fighter(string name, int damage, int defense, int maxHealth)
- {
- Name = name;
- Damage = damage;
- Defense = defense;
- MaxHealth = maxHealth;
- Health = maxHealth;
- }
- 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 int MaxHealth { get; protected set; }
- public bool IsAlive => Health > 0;
- public virtual void TakeDamage(int damage)
- {
- int finalDamage = damage - Defense;
- if (finalDamage < 0)
- finalDamage = 0;
- Health -= finalDamage;
- if (Health < 0)
- Health = 0;
- Console.WriteLine($"{Name} получает {finalDamage} урона. Текущее здоровье: {Health}/{MaxHealth}");
- }
- public abstract Fighter Clone();
- public abstract void Attack(IDamageable target);
- public virtual void PrintStats()
- {
- Console.WriteLine(
- $"{Name}: Здоровье {Health}/{MaxHealth}, Урон {Damage}, Защита {Defense}");
- }
- protected int BaseAttackDamage()
- {
- return Damage;
- }
- }
- public class CritFighter : Fighter
- {
- private int _critChancePercent;
- private int _critMultiplier;
- public CritFighter(string name, int damage, int defense, int maxHealth) : base(name, damage, defense, maxHealth)
- {
- _critChancePercent = 20;
- _critMultiplier = 3;
- }
- public override Fighter Clone()
- {
- return new CritFighter(Name, Damage, Defense, MaxHealth);
- }
- public override void Attack(IDamageable target)
- {
- int damage = BaseAttackDamage();
- bool isCrit = UserUtils.GenerateRandomNumber(_critChancePercent);
- if (isCrit)
- {
- damage *= _critMultiplier;
- Console.WriteLine($"{Name} наносит КРИТИЧЕСКИЙ удар!");
- }
- else
- {
- Console.WriteLine($"{Name} атакует противника.");
- }
- target.TakeDamage(damage);
- }
- }
- public class BurstFighter : Fighter
- {
- private int _attackCounter = 0;
- public BurstFighter(string name, int damage, int defense, int maxHealth) : base(name, damage, defense, maxHealth)
- {
- }
- public override Fighter Clone()
- {
- return new BurstFighter(Name, Damage, Defense, MaxHealth);
- }
- public override void Attack(IDamageable target)
- {
- int seriesOfBlows = 3;
- int damage = BaseAttackDamage();
- _attackCounter++;
- if (_attackCounter % seriesOfBlows == 0)
- {
- Console.WriteLine($"{Name} проводит серию ударов! Двойная атака!");
- target.TakeDamage(damage);
- _attackCounter = 0;
- }
- else
- {
- Console.WriteLine($"{Name} атакует противника.");
- }
- target.TakeDamage(damage);
- }
- }
- public class RageFighter : Fighter
- {
- private int _rage;
- private int _maxRage;
- private int _healAmount;
- public RageFighter(string name, int damage, int defense, int maxHealth) : base(name, damage, defense, maxHealth)
- {
- _rage = 0;
- _maxRage = 40;
- _healAmount = 15;
- }
- public override Fighter Clone()
- {
- return new RageFighter(Name, Damage, Defense, MaxHealth);
- }
- public override void TakeDamage(int damage)
- {
- int beforeHealth = Health;
- int criticalHealth = 25;
- base.TakeDamage(damage);
- int taken = beforeHealth - Health;
- if (taken > 0)
- {
- _rage += taken;
- if (Health < criticalHealth)
- _rage += taken;
- if (_rage > _maxRage)
- _rage = _maxRage;
- Console.WriteLine($"{Name} накапливает ярость: {_rage}/{_maxRage}");
- }
- if (_rage >= _maxRage && IsAlive)
- {
- _rage = 0;
- Health += _healAmount;
- if (Health > MaxHealth)
- Health = MaxHealth;
- Console.WriteLine($"{Name} впадает в ярость и исцеляется на {_healAmount} HP. Текущее здоровье: {Health}/{MaxHealth}");
- }
- }
- public override void Attack(IDamageable target)
- {
- int damage = BaseAttackDamage();
- target.TakeDamage(damage);
- }
- }
- public class MageFighter : Fighter
- {
- private int _maxMana;
- private int _mana;
- private int _fireballCost;
- private int _fireballDamage;
- public MageFighter(string name, int damage, int defense, int maxHealth) : base(name, damage, defense, maxHealth)
- {
- _maxMana = 100;
- _mana = _maxMana;
- _fireballCost = 35;
- _fireballDamage = 10;
- }
- public override Fighter Clone()
- {
- return new MageFighter(Name, Damage, Defense, MaxHealth);
- }
- public override void Attack(IDamageable target)
- {
- int damage = BaseAttackDamage();
- if (_fireballCost <= _mana)
- {
- _mana -= _fireballCost;
- damage += _fireballDamage;
- target.TakeDamage(damage);
- Console.WriteLine($"{Name} использует заклинание \"Огненный шар\" и наносит повышенный урон!");
- }
- else
- {
- Console.WriteLine($"{Name} атакует обычной атакой (недостаточно маны для огненного шара).");
- target.TakeDamage(damage);
- }
- }
- }
- public class DodgeFighter : Fighter
- {
- private int _dodgeChancePercent;
- public DodgeFighter(string name, int damage, int defense, int maxHealth) : base(name, damage, defense, maxHealth)
- {
- _dodgeChancePercent = 20;
- }
- public override Fighter Clone()
- {
- return new DodgeFighter(Name, Damage, Defense, MaxHealth);
- }
- public override void TakeDamage(int damage)
- {
- if (UserUtils.GenerateRandomNumber(_dodgeChancePercent))
- {
- Console.WriteLine($"{Name} ловко уклоняется от атаки и не получает урона!");
- }
- else
- {
- base.TakeDamage(damage);
- }
- }
- public override void Attack(IDamageable target)
- {
- int damage = BaseAttackDamage();
- target.TakeDamage(damage);
- }
- }
- public class Arena
- {
- private List<Fighter> _fighters = new List<Fighter>();
- public Arena()
- {
- _fighters.Add(new CritFighter("Критик", 14, 5, 100));
- _fighters.Add(new BurstFighter("Берсерк", 12, 6, 120));
- _fighters.Add(new RageFighter("Ярость", 15, 7, 80));
- _fighters.Add(new MageFighter("Маг", 20, 4, 100));
- _fighters.Add(new DodgeFighter("Ловкач", 20, 8, 90));
- }
- public void Run()
- {
- const string CommandShowWelcome = "1";
- const string CommandShowFighters = "2";
- const string CommandExit = "3";
- bool isRun = true;
- ShowWelcome();
- while (isRun)
- {
- Console.Clear();
- Console.WriteLine($"Главное меню:\n" +
- $"{CommandShowWelcome} - Приветственное сообщение.\n" +
- $"{CommandShowFighters} - Посмотреть бой.\n" +
- $"{CommandExit} - Выход из программы.\n" +
- $"Ваш выбор: ");
- switch (Console.ReadLine())
- {
- case CommandShowWelcome:
- ShowWelcome();
- break;
- case CommandShowFighters:
- ShowFight();
- break;
- case CommandExit:
- isRun = false;
- break;
- default:
- Console.WriteLine("Ошибка ввода.");
- break;
- }
- Console.WriteLine("Программа завершена.");
- }
- }
- private void ShowWelcome()
- {
- Console.Clear();
- Console.WriteLine("" +
- "╔══════════════════════════════════════╗\n" +
- "║ Добро пожаловать на арену Колизея! ║\n" +
- "╚══════════════════════════════════════╝");
- Console.ReadKey();
- }
- private void ShowFight()
- {
- Console.Clear();
- ShowFighters();
- Console.Write("выбери первого бойца: ");
- Fighter fighter1 = ChooseFighter();
- Console.Write("Выбери второго бойца: ");
- Fighter fighter2 = ChooseFighter();
- FightToDeath(fighter1, fighter2);
- Console.ReadKey(true);
- }
- private void FightToDeath(Fighter fighter1, Fighter fighter2)
- {
- while (fighter1.IsAlive && fighter2.IsAlive)
- {
- fighter1.Attack(fighter2);
- Console.WriteLine();
- fighter2.Attack(fighter1);
- }
- Fighter? winner = fighter1.IsAlive ? fighter1 : fighter2.IsAlive ? fighter2 : null;
- Console.WriteLine(winner != null
- ? $"Победил {winner.Name}"
- : "Оба бойца погибли! Ничья!");
- }
- private void ShowFighters()
- {
- for (int i = 0; i < _fighters.Count; i++)
- {
- Console.Write(i + 1 + ". ");
- _fighters[i].PrintStats();
- Console.WriteLine();
- }
- }
- private Fighter ChooseFighter()
- {
- int userInput;
- int indexFighter;
- bool isValid;
- do
- {
- userInput = ReadNumber();
- isValid = userInput > 0 && userInput <= _fighters.Count;
- if (isValid == false)
- {
- Console.Write("Нет бойца под таким номером. Попробуйте ещё раз: ");
- }
- }
- while (isValid == false);
- indexFighter = userInput - 1;
- return _fighters[indexFighter].Clone();
- }
- private int ReadNumber()
- {
- int number;
- while (int.TryParse(Console.ReadLine(), out number) == false)
- {
- Console.Write("Это не число. Попробуйте ещё раз: ");
- }
- return number;
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment