Skip to content

Instantly share code, notes, and snippets.

@Velsimir
Last active November 16, 2022 20:02
Show Gist options
  • Save Velsimir/063f61220aab9c4a06837fed02ad749a to your computer and use it in GitHub Desktop.
Save Velsimir/063f61220aab9c4a06837fed02ad749a to your computer and use it in GitHub Desktop.
using System;
using System.Collections.Generic;
using System.Linq;
namespace iJunior
{
class MainClass
{
public static void Main(string[] args)
{
Arena arena = new Arena();
arena.Fight();
}
}
abstract class Fighter
{
protected int NecessaryChanceOfSuccess = 50;
public int HealthPoint { get; protected set; }
public int ManaPoint { get; protected set; }
public int AttackPower { get; protected set; }
public int SpellChance { get; protected set; }
protected Fighter(int healthPoint, int manaPoint, int physicalAttack)
{
HealthPoint = healthPoint;
ManaPoint = manaPoint;
AttackPower = physicalAttack;
}
public virtual void Attack(Fighter enemyFighter)
{
Console.WriteLine($"Наносит обычный удар в {AttackPower} единиц урона");
enemyFighter.TakeDamage(AttackPower);
}
public virtual void TakeDamage(int damage)
{
HealthPoint -= damage;
}
}
class HumanWarrior : Fighter
{
private Random _random = new Random();
public HumanWarrior() : base(126, 100, 4) { }
public override void Attack(Fighter enemyFighter)
{
SpellChance = _random.Next(100);
if (SpellChance > NecessaryChanceOfSuccess)
{
enemyFighter.TakeDamage(CastMultiplierAttack());
}
else
{
base.Attack(enemyFighter);
}
}
private int CastMultiplierAttack()
{
int manaCoast = 10;
if (ManaPoint >= manaCoast)
{
int minCritical = 1;
int maxCritical = 4;
int criticalMultiplier = _random.Next(minCritical, maxCritical);
int damage;
Console.Write("Использует Critical Attack| ");
damage = criticalMultiplier * AttackPower;
ManaPoint -= manaCoast;
Console.WriteLine($" и наносит противнику {damage} единиц урона!");
return damage;
}
Console.WriteLine($" Не хватает маны! Наносит противнику {AttackPower} единиц урона!");
return AttackPower;
}
}
class HumanMage : Fighter
{
private Random _random = new Random();
public HumanMage() : base(90, 100, 7) { }
public override void Attack(Fighter enemyFighter)
{
SpellChance = _random.Next(100);
if (SpellChance > NecessaryChanceOfSuccess)
{
enemyFighter.TakeDamage(CastMagicSpell());
}
else
{
base.Attack(enemyFighter);
}
}
private int CastMagicSpell()
{
int manaCouast = 20;
int spellDamage = 18;
int damage;
if (ManaPoint >= manaCouast)
{
Console.Write("Использует Wind Strike");
damage = spellDamage + AttackPower;
Console.WriteLine($" и наносит противнику {damage} единиц урона!");
ManaPoint -= manaCouast;
return damage;
}
Console.WriteLine($" Не хватает маны! Наносит противнику {AttackPower} единиц урона!");
return AttackPower;
}
}
class OrkWarrior : Fighter
{
private Random _random = new Random();
public OrkWarrior() : base(133, 100, 4) { }
public override void Attack(Fighter enemyFighter)
{
int manaCouast = 20;
SpellChance = _random.Next(100);
if (SpellChance > NecessaryChanceOfSuccess && ManaPoint > manaCouast)
{
enemyFighter.TakeDamage(CastMortalBlow(enemyFighter));
}
else
{
base.Attack(enemyFighter);
}
}
private int CastMortalBlow(Fighter fighter)
{
int spellDamage = 8;
int damage;
int killerChanse = _random.Next(10);
int necessaryKillerChanse = 1;
Console.Write("Использует Mortal Blow");
if (killerChanse == necessaryKillerChanse)
{
damage = fighter.HealthPoint - 1;
Console.WriteLine($" и наносит противнику {damage} единиц урона!!!!");
return damage;
}
damage = spellDamage + AttackPower;
Console.WriteLine($" и наносит противнику {damage} единиц урона!");
return damage;
}
}
class OrkMage : Fighter
{
private Random _random = new Random();
public OrkMage() : base(105, 100, 4) { }
public override void Attack(Fighter enemyFighter)
{
SpellChance = _random.Next(100);
if (SpellChance > NecessaryChanceOfSuccess)
{
enemyFighter.TakeDamage(CastHeal());
}
else
{
base.Attack(enemyFighter);
}
}
private int CastHeal()
{
int manaCoast = 40;
int minHealPoint = 10;
int maxHealPoint = 25;
int lowHP = 40;
if (ManaPoint >= manaCoast && HealthPoint < lowHP)
{
int heal = _random.Next(minHealPoint, maxHealPoint);
int damage;
Console.Write("Использует Heal| ");
damage = AttackPower;
HealthPoint += heal;
ManaPoint -= manaCoast;
Console.WriteLine($" наносит противнику {damage} единиц урона! А также восстанавливает {heal} единиц здоровья");
return damage;
}
Console.WriteLine($" Не хватает маны! Наносит противнику {AttackPower} единиц урона!");
return AttackPower;
}
}
class ElfWarrior : Fighter
{
private Random _random = new Random();
private bool _isEwade;
public ElfWarrior() : base(133, 100, 4) { }
public override void Attack(Fighter enemyFighter)
{
SpellChance = _random.Next(100);
if (SpellChance > NecessaryChanceOfSuccess)
{
enemyFighter.TakeDamage(CastDodge());
}
else
{
base.Attack(enemyFighter);
}
}
public override void TakeDamage(int damage)
{
if (_isEwade == false)
{
HealthPoint -= damage;
}
else
{
Console.Write(" | Уворот!");
}
}
private int CastDodge()
{
int manaCoast = 10;
_isEwade = false;
if (ManaPoint >= manaCoast)
{
_isEwade = true;
int damage;
Console.Write("Использует Dodge| ");
damage = AttackPower;
ManaPoint -= manaCoast;
Console.WriteLine($" наносит противнику {damage} единиц урона! А также готовиться увернуться от следующего удара");
return damage;
}
Console.WriteLine($" Не хватает маны! Наносит противнику {AttackPower} единиц урона!");
return AttackPower;
}
}
class ElfMage : Fighter
{
private int _spellChanse;
private Random _random = new Random();
private bool _isEwade;
public ElfMage() : base(96, 100, 2) { }
public override void Attack(Fighter enemyFighter)
{
SpellChance = _random.Next(100);
if (SpellChance > NecessaryChanceOfSuccess)
{
enemyFighter.TakeDamage(CastDisembodied());
}
else
{
base.Attack(enemyFighter);
}
}
public override void TakeDamage(int damage)
{
if (_isEwade == false)
{
HealthPoint -= damage;
}
else
{
Console.WriteLine(" | Удар прошел насквозь!");
}
}
private int CastDisembodied()
{
int manaCoast = 20;
_isEwade = false;
if (ManaPoint >= manaCoast)
{
int damage;
_isEwade = true;
Console.Write("Использует Disembodied| ");
damage = AttackPower + manaCoast;
ManaPoint -= manaCoast;
Console.WriteLine($" наносит противнику {damage} единиц урона! А также его тело стало прозрачным");
return damage;
}
Console.WriteLine($" Не хватает маны! Наносит противнику {AttackPower} единиц урона!");
return AttackPower;
}
}
class Arena
{
private Fighter[] _allFighters;
private Fighter _fighterLeft;
private Fighter _fighterRight;
private string _nameLeftFighter = "Боец 1: ";
private string _nameRightFighter = "Боец 2: ";
public Arena()
{
ShowAllFighters(CreateFightersList());
_fighterLeft = CreateFighter(TakeIndexFighter());
CreateFightersList();
_fighterRight = CreateFighter(TakeIndexFighter());
Console.Clear();
Console.WriteLine("Вы выбрали:");
ShowFighterInfo(_fighterLeft, _nameLeftFighter);
ShowFighterInfo(_fighterRight, _nameRightFighter);
Console.ReadKey();
}
public void Fight()
{
while (_fighterLeft.HealthPoint > 0 && _fighterRight.HealthPoint > 0)
{
Console.Clear();
ShowFighterInfo(_fighterLeft, _nameLeftFighter);
_fighterLeft.Attack(_fighterRight);
ShowFighterInfo(_fighterRight, _nameRightFighter);
_fighterRight.Attack(_fighterLeft);
Console.ReadKey();
}
if (_fighterLeft.HealthPoint < 0 && _fighterRight.HealthPoint < 0)
{
Console.WriteLine("Ого! Оба бойца отдали концы %)");
}
else if (_fighterLeft.HealthPoint < 0)
{
Console.WriteLine("Боец 2 Победил!");
}
else if (_fighterRight.HealthPoint < 0)
{
Console.WriteLine("Боец 1 Победил!");
}
Console.ReadKey();
}
private void ShowFighterInfo(Fighter fighter, string nameFighter)
{
Console.WriteLine($"{nameFighter} HP - {fighter.HealthPoint} | MP {fighter.ManaPoint} | Phys Attack {fighter.AttackPower}");
}
private void ShowAllFighters(Fighter[] fighters)
{
int numberFighter = 1;
foreach (var fighter in fighters)
{
Console.WriteLine($"{numberFighter})HP - {fighter.HealthPoint} | MP {fighter.ManaPoint} | Phys Attack {fighter.AttackPower}");
numberFighter++;
}
}
private int TakeIndexFighter()
{
string userInputString;
int userInputInt;
do
{
Console.WriteLine("Выбери бойца. Вам необходимо ввести число из списка: ");
userInputString = Console.ReadLine();
} while (int.TryParse(userInputString, out userInputInt) == false || userInputInt <= 0 || userInputInt > _allFighters.Length);
return userInputInt;
}
private Fighter CreateFighter(int fighter)
{
switch (fighter)
{
case 1:
return _allFighters[fighter];
case 2:
return _allFighters[fighter];
case 3:
return _allFighters[fighter];
case 4:
return _allFighters[fighter];
case 5:
return _allFighters[fighter];
case 6:
return _allFighters[fighter];
}
return null;
}
private Fighter[] CreateFightersList()
{
_allFighters = new Fighter[6];
_allFighters[0] = new HumanWarrior();
_allFighters[1] = new HumanMage();
_allFighters[2] = new OrkWarrior();
_allFighters[3] = new OrkMage();
_allFighters[4] = new ElfWarrior();
_allFighters[5] = new ElfMage();
return _allFighters;
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment