Skip to content

Instantly share code, notes, and snippets.

@Dead-in-side
Last active April 22, 2024 20:00
Show Gist options
  • Save Dead-in-side/92382c47b8b5b51e23b5950a58cad322 to your computer and use it in GitHub Desktop.
Save Dead-in-side/92382c47b8b5b51e23b5950a58cad322 to your computer and use it in GitHub Desktop.
namespace IJunior
{
public class Program
{
private static void Main(string[] args)
{
BattleArena arena = new BattleArena();
arena.Fight();
}
}
public class BattleArena
{
private List<Warior> _wariors = new List<Warior>();
private Warior _warior1;
private Warior _warior2;
public void Fight()
{
AddWariors();
Console.WriteLine("Добро пожаловать на арену!\nВам доступны следующие бойцы: ");
ShowFighters();
ChooseWariors();
while (_warior1.Health > 0 && _warior2.Health > 0)
{
_warior1.Attack(_warior2);
_warior2.Attack(_warior1);
Console.WriteLine(_warior1.Name + ". Здоровье: " + _warior1.Health + "||" + _warior2.Name + ". Здоровье: " + _warior2.Health);
Console.ReadLine();
}
DeclareWinner();
}
private void DeclareWinner()
{
if (_warior1.Health <= 0 && _warior2.Health <= 0)
{
Console.WriteLine("Победила дружба");
}
else if (_warior1.Health > 0)
{
Console.WriteLine("Победил " + _warior1.Name);
}
else
{
Console.WriteLine("Победил " + _warior2.Name);
}
}
private void AddWariors()
{
_wariors.Add(new Knight("Knight"));
_wariors.Add(new Rogue("Rogue"));
_wariors.Add(new Paladin("Paladin"));
_wariors.Add(new Wizard("Wizard"));
_wariors.Add(new Assasin("Assasin"));
}
private void ChooseWariors()
{
Console.WriteLine("Введите номер первого бойца: ");
_warior1 = VoteWarior();
Console.WriteLine("Введите номер второго бойца: ");
_warior2 = VoteWarior();
}
private Warior VoteWarior()
{
Warior warior = null;
while (warior == null)
{
if (int.TryParse(Console.ReadLine(), out int number) && number <= _wariors.Count && number > 0)
{
number--;
warior = _wariors[number].Clone();
Console.WriteLine("На арену выходит " + warior.Name);
}
else
{
Console.WriteLine("Некорректный номер");
}
}
return warior;
}
private void ShowFighters()
{
for (int i = 0; i < _wariors.Count; i++)
{
Console.WriteLine(i + ". " + _wariors[i].Name);
}
}
}
public abstract class Warior
{
public string Name { get; init; }
public int Health { get; protected set; } = 100;
public int Damage { get; } = 15;
public virtual void Attack(Warior warior)
{
warior.TakeDamage(Damage);
}
public virtual void TakeDamage(int damage)
{
Health -= damage;
}
public Warior Clone() => MemberwiseClone() as Warior;
}
public class Knight : Warior
{
private List<int> _luckyNumbers = new List<int> { 7, 8, 9 };
private int _damageFactor = 2;
public Knight(string name)
{
Name = name;
}
public override void Attack(Warior warior)
{
Random random = new Random();
int lowRandomLimit = 0;
int highRandomLimit = 10;
if (_luckyNumbers.Contains(random.Next(lowRandomLimit, highRandomLimit)))
{
int increasedDamage = Damage * _damageFactor;
warior.TakeDamage(increasedDamage);
}
else
{
warior.TakeDamage(Damage);
}
}
}
public class Rogue : Warior
{
private int _attackCounter;
private int _maxAttackCounter = 3;
public Rogue(string name)
{
Name = name;
}
public override void Attack(Warior warior)
{
base.Attack(warior);
_attackCounter++;
if (_attackCounter == _maxAttackCounter)
{
base.Attack(warior);
_attackCounter = 0;
}
}
}
public class Paladin : Warior
{
private int _rageCounter;
private int _healPercent = 20;
private int _maxRage = 3;
public Paladin(string name)
{
Name = name;
}
public int MaxHealth => Health;
public override void TakeDamage(int damage)
{
base.TakeDamage(damage);
_rageCounter++;
if (_rageCounter == _maxRage)
{
Heal();
_rageCounter = 0;
}
}
private void Heal()
{
int percentFactor = 100;
int healHealth = MaxHealth * _healPercent / percentFactor;
if (MaxHealth >= Health + healHealth)
{
Health += healHealth;
}
else
{
Health = MaxHealth;
}
}
}
public class Wizard : Warior
{
private int _mana = 30;
private int _fireballManacost = 10;
private int _fireballFactor = 3;
public Wizard(string name)
{
Name = name;
}
public override void Attack(Warior warior)
{
if (_mana - _fireballManacost > 0)
{
warior.TakeDamage(CastFireball());
}
else
{
base.Attack(warior);
}
}
private int CastFireball()
{
int fireballDamage = Damage * _fireballFactor;
_mana -= _fireballManacost;
return fireballDamage;
}
}
public class Assasin : Warior
{
private List<int> _missNumers = new List<int> { 9, 10 };
public Assasin(string name)
{
Name = name;
}
public override void TakeDamage(int damage)
{
Random random = new Random();
int lowRandomLimit = 1;
int highRandomLimit = 11;
if (_missNumers.Contains(random.Next(lowRandomLimit, highRandomLimit)) == false)
{
base.TakeDamage(damage);
}
else
{
Console.WriteLine("Уворот!");
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment