Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save IovFrey/25650a884ff5c1091e60655e5cc909f8 to your computer and use it in GitHub Desktop.
Save IovFrey/25650a884ff5c1091e60655e5cc909f8 to your computer and use it in GitHub Desktop.
using System;
public class Program
{
static void Main(string[] args)
{
Game game = new Game();
game.Run();
}
}
interface IDamageable
{
void Attack();
}
abstract class Person
{
public bool IsAlive => Health > 0;
public Person(string name, int health, int impactForce)
{
Name = name;
Health = health;
ImpactForce = impactForce;
}
public string Name { get; protected set; }
public int Health { get; protected set; }
public int ImpactForce { get; protected set; }
public virtual void TakeDamage(int impactForce)
{
Health -= impactForce;
if (Health > 0)
{
Console.WriteLine($"{Name} получил урон {impactForce}, осталось здоровья {Health}.");
}
else if (Health <= 0)
{
Health = 0;
Console.WriteLine($"{Name} получил урон {impactForce}, осталось здоровья {Health}.");
Console.WriteLine($"Боец под именем {Name} пал в бою.");
}
}
public abstract void Attack(Person person);
public abstract Person Copy();
}
class DoubleStrikeFighter : Person
{
private int _minRandomNumber = 1;
private int _maxRandomNumber = 3;
public DoubleStrikeFighter(string name, int health, int impactForce) : base(name, health, impactForce) { }
public override void Attack(Person person)
{
int realDamage = person.ImpactForce * UserUtils.GenerateRandomNumber(_minRandomNumber, _maxRandomNumber);
Console.WriteLine($"Боец {Name} атакует с уроном {realDamage}.");
person.TakeDamage(realDamage);
}
public override Person Copy()
{
return new DoubleStrikeFighter(Name, Health, ImpactForce);
}
}
class AccidentalBlowFighter : Person
{
private int _impactCounter = 0;
public AccidentalBlowFighter(string name, int health, int impactForce) : base(name, health, impactForce) { }
public override void Attack(Person person)
{
int maxImpactCount = 3;
int repeatedBlow = 2;
int realDamage;
_impactCounter++;
if (_impactCounter < maxImpactCount)
{
realDamage = person.ImpactForce;
}
else
{
realDamage = person.ImpactForce * repeatedBlow;
_impactCounter = 0;
}
Console.WriteLine($"Боец {Name} атакует с уроном {realDamage}.");
person.TakeDamage(realDamage);
}
public override Person Copy()
{
return new AccidentalBlowFighter(Name, Health, ImpactForce);
}
}
class FierceTreatmentFighter : Person
{
private int _minRandomRampage = 10;
private int _maxRandomRampage = 50;
private int _randomRampage;
private int _maxRampage = 100;
public FierceTreatmentFighter(string name, int health, int impactForce, int rampage) : base(name, health, impactForce)
{
Rampage = rampage;
}
public int Rampage { get; private set; }
public override void Attack(Person person)
{
_randomRampage = UserUtils.GenerateRandomNumber(_minRandomRampage, _maxRandomRampage);
Rampage += _randomRampage;
if (Rampage >= _maxRampage)
{
Health += _randomRampage;
Console.WriteLine($"Боец {Name} разьярен и получает прибавку к здоровью - {_randomRampage}.");
Rampage = 0;
}
Console.WriteLine($"Боец {Name} атакует с уроном {ImpactForce}.");
person.TakeDamage(ImpactForce);
}
public override Person Copy()
{
return new FierceTreatmentFighter(Name, Health, ImpactForce, Rampage);
}
}
class MagicalFighter : Person
{
private int _minRandomMana = 50;
private int _maxRandomMana = 100;
private int _fireBollImpact = 20;
public MagicalFighter(string name, int health, int impactForce, int mana) : base(name, health, impactForce)
{
Mana = UserUtils.GenerateRandomNumber(_minRandomMana, _maxRandomMana);
}
public int Mana { get; private set; }
public override void Attack(Person person)
{
int realDamage;
if (Mana > 0)
{
realDamage = _fireBollImpact;
Mana -= _fireBollImpact;
Console.WriteLine($"Боец {Name} атакует заклинанием Огненный шар с уроном {realDamage}.");
}
else
{
realDamage = ImpactForce;
Console.WriteLine($"Боец {Name} атакует с уроном {realDamage}.");
}
person.TakeDamage(realDamage);
}
public override Person Copy()
{
return new MagicalFighter(Name, Health, ImpactForce, Mana);
}
}
class EvasiveFighter : Person
{
public EvasiveFighter(string name, int health, int impactForce) : base(name, health, impactForce) { }
public override void Attack(Person person)
{
Console.WriteLine($"Боец {Name} атакует с уроном {ImpactForce}.");
this.TakeDamage(ImpactForce);
}
public void TakeDamage(int impactForse)
{
if (UserUtils.GenerateRandomBool() == true)
{
Console.WriteLine($"Боец {Name} уклонился от удара.");
}
else
{
base.TakeDamage(ImpactForce);
}
}
public override Person Copy()
{
return new EvasiveFighter(Name, Health, ImpactForce);
}
}
class Game
{
private List<Person> _fighters = new List<Person>();
public void Run()
{
_fighters = CreateFighters();
ShowMenu();
}
private void PerformShow()
{
Console.WriteLine($"Для начала боя сделайте выбор войнов.");
ShowAllFighters();
Console.Write("\nВыберите первого бойца - ");
Person fighter1 = ChoiseFighter(_fighters);
Console.Write("\nВыберите второго бойца - ");
Person fighter2 = ChoiseFighter(_fighters);
Console.WriteLine($"\nВы выбрали первого бойца - {fighter1.Name}");
Console.WriteLine($"\nВы выбрали второго бойца - {fighter2.Name}");
Arena arena = new Arena(fighter1, fighter2);
arena.GoIntoBattle();
}
private void ShowMenu()
{
const string CommandShowWelcomeMessage = "1";
const string ComanndShowFight = "2";
const string CommandExit = "3";
string menu = ($"Добро пожаловать в меню выбора." +
$"\n{CommandShowWelcomeMessage} - Для просмотра приветственного сообщения." +
$"\n{ComanndShowFight} - Для просмотра боя." +
$"\n{CommandExit} - Для выхода из программы.");
bool isWork = true;
while (isWork)
{
Console.WriteLine(menu);
string selectAction = Console.ReadLine();
Console.Clear();
switch (selectAction)
{
case CommandShowWelcomeMessage:
ShowWelcomeMessage();
break;
case ComanndShowFight:
PerformShow();
break;
case CommandExit:
isWork = false;
break;
default:
Console.WriteLine("Такого пункта меню нет, попробуйте ещё раз.");
break;
}
}
}
private Person ChoiseFighter(List<Person> fighters)
{
int fighterNumber;
while (int.TryParse(Console.ReadLine(), out fighterNumber) == false || fighterNumber < 1 || fighterNumber > fighters.Count)
{
Console.Write("Бойца под таким номером нет. Введите правильный номер - ");
}
return fighters[fighterNumber - 1].Copy();
}
private List<Person> CreateFighters()
{
_fighters.Add(new DoubleStrikeFighter("Петя Двойной Удар", 100, 10));
_fighters.Add(new AccidentalBlowFighter("Саня Случайный", 110, 11));
_fighters.Add(new FierceTreatmentFighter("Васек Буйный", 120, 12, 0));
_fighters.Add(new MagicalFighter("Ваня Магический", 130, 13, 0));
_fighters.Add(new EvasiveFighter("Кеша Скользкий", 140, 14));
return _fighters;
}
private void ShowWelcomeMessage()
{
Console.WriteLine("Здарова, арена приветсвует тебя.\n");
}
private void ShowAllFighters()
{
for (int i = 0; i < _fighters.Count; i++)
{
Console.WriteLine($"{i + 1} - {_fighters[i].Name}, Здоровье - {_fighters[i].Health}, Сила удара - {_fighters[i].ImpactForce}.");
}
}
}
class Arena
{
private Person _person1;
private Person _person2;
public Arena(Person person1, Person person2)
{
_person1 = person1;
_person2 = person2;
}
public void GoIntoBattle()
{
Console.Clear();
Console.WriteLine($"В схватке сошлись {_person1.Name} и {_person2.Name}.\n");
while (_person1.IsAlive && _person2.IsAlive)
{
_person1.Attack(_person2);
if (_person2.IsAlive)
{
_person2.Attack(_person1);
}
Console.WriteLine();
}
DeclareWinner();
}
public void DeclareWinner()
{
if (_person1.IsAlive)
{
Console.WriteLine($"Бой выиграл {_person1.Name}.\n");
}
else if (_person2.IsAlive)
{
Console.WriteLine($"Бой выиграл {_person2.Name}.\n");
}
else
{
Console.WriteLine("Бой закончился ничьей.\n");
}
}
}
class UserUtils
{
static Random s_random = new Random();
public static int GenerateRandomNumber(int minRandomNumber, int maxRandomNumber)
{
int rundomNumber = s_random.Next(minRandomNumber, maxRandomNumber);
return rundomNumber;
}
public static bool GenerateRandomBool()
{
bool value = s_random.Next(100) < 50 ? true : false;
return value;
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment