diff --git a/CourseApp/Archer.cs b/CourseApp/Archer.cs new file mode 100644 index 0000000..05e1a82 --- /dev/null +++ b/CourseApp/Archer.cs @@ -0,0 +1,25 @@ +using System; + +namespace CourseApp +{ + public class Archer : Player + { + public Archer() + { + Class = "Archer"; + AbilityName = "Fire arrows"; + } + + public override int Ability(Player player, Player enemy) + { + AbilityDamage = 2; + Logger.LogText($"({Class}) {Name} использовал способность {AbilityName}"); + return Strength + AbilityDamage; + } + + public override string ToString() + { + return $"Class: {Class}. Name: {Name}. Strength: {Strength}. Health: {Hp}."; + } + } +} \ No newline at end of file diff --git a/CourseApp/Battle.cs b/CourseApp/Battle.cs new file mode 100644 index 0000000..0117df6 --- /dev/null +++ b/CourseApp/Battle.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; + +namespace CourseApp +{ + public class Battle + { + private static List players = new List(); + private static List winners = new List(); + + public static void Tournament(int playersInGame) + { + Random rnd = new Random(); + while (players.Count < playersInGame) + { + switch (rnd.Next(0, 3)) + { + case 0: + players.Add(new Archer()); + break; + case 1: + players.Add(new Knight()); + break; + case 2: + players.Add(new Wizard()); + break; + } + } + + Logger.LogText("Давайте взглянем на наших героев!"); + foreach (Player o in players) + { + Console.WriteLine(o); + } + + int tern = 1; + Logger.LogText("\n"); + Logger.LogText("---------------------------Начинаем турнир-----------------------"); + Logger.LogText($" Кон {tern++}-й"); + while (players.Count + winners.Count > 1) + { + if (players.Count >= 2) + { + int rndPlayer1 = rnd.Next(0, players.Count); + int rndPlayer2 = rnd.Next(0, players.Count); + while (rndPlayer1 == rndPlayer2) + { + rndPlayer2 = rnd.Next(0, players.Count); + } + + Player fighter = players[rndPlayer1]; + Player fighterEnemy = players[rndPlayer2]; + Logger.LogText($" ({fighter.Class}) {fighter.Name} VS ({fighterEnemy.Class}) {fighterEnemy.Name}"); + Fight.TFights(fighter, fighterEnemy); + if (fighterEnemy.Hp < 0) + { + Logger.LogText($"({fighterEnemy.Class}) {fighterEnemy.Name} погиб(ла). \n"); + fighter.Hp = rnd.Next(70, 300); + players.Remove(fighter); + players.Remove(fighterEnemy); + winners.Add(fighter); + } + else + { + Logger.LogText($"({fighter.Class}) {fighter.Name} погиб(ла). \n"); + fighterEnemy.Hp = rnd.Next(70, 300); + players.Remove(fighterEnemy); + players.Remove(fighter); + winners.Add(fighterEnemy); + } + } + + if ((winners.Count >= 2) && (players.Count == 0)) + { + int rndPlayer1 = rnd.Next(0, players.Count); + int rndPlayer2 = rnd.Next(0, winners.Count); + while (rndPlayer1 == rndPlayer2) + { + rndPlayer2 = rnd.Next(0, winners.Count); + } + + Player fighter = winners[rndPlayer1]; + Player fighterEnemy = winners[rndPlayer2]; + if (winners.Count % 2 == 0) + { + Logger.LogText($" Кон {tern++}-й"); + } + + Logger.LogText($" ({fighter.Class}) {fighter.Name} VS ({fighterEnemy.Class}) {fighterEnemy.Name}"); + Fight.TFights(fighter, fighterEnemy); + if (fighterEnemy.Hp < 0) + { + Logger.LogText($"({fighterEnemy.Class}) {fighterEnemy.Name} погиб(ла). \n"); + fighter.Hp = rnd.Next(70, 300); + winners.Remove(fighterEnemy); + } + else + { + Logger.LogText($"({fighter.Class}) {fighter.Name} погиб(ла). \n"); + fighterEnemy.Hp = rnd.Next(70, 300); + winners.Remove(fighter); + } + } + } + + Logger.LogText($"Победитель турнира: ({winners[0].Class}) {winners[0].Name}"); + Logger.LogText("---------------------------Конец турнира-------------------------"); + } + } +} \ No newline at end of file diff --git a/CourseApp/Fight.cs b/CourseApp/Fight.cs new file mode 100644 index 0000000..44e90fc --- /dev/null +++ b/CourseApp/Fight.cs @@ -0,0 +1,47 @@ +using System; + +namespace CourseApp +{ + public class Fight + { + public static Tuple TFights(Player fighter, Player fighterEnemy) + { + Random rnd = new Random(); + while ((fighter.Hp > 0) && (fighterEnemy.Hp > 0)) + { + if (rnd.Next(1, 6) == 1) + { + fighter.Effects = true; + } + else if (rnd.Next(1, 6) == 3) + { + fighterEnemy.Effects = true; + } + + if ((fighter.StandTime > 0) && (fighter.Hp > 0)) + { + Logger.LogText($"({fighter.Class}) {fighter.Name} пропускает ход"); + fighter.StandTime--; + } + else if (fighter.Hp > 0) + { + fighterEnemy.GetDamage(fighter.Attack(fighter, fighterEnemy)); + Logger.LogText($"({fighter.Class}) {fighter.Name} наносит {fighter.DamageInfo} едениц урона ({fighterEnemy.Class}) {fighterEnemy.Name}"); + } + + if ((fighterEnemy.StandTime > 0) && (fighterEnemy.Hp > 0)) + { + Logger.LogText($"({fighterEnemy.Class}) {fighterEnemy.Name} пропускает ход"); + fighterEnemy.StandTime--; + } + else if (fighterEnemy.Hp > 0) + { + fighter.GetDamage(fighterEnemy.Attack(fighter, fighterEnemy)); + Logger.LogText($"({fighterEnemy.Class}) {fighterEnemy.Name} наносит {fighterEnemy.DamageInfo} едениц урона ({fighter.Class}) {fighter.Name}"); + } + } + + return new Tuple(fighter, fighterEnemy); + } + } +} \ No newline at end of file diff --git a/CourseApp/Game.cs b/CourseApp/Game.cs new file mode 100644 index 0000000..fc5fae8 --- /dev/null +++ b/CourseApp/Game.cs @@ -0,0 +1,22 @@ +using System; +using System.Collections.Generic; +using System.Collections; + +namespace CourseApp +{ + public class Game + { + public static int StartGame(int playersInGame) + { + Logger.LogText("Введите количество игроков: "); + playersInGame = Convert.ToInt32(Console.ReadLine()); + while ((playersInGame % 2 != 0) || (playersInGame < 1)) + { + Logger.LogText("Введите количество игроков: "); + playersInGame = Convert.ToInt32(Console.ReadLine()); + } + + return playersInGame; + } + } +} diff --git a/CourseApp/Knight.cs b/CourseApp/Knight.cs new file mode 100644 index 0000000..4fa5e2b --- /dev/null +++ b/CourseApp/Knight.cs @@ -0,0 +1,25 @@ +using System; + +namespace CourseApp +{ + public class Knight : Player + { + public Knight() + { + Class = "Knight"; + AbilityName = "Retaliation strike"; + } + + public override int Ability(Player player, Player enemy) + { + Logger.LogText($"({Class}) {Name} использовал способность {AbilityName}"); + AbilityDamage = (int)(Strength * 1.3); + return AbilityDamage; + } + + public override string ToString() + { + return $"Class: {Class}. Name: {Name}. Strength: {Strength}. Health: {Hp}."; + } + } +} \ No newline at end of file diff --git a/CourseApp/Logger.cs b/CourseApp/Logger.cs new file mode 100644 index 0000000..f4b5a9b --- /dev/null +++ b/CourseApp/Logger.cs @@ -0,0 +1,12 @@ +using System; + +namespace CourseApp +{ + public static class Logger + { + public static void LogText(string message) + { + Console.WriteLine(message); + } + } +} \ No newline at end of file diff --git a/CourseApp/Player.cs b/CourseApp/Player.cs new file mode 100644 index 0000000..e8ee885 --- /dev/null +++ b/CourseApp/Player.cs @@ -0,0 +1,110 @@ +using System; +using System.Collections.Generic; + +namespace CourseApp +{ + public abstract class Player + { + private static readonly Random Rnd = new Random(); + private static string[] names = new string[40] + { + "Артур", + "Робин", + "Мэрлин", + "Гвин Гвинский", + "Кэт де Джем", + "Эдвурд Бакмэн", + "Бадрик", + "Грегори Хаус", + "Барон", + "Раz Dва", + "Элиот", + "Этелька", + "Доктор", + "Дэрил", + "Сильвия", + "Геральт", + "Джоэл", + "Амата", + "Крэш", + "Мистик", + "Хесус", + "Рыбожер", + "Дартаньян", + "Леонардо", + "Цирилла", + "Пьер", + "Ломака", + "Эксидае", + "Мэри", + "Антика", + "Эдуард", + "Максимильян", + "Аннэт", + "Дина", + "Братишник", + "Вебчик Великолепный", + "Юлия", + "Гаечка", + "Силажик", + "Снюсик", + }; + + public Player() + { + Name = names[Rnd.Next(0, 30)]; + Hp = Rnd.Next(50, 300); + Strength = Rnd.Next(25, 150); + Effects = false; + StandTime = 0; + } + + public string Class { get; protected set; } + + public string Name { get; set; } + + public double Hp { get; set; } + + public int Strength { get; set; } + + public bool Effects { get; set; } + + public int StandTime { get; set; } + + public string AbilityName { get; set; } + + public int AbilityDamage { get; set; } + + public int DamageInfo { get; set; } + + public virtual int Ability(Player player, Player enemy) + { + return 0; + } + + public int Attack(Player fighter, Player fighterEnemy) + { + if (fighter.Effects == true) + { + fighter.Effects = false; + DamageInfo = fighter.Ability(fighter, fighterEnemy); + return DamageInfo; + } + else + { + DamageInfo = Strength; + return Strength; + } + } + + public void GetDamage(int damage) + { + Hp -= damage; + } + + public override string ToString() + { + return $"Name: {Name}. Strength: {Strength}. Health: {Hp}."; + } + } +} \ No newline at end of file diff --git a/CourseApp/Program.cs b/CourseApp/Program.cs index 1e98f51..f1838de 100644 --- a/CourseApp/Program.cs +++ b/CourseApp/Program.cs @@ -113,6 +113,11 @@ public static void Main(string[] args) Console.WriteLine(person.GoingSomewhere()); } + Console.WriteLine("------- RPS SAGA -------"); + int playersInGame = 0; + playersInGame = Game.StartGame(playersInGame); + Battle.Tournament(playersInGame); + Console.ReadLine(); } } diff --git a/CourseApp/Wizard.cs b/CourseApp/Wizard.cs new file mode 100644 index 0000000..4982471 --- /dev/null +++ b/CourseApp/Wizard.cs @@ -0,0 +1,26 @@ +using System; + +namespace CourseApp +{ + public class Wizard : Player + { + public Wizard() + { + Class = "Wizard"; + AbilityName = "Fascination"; + } + + public override int Ability(Player player, Player enemy) + { + player.StandTime = 2; + enemy.StandTime = 2; + Logger.LogText($"({Class}) {Name} использовал способность {AbilityName}"); + return 0; + } + + public override string ToString() + { + return $"Class: {Class}. Name: {Name}. Strength: {Strength}. Health: {Hp}."; + } + } +} \ No newline at end of file