Last active
May 17, 2023 07:54
-
-
Save Strelok78/6b1719ffca08cd35c9ad082957a764a0 to your computer and use it in GitHub Desktop.
Choose 2 fighters and they fight each other to death
This file contains hidden or 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
internal class Program | |
{ | |
public static void Main() | |
{ | |
UserInterface userInterface = new(); | |
userInterface.MainMenu(); | |
} | |
} | |
class UserInterface | |
{ | |
private bool _isPlaying = true; | |
public void MainMenu() | |
{ | |
while (_isPlaying) | |
{ | |
Console.Clear(); | |
Console.WriteLine("Press Space or Enter to Start a Game.\nPress any other button to exit.\n"); | |
if (char.IsWhiteSpace(Console.ReadKey().KeyChar)) | |
StartGame(); | |
else | |
ExitApp(); | |
} | |
} | |
private void StartGame() | |
{ | |
Character hero; | |
Character enemy; | |
Colliseum colliseum = new(); | |
Console.WriteLine("Pick a hero character.\n"); | |
hero = colliseum.PickHero(); | |
Console.WriteLine("Pick an enemy character.\n"); | |
enemy = colliseum.PickHero(); | |
colliseum.StartFight(hero, enemy); | |
Console.WriteLine("\n\nPress any key to return to Main Menu"); | |
Console.ReadKey(); | |
} | |
private void ExitApp() | |
{ | |
Console.WriteLine("Good bye!"); | |
_isPlaying = false; | |
} | |
} | |
class Colliseum | |
{ | |
readonly List<Character> _characters = new(); | |
public Colliseum() | |
{ | |
CreateHeroes(); | |
} | |
public Character PickHero() | |
{ | |
int index; | |
Character character; | |
ShowHeroes(); | |
Console.Write("\nEnter number of a character: "); | |
while (int.TryParse(Console.ReadLine(), out index) == false || _characters.Count < index || index <= 0) | |
{ | |
Console.WriteLine("Incorrect enter! Try again!"); | |
} | |
character = _characters[--index]; | |
_characters.RemoveAt(index); | |
Console.Clear(); | |
return character; | |
} | |
public void ShowHeroes() | |
{ | |
foreach (Character character in _characters) | |
{ | |
Console.Write(_characters.IndexOf(character) + 1 + ". "); | |
character.ShowStats(); | |
Console.WriteLine(); | |
} | |
} | |
public void StartFight(Character hero1, Character hero2) | |
{ | |
string dividingLine = new('-', 50); | |
Console.WriteLine("Press any key to start fight!"); | |
Console.ReadKey(); | |
Console.Clear(); | |
hero1.ShowReplic(); | |
Console.WriteLine(); | |
hero2.ShowReplic(); | |
while (hero1.IsAlive && hero2.IsAlive) | |
{ | |
Console.WriteLine(dividingLine); | |
Console.WriteLine($"Round {hero1.Step + 1}:\n"); | |
hero1.Attack(hero2); | |
hero2.Attack(hero1); | |
Console.WriteLine("\n" + dividingLine); | |
hero1.ShowStats(); | |
Console.WriteLine(); | |
hero2.ShowStats(); | |
Console.ReadKey(); | |
Console.Clear(); | |
} | |
ShowFightResult(hero1, hero2); | |
} | |
private void ShowFightResult(Character hero1, Character hero2) | |
{ | |
Console.WriteLine(new string('#', 50)); | |
if (hero1.IsAlive) | |
Console.WriteLine($"{hero1.Name} is a winner\n"); | |
else if (hero2.IsAlive) | |
Console.WriteLine($"{hero2.Name} is a winner\n"); | |
else | |
Console.WriteLine("It's a draw!\n"); | |
hero1.ShowStats(); | |
Console.WriteLine(); | |
hero2.ShowStats(); | |
} | |
private void CreateHeroes() | |
{ | |
_characters.Clear(); | |
_characters.Add(new Warrior(750, 40, 40)); | |
_characters.Add(new Priest(500, 20, 50)); | |
_characters.Add(new Mage(550, 25, 35)); | |
_characters.Add(new Rogue(650, 25, 35)); | |
_characters.Add(new Paladin(900, 30, 20)); | |
} | |
} | |
abstract class Character | |
{ | |
private protected int _health; | |
public Character(int health, int damage, string name) | |
{ | |
Step = 0; | |
Name = name; | |
Damage = damage; | |
MaxHealth = health; | |
_health = health; | |
} | |
public string Name { get; private set; } | |
public int Step { get; private set; } | |
public int Damage { get; private set; } | |
public int MaxHealth { get; private set; } | |
public bool IsAlive { get => _health > 0; } | |
public void Attack(Character enemy) | |
{ | |
Step++; | |
Console.WriteLine($"{Name} deals {enemy.Name} {Damage} damage."); | |
enemy._health -= Damage; | |
UseSkill(enemy); | |
} | |
public void TakeDamage(int damage) | |
{ | |
_health -= damage; | |
} | |
public virtual void ShowReplic() | |
{ | |
Console.Write($"I am {Name}. \n"); | |
} | |
public virtual void ShowStats() | |
{ | |
Console.Write($"Name: {Name}, Health: {_health}, Damage: {Damage}"); | |
} | |
private protected virtual void UseSkill(Character enemy) { } | |
} | |
class Warrior : Character | |
{ | |
private int _armor; | |
public Warrior(int health, int damage, int skillPower, string name = "Warrior") : base(health, damage, name) | |
{ | |
_armor = skillPower; | |
} | |
public override void ShowReplic() | |
{ | |
base.ShowReplic(); | |
Console.WriteLine($"I will destroy you!\n"); | |
} | |
public override void ShowStats() | |
{ | |
base.ShowStats(); | |
Console.Write($", Armor: {_armor}."); | |
} | |
private protected override void UseSkill(Character enemy) | |
{ | |
UseArmor(enemy); | |
} | |
private void UseArmor(Character enemy) | |
{ | |
if (_armor == 0) | |
{ | |
return; | |
} | |
else | |
{ | |
_armor -= enemy.Damage; | |
if (_armor < 0) | |
{ | |
_health += enemy.Damage - _armor; | |
_armor = 0; | |
Console.WriteLine($"({Name}) Armor is destroyed!"); | |
} | |
else | |
{ | |
Console.WriteLine($"({Name}) Armor blocked all the damage!"); | |
_health += enemy.Damage; | |
} | |
} | |
} | |
} | |
class Priest : Character | |
{ | |
private int _mana; | |
private readonly int _maxMana; | |
private readonly int _skillManaValue; | |
private readonly int _healPower; | |
private readonly int _manaRecovery; | |
public Priest(int health, int damage, int skillPower, string name = "Priest") : base(health, damage, name) | |
{ | |
_skillManaValue = 10; | |
_healPower = 40; | |
_manaRecovery = 5; | |
_mana = skillPower; | |
_maxMana = skillPower; | |
} | |
public override void ShowReplic() | |
{ | |
base.ShowReplic(); | |
Console.WriteLine($"I won't let you harm others!\n"); | |
} | |
public override void ShowStats() | |
{ | |
base.ShowStats(); | |
Console.Write($", Mana: {_mana}."); | |
} | |
private protected override void UseSkill(Character enemy) | |
{ | |
ManaRecovery(); | |
Heal(); | |
} | |
private void Heal() | |
{ | |
if (_mana > _skillManaValue) | |
{ | |
_health += _healPower; | |
_mana -= _skillManaValue; | |
Console.WriteLine($"({Name}) Uses healing skill (+{_healPower} HP)!"); | |
} | |
_health = _health > MaxHealth ? MaxHealth : _health; | |
} | |
private void ManaRecovery() | |
{ | |
_mana = _mana + _manaRecovery >= _maxMana ? _maxMana : _mana + _manaRecovery; | |
Console.WriteLine($"({Name}) Rstores {_manaRecovery} points of mana"); | |
} | |
} | |
class Mage : Character | |
{ | |
private int _skillCounter; | |
private readonly int _fireBallDamage; | |
private readonly int _damageSkillStep; | |
public Mage(int health, int damage, int skillPower, string name = "Mage") : base(health, damage, name) | |
{ | |
_damageSkillStep = 2; | |
_fireBallDamage = skillPower; | |
} | |
public override void ShowReplic() | |
{ | |
base.ShowReplic(); | |
Console.WriteLine($"I will burn you to ashes!\n"); | |
} | |
public override void ShowStats() | |
{ | |
base.ShowStats(); | |
Console.Write($", Skill name: Fire Ball, Used times: {_skillCounter}."); | |
} | |
private protected override void UseSkill(Character enemy) | |
{ | |
UseFireBall(enemy); | |
} | |
private void UseFireBall(Character enemy) | |
{ | |
if (Step % _damageSkillStep == 0) | |
{ | |
Console.WriteLine($"({Name}) Uses FireBall and deals {_fireBallDamage} damage to {enemy.Name}"); | |
enemy.TakeDamage(_fireBallDamage); | |
_skillCounter++; | |
} | |
} | |
} | |
class Rogue : Character | |
{ | |
private readonly float _attackSpeed; | |
private readonly float _speedRate; | |
public Rogue(int health, int damage, int skillPower, string name = "Rogue") : base(health, damage, name) | |
{ | |
_speedRate = 0.01f; | |
_attackSpeed = (float)skillPower * _speedRate; | |
} | |
public override void ShowReplic() | |
{ | |
base.ShowReplic(); | |
Console.WriteLine($"I will kill you silently\n"); | |
} | |
public override void ShowStats() | |
{ | |
base.ShowStats(); | |
Console.Write($", Attack speed: {_attackSpeed}."); | |
} | |
private protected override void UseSkill(Character enemy) | |
{ | |
enemy.TakeDamage(UseFlurryOfBlows()); | |
Console.WriteLine($"{Name} deals extra {(int)(_attackSpeed * Damage)} damage to {enemy.Name}"); | |
} | |
private int UseFlurryOfBlows() | |
{ | |
return (int)(_attackSpeed * Damage); | |
} | |
} | |
class Paladin : Character | |
{ | |
private int _armor; | |
private int _mana; | |
private int _skillCounter; | |
private readonly int _lightDamage; | |
private readonly int _skillManaCost; | |
private readonly int _skillHealing; | |
private readonly float _damageSkillRatio; | |
private readonly int _damageSkillStep; | |
public Paladin(int health, int damage, int skillPower, string name = "Paladin") : base(health, damage, name) | |
{ | |
_skillManaCost = 5; | |
_skillHealing = 5; | |
_damageSkillRatio = 1.5f; | |
_damageSkillStep = 3; | |
_armor = skillPower; | |
_mana = skillPower; | |
_lightDamage = (int)(skillPower * _damageSkillRatio); | |
} | |
public override void ShowReplic() | |
{ | |
base.ShowReplic(); | |
Console.WriteLine($"I will save my people!\n"); | |
} | |
public override void ShowStats() | |
{ | |
base.ShowStats(); | |
Console.Write($", Armor: {_armor}, Mana: {_mana}, "); | |
Console.Write($"Light attack used: {_skillCounter} times."); | |
} | |
private protected override void UseSkill(Character enemy) | |
{ | |
UseArmor(enemy); | |
Heal(); | |
UsePillarOfLight(enemy); | |
} | |
private void UseArmor(Character enemy) | |
{ | |
if (_armor > 0) | |
{ | |
_armor -= enemy.Damage; | |
if (_armor < 0) | |
{ | |
_health += enemy.Damage - _armor; | |
_armor = 0; | |
Console.WriteLine($"({Name}) Armor is destroyed!"); | |
} | |
else | |
{ | |
Console.WriteLine($"({Name}) Armor blocked all the damage!"); | |
_health += enemy.Damage; | |
} | |
} | |
} | |
private void Heal() | |
{ | |
if (_mana >= _skillManaCost) | |
{ | |
Console.WriteLine($"({Name}) Uses healing skill (+{_skillHealing} HP)!"); | |
_health += _skillHealing; | |
_mana -= _skillManaCost; | |
} | |
_health = _health > MaxHealth ? MaxHealth : _health; | |
} | |
private void UsePillarOfLight(Character enemy) | |
{ | |
if (Step % _damageSkillStep == 0 && _mana >= _skillManaCost) | |
{ | |
_skillCounter++; | |
enemy.TakeDamage(_lightDamage); | |
_mana -= _skillManaCost; | |
Console.WriteLine($"{Name} uses Light Attack! Deals {_lightDamage} danmage to {enemy.Name}"); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment