Created
May 14, 2025 16:57
-
-
Save IovFrey/25650a884ff5c1091e60655e5cc909f8 to your computer and use it in GitHub Desktop.
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
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