Last active
April 22, 2024 20:00
-
-
Save Dead-in-side/92382c47b8b5b51e23b5950a58cad322 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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