Skip to content

Instantly share code, notes, and snippets.

@Strelok78
Last active May 17, 2023 07:54
Show Gist options
  • Save Strelok78/6b1719ffca08cd35c9ad082957a764a0 to your computer and use it in GitHub Desktop.
Save Strelok78/6b1719ffca08cd35c9ad082957a764a0 to your computer and use it in GitHub Desktop.
Choose 2 fighters and they fight each other to death
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