From 7d24737e09c8f0bae6e7f660760b4d04bb5809c2 Mon Sep 17 00:00:00 2001 From: Eugeny Konstantinov Date: Sat, 3 Sep 2022 12:32:52 +0300 Subject: [PATCH 1/3] 1 classes sample --- CourseApp/Phone.cs | 38 ++++++++++++++++++++++++++++++++++++++ CourseApp/Program.cs | 14 ++++++++++++++ 2 files changed, 52 insertions(+) create mode 100644 CourseApp/Phone.cs diff --git a/CourseApp/Phone.cs b/CourseApp/Phone.cs new file mode 100644 index 0000000..1c8e407 --- /dev/null +++ b/CourseApp/Phone.cs @@ -0,0 +1,38 @@ +namespace CourseApp +{ + using System; + + public class Phone + { + private float diaonal; + + public Phone(string name, float diagonal) + { + Name = name; + Diagonal = diagonal; + } + + public string Name { get; set; } + + public float Diagonal + { + get + { + return diaonal; + } + + set + { + if (value > 0 && value < 20) + { + this.diaonal = value; + } + } + } + + public void Show() + { + Console.WriteLine($"{Name} with diagonal {diaonal}"); + } + } +} \ No newline at end of file diff --git a/CourseApp/Program.cs b/CourseApp/Program.cs index d6d2c87..030f047 100644 --- a/CourseApp/Program.cs +++ b/CourseApp/Program.cs @@ -6,6 +6,20 @@ public class Program { public static void Main(string[] args) { + Phone phone1 = new Phone("iPhone", -7); + phone1.Show(); + phone1.Diagonal = 7; + phone1.Show(); + phone1.Diagonal = -16; + phone1.Show(); + + Phone tablet = new Phone("Android", 6); + tablet.Diagonal = 6; + tablet.Show(); + tablet.Diagonal = -10; + tablet.Show(); + tablet.Diagonal = 8; + tablet.Show(); Console.WriteLine("Hello World"); } } From 33042b354643fa42b70f49d017c311766b334559 Mon Sep 17 00:00:00 2001 From: castaval Date: Sat, 10 Dec 2022 16:30:38 +0300 Subject: [PATCH 2/3] feat: add rpg-saga --- CourseApp.Tests/CourseApp.Tests.csproj | 2 +- CourseApp.Tests/DemoTest.cs | 13 -- CourseApp.Tests/FightTest.cs | 118 ++++++++++++++ CourseApp.Tests/GameTest.cs | 84 ++++++++++ CourseApp.Tests/PlayersGeneratorTest.cs | 52 ++++++ CourseApp.Tests/SelectorTest.cs | 77 +++++++++ CourseApp/CourseApp.csproj | 2 +- CourseApp/Entities/Abilities/FireArrows.cs | 30 ++++ CourseApp/Entities/Abilities/Fireball.cs | 35 ++++ CourseApp/Entities/Abilities/Freeze.cs | 23 +++ CourseApp/Entities/Abilities/IAbility.cs | 16 ++ CourseApp/Entities/Abilities/IceArrows.cs | 31 ++++ CourseApp/Entities/Abilities/StunStrike.cs | 23 +++ .../Entities/Abilities/VengeanceStrike.cs | 29 ++++ CourseApp/Entities/Effects/Buff.cs | 40 +++++ CourseApp/Entities/Effects/IEffect.cs | 13 ++ CourseApp/Entities/Effects/LongDamage.cs | 40 +++++ CourseApp/Entities/Effects/Normal.cs | 42 +++++ CourseApp/Entities/Effects/Stun.cs | 37 +++++ CourseApp/Entities/Players/Archer.cs | 104 ++++++++++++ CourseApp/Entities/Players/IPlayer.cs | 29 ++++ CourseApp/Entities/Players/Knight.cs | 104 ++++++++++++ CourseApp/Entities/Players/Mage.cs | 104 ++++++++++++ CourseApp/Logger/GameLogger.cs | 151 ++++++++++++++++++ CourseApp/Logger/ILogger.cs | 24 +++ CourseApp/Main/Fight.cs | 124 ++++++++++++++ CourseApp/Main/Game.cs | 99 ++++++++++++ CourseApp/Main/Names.cs | 7 + CourseApp/Main/Names.json | 14 ++ CourseApp/Main/PlayersGenerator.cs | 91 +++++++++++ CourseApp/Main/Selector.cs | 104 ++++++++++++ CourseApp/Phone.cs | 38 ----- CourseApp/Program.cs | 29 ++-- courseworkspace.code-workspace | 10 +- 34 files changed, 1662 insertions(+), 77 deletions(-) delete mode 100644 CourseApp.Tests/DemoTest.cs create mode 100644 CourseApp.Tests/FightTest.cs create mode 100644 CourseApp.Tests/GameTest.cs create mode 100644 CourseApp.Tests/PlayersGeneratorTest.cs create mode 100644 CourseApp.Tests/SelectorTest.cs create mode 100644 CourseApp/Entities/Abilities/FireArrows.cs create mode 100644 CourseApp/Entities/Abilities/Fireball.cs create mode 100644 CourseApp/Entities/Abilities/Freeze.cs create mode 100644 CourseApp/Entities/Abilities/IAbility.cs create mode 100644 CourseApp/Entities/Abilities/IceArrows.cs create mode 100644 CourseApp/Entities/Abilities/StunStrike.cs create mode 100644 CourseApp/Entities/Abilities/VengeanceStrike.cs create mode 100644 CourseApp/Entities/Effects/Buff.cs create mode 100644 CourseApp/Entities/Effects/IEffect.cs create mode 100644 CourseApp/Entities/Effects/LongDamage.cs create mode 100644 CourseApp/Entities/Effects/Normal.cs create mode 100644 CourseApp/Entities/Effects/Stun.cs create mode 100644 CourseApp/Entities/Players/Archer.cs create mode 100644 CourseApp/Entities/Players/IPlayer.cs create mode 100644 CourseApp/Entities/Players/Knight.cs create mode 100644 CourseApp/Entities/Players/Mage.cs create mode 100644 CourseApp/Logger/GameLogger.cs create mode 100644 CourseApp/Logger/ILogger.cs create mode 100644 CourseApp/Main/Fight.cs create mode 100644 CourseApp/Main/Game.cs create mode 100644 CourseApp/Main/Names.cs create mode 100644 CourseApp/Main/Names.json create mode 100644 CourseApp/Main/PlayersGenerator.cs create mode 100644 CourseApp/Main/Selector.cs delete mode 100644 CourseApp/Phone.cs diff --git a/CourseApp.Tests/CourseApp.Tests.csproj b/CourseApp.Tests/CourseApp.Tests.csproj index e43252f..bbf701d 100644 --- a/CourseApp.Tests/CourseApp.Tests.csproj +++ b/CourseApp.Tests/CourseApp.Tests.csproj @@ -2,7 +2,7 @@ net6.0 - True + False false diff --git a/CourseApp.Tests/DemoTest.cs b/CourseApp.Tests/DemoTest.cs deleted file mode 100644 index cf7cbb1..0000000 --- a/CourseApp.Tests/DemoTest.cs +++ /dev/null @@ -1,13 +0,0 @@ -namespace CourseApp.Tests -{ - using Xunit; - - public class DemoTest - { - [Fact] - public void Test1() - { - Assert.True(true); - } - } -} diff --git a/CourseApp.Tests/FightTest.cs b/CourseApp.Tests/FightTest.cs new file mode 100644 index 0000000..328db30 --- /dev/null +++ b/CourseApp.Tests/FightTest.cs @@ -0,0 +1,118 @@ +namespace CourseApp.Tests; + +using CourseApp.Effects; +using CourseApp.Players; +using Xunit; + +[Collection("Sequential")] +public class FightTest +{ + [Theory] + [InlineData(30, 40)] + [InlineData(20, 50)] + [InlineData(10, 5)] + public void AttackTest(int strength, int health) + { + // Arrange + IPlayer firstPlayer = new Archer("Мax", strength, 40, "Лучник"); + IPlayer secondPlayer = new Mage("Nikita", 20, health, "Маг"); + var healthUnderAttack = secondPlayer.Health; + var result = false; + + // Act + firstPlayer.AttackEnemy(secondPlayer); + + if (secondPlayer.Health < healthUnderAttack) + { + result = true; + } + + // Assert + Assert.True(result); + } + + [Fact] + public void UltimateTest() + { + // Arrange + IPlayer firstPlayer = new Archer("Мax", 30, 40, "Лучник"); + IPlayer secondPlayer = new Mage("Nikita", 20, 40, "Маг"); + IPlayer thirdPlayer = new Knight("Kevin", 20, 40, "Рыцарь"); + + // Act + firstPlayer.Ultimate(firstPlayer, secondPlayer, 1); + secondPlayer.Ultimate(secondPlayer, firstPlayer, 1); + secondPlayer.Ultimate(secondPlayer, thirdPlayer, 1); + + // Assert + Assert.NotEmpty(firstPlayer.MyEffects); + Assert.NotEmpty(secondPlayer.MyEffects); + Assert.NotEmpty(thirdPlayer.MyEffects); + } + + [Fact] + public void StunTest() + { + // Arrange + IPlayer firstPlayer = new Archer("Мax", 30, 40, "Лучник"); + IPlayer secondPlayer = new Mage("Nikita", 20, 40, "Маг"); + var result = false; + + // Act + secondPlayer.Ultimate(secondPlayer, firstPlayer, 1); + if (firstPlayer.MyEffects[0] is Stun) + { + result = true; + } + + // Assert + Assert.True(result); + } + + [Fact] + public void EffectTest() + { + // Arrange + IPlayer firstPlayer = new Archer("Мax", 30, 40, "Лучник"); + IPlayer secondPlayer = new Mage("Nikita", 20, 40, "Маг"); + IPlayer thirdPlayer = new Knight("Kevin", 20, 40, "Рыцарь"); + + int[] firstPlayerUnderUltimate = {firstPlayer.Health, firstPlayer.Strength}; + int[] secondPlayerUnderUltimate = {secondPlayer.Health, secondPlayer.Strength}; + int[] thirdPlayerUnderUltimate = {thirdPlayer.Health, thirdPlayer.Strength}; + + firstPlayer.Ultimate(firstPlayer, secondPlayer, 1); + secondPlayer.Ultimate(secondPlayer, thirdPlayer, 1); + thirdPlayer.Ultimate(thirdPlayer, firstPlayer, 1); + + var firstResult = false; + var secondResult = false; + var thirdResult = false; + + // Act + firstPlayer.Effect(firstPlayer); + secondPlayer.Effect(secondPlayer); + thirdPlayer.Effect(thirdPlayer); + + if (firstPlayer.Strength < firstPlayerUnderUltimate[0] || firstPlayer.Health > firstPlayerUnderUltimate[1]) + { + firstResult = true; + } + + if (secondPlayer.Strength < secondPlayerUnderUltimate[0] || secondPlayer.Health > secondPlayerUnderUltimate[1]) + { + secondResult = true; + } + + if (thirdPlayer.Strength < thirdPlayerUnderUltimate[0] || thirdPlayer.Health > thirdPlayerUnderUltimate[1]) + { + thirdResult = true; + } + + // Assert + Assert.True(firstResult); + Assert.True(secondResult); + Assert.True(thirdResult); + } + +} \ No newline at end of file diff --git a/CourseApp.Tests/GameTest.cs b/CourseApp.Tests/GameTest.cs new file mode 100644 index 0000000..3557377 --- /dev/null +++ b/CourseApp.Tests/GameTest.cs @@ -0,0 +1,84 @@ +namespace CourseApp.Tests; + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.Json; +using CourseApp.Base; +using CourseApp.GeneratePlayers; +using CourseApp.Logger; +using CourseApp.Players; +using CourseApp.SelectorGame; +using PlayerNames; +using Xunit; + +[Collection("Sequential")] +public class GameTest +{ + [Fact] + public void DraftTest() + { + // Arrange + var stringBuilder = new StringBuilder(); + stringBuilder.AppendLine("1"); + stringBuilder.AppendLine("Да"); + stringBuilder.AppendLine("Да"); + stringBuilder.AppendLine("10"); + var stringReader = new StringReader(stringBuilder.ToString()); + Console.SetIn(stringReader); + + + Game game = new Game(new GameLogger()); + Selector selector = new Selector(new GameLogger()); + List newClasses = selector.SelectCustomClass(); + int playerNumbers = selector.SelectNumbPlayers(); + + const string filepath = @"/home/kiosk/Develop/Tprogramming_2022/CourseApp/Main/Names.json"; + var json = File.ReadAllText(filepath); + var playerNames = JsonSerializer.Deserialize>(json); + + PlayersGenerator playersGenerator = new PlayersGenerator(playerNumbers, playerNames, newClasses); + + List players = new List(playersGenerator.GeneratePlayersArray()); + + // Act + var playersCopy = new List(players); + game.Draft(players); + + // Assert + Assert.NotSame(players, playersCopy); + } + + [Fact] + public void TourTest() + { + // Arrange + Game game = new Game(new GameLogger()); + List players= new List(); + players.Add(new Archer("Max", 10, 30, "Рыцарь")); + players.Add(new Archer("Max", 10, 30, "Рыцарь")); + players.Add(new Archer("Max", 10, 30, "Рыцарь")); + + // Act + game.Tour(players); + + // Assert + Assert.NotEmpty(players); + } + + [Fact] + public void EndGameTest() + { + // Arrange + Game game = new Game(new GameLogger()); + List players= new List(); + players.Add(new Archer("Max", 40, 30, "Рыцарь")); + + // Act + var result = game.EndGame(players); + + // Assert + Assert.True(result); + } +} \ No newline at end of file diff --git a/CourseApp.Tests/PlayersGeneratorTest.cs b/CourseApp.Tests/PlayersGeneratorTest.cs new file mode 100644 index 0000000..caa4281 --- /dev/null +++ b/CourseApp.Tests/PlayersGeneratorTest.cs @@ -0,0 +1,52 @@ +namespace CourseApp.Tests; + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using System.Text.Json; +using CourseApp.GeneratePlayers; +using CourseApp.Logger; +using CourseApp.SelectorGame; +using PlayerNames; +using Xunit; + +[Collection("Sequential")] +public class PlayersGeneratorTest +{ + [Theory] + [InlineData("1", "Да", "Да", "10")] + [InlineData("2", "Да", "Да", "12")] + [InlineData("3", "Да", "Да", "14")] + public void GeneratePlayersArrayTest(string number, string isAdd, string startChoicePlayers, string numberPlayers) + { + // Arrange + var stringBuilder = new StringBuilder(); + stringBuilder.AppendLine(number); + stringBuilder.AppendLine(isAdd); + stringBuilder.AppendLine(startChoicePlayers); + stringBuilder.AppendLine(numberPlayers); + var stringReader = new StringReader(stringBuilder.ToString()); + Console.SetIn(stringReader); + + + Selector selector = new Selector(new GameLogger()); + List newClasses = selector.SelectCustomClass(); + + const string filepath = @"/home/kiosk/Develop/Tprogramming_2022/CourseApp/Main/Names.json"; + var json = File.ReadAllText(filepath); + var playerNames = JsonSerializer.Deserialize>(json); + + int playerNumbers = selector.SelectNumbPlayers(); + + var playersGenerator = new PlayersGenerator(playerNumbers, playerNames, newClasses); + + + // Act + var players = playersGenerator.GeneratePlayersArray(); + + + // Assert + Assert.NotEmpty(players); + } +} \ No newline at end of file diff --git a/CourseApp.Tests/SelectorTest.cs b/CourseApp.Tests/SelectorTest.cs new file mode 100644 index 0000000..41292c0 --- /dev/null +++ b/CourseApp.Tests/SelectorTest.cs @@ -0,0 +1,77 @@ +namespace CourseApp.Tests; + +using System; +using System.Collections.Generic; +using System.IO; +using System.Text; +using CourseApp.Logger; +using CourseApp.SelectorGame; +using Xunit; + +[Collection("Sequential")] +public class SelectorTest +{ + [Theory] + [InlineData("1", "Да", "Да")] + [InlineData("2", "Да", "Да")] + [InlineData("3", "Да", "Да")] + public void SelectCustomClassTest(string number, string isAdd, string startChoicePlayers) + { + // Arrange + var selector = new Selector(new GameLogger()); + var stringBuilder = new StringBuilder(); + stringBuilder.AppendLine(number); + stringBuilder.AppendLine(isAdd); + stringBuilder.AppendLine(startChoicePlayers); + var stringReader = new StringReader(stringBuilder.ToString()); + Console.SetIn(stringReader); + + // Act + bool result = false; + List ListBool = selector.SelectCustomClass(); + + foreach (var element in ListBool) + { + result = element; + + if (result == true) + { + break; + } + } + + // Assert + Assert.True(result); + } + + [Theory] + [InlineData("10")] + [InlineData("11", "12")] + [InlineData("12")] + public void SelectNumbPlayersTest(string number, string secondNumber = "14") + { + // Arrange + var selector = new Selector(new GameLogger()); + var stringBuilder = new StringBuilder(); + stringBuilder.AppendLine(number); + + if (!(Int32.Parse(number) % 2 == 0)) + { + stringBuilder.AppendLine(secondNumber); + } + + var stringReader = new StringReader(stringBuilder.ToString()); + Console.SetIn(stringReader); + + // Act + var result = false; + var player = selector.SelectNumbPlayers(); + if (player % 2 == 0) + { + result = true; + } + + // Assert + Assert.True(result); + } +} \ No newline at end of file diff --git a/CourseApp/CourseApp.csproj b/CourseApp/CourseApp.csproj index eb22147..707f86e 100644 --- a/CourseApp/CourseApp.csproj +++ b/CourseApp/CourseApp.csproj @@ -3,7 +3,7 @@ Exe net6.0 - True + False diff --git a/CourseApp/Entities/Abilities/FireArrows.cs b/CourseApp/Entities/Abilities/FireArrows.cs new file mode 100644 index 0000000..5de896b --- /dev/null +++ b/CourseApp/Entities/Abilities/FireArrows.cs @@ -0,0 +1,30 @@ +namespace CourseApp +{ + namespace Abilities + { + using Players; + using Effects; + public class FireArrows : IAbility + { + public int NumberUses { get; set; } = 0; + private int MaxUses { get; set; } = 1; + public string AbilityName { get; set; } = "Огненные стрелы"; + public void Spell(IPlayer myself, IPlayer enemy, int round) + { + enemy.MyEffects.Add(new LongDamage(5, round)); + NumberUses++; + } + public bool CanSpell() + { + if (NumberUses < MaxUses) + { + return true; + } + else + { + return false; + } + } + } + } +} diff --git a/CourseApp/Entities/Abilities/Fireball.cs b/CourseApp/Entities/Abilities/Fireball.cs new file mode 100644 index 0000000..13b3ab4 --- /dev/null +++ b/CourseApp/Entities/Abilities/Fireball.cs @@ -0,0 +1,35 @@ +namespace CourseApp +{ + namespace Abilities + { + using Players; + using Effects; + public class Fireball : IAbility + { + public int NumberUses { get; set; } = 0; + private int MaxUses { get; set; } = 2; + public string AbilityName { get; set; } = "Фаерболл"; + public void Spell(IPlayer myself, IPlayer enemy, int round) + { + IEffect generateBuff = new Buff(2, round); + myself.MyEffects.Add(generateBuff); + int indexEffect = myself.MyEffects.IndexOf(generateBuff); + myself.MyEffects[indexEffect].State(myself); + enemy.Health -= myself.Strength; + NumberUses++; + } + + public bool CanSpell() + { + if (NumberUses < MaxUses) + { + return true; + } + else + { + return false; + } + } + } + } +} diff --git a/CourseApp/Entities/Abilities/Freeze.cs b/CourseApp/Entities/Abilities/Freeze.cs new file mode 100644 index 0000000..18ea132 --- /dev/null +++ b/CourseApp/Entities/Abilities/Freeze.cs @@ -0,0 +1,23 @@ +namespace CourseApp +{ + namespace Abilities + { + using Players; + using Effects; + public class Freeze : IAbility + { + public int NumberUses { get; set; } = 0; + public string AbilityName { get; set; } = "Заворожение"; + public void Spell(IPlayer myself, IPlayer enemy, int round) + { + enemy.MyEffects.Add(new Stun(round)); + NumberUses++; + } + + public bool CanSpell() + { + return true; + } + } + } +} diff --git a/CourseApp/Entities/Abilities/IAbility.cs b/CourseApp/Entities/Abilities/IAbility.cs new file mode 100644 index 0000000..4edb9a9 --- /dev/null +++ b/CourseApp/Entities/Abilities/IAbility.cs @@ -0,0 +1,16 @@ +namespace CourseApp +{ + namespace Abilities + { + using Players; + using Effects; + public interface IAbility + { + int NumberUses { get; set; } + string AbilityName { get; set; } + void Spell(IPlayer myself, IPlayer enemy, int round); + bool CanSpell(); + } + } +} + diff --git a/CourseApp/Entities/Abilities/IceArrows.cs b/CourseApp/Entities/Abilities/IceArrows.cs new file mode 100644 index 0000000..8941de5 --- /dev/null +++ b/CourseApp/Entities/Abilities/IceArrows.cs @@ -0,0 +1,31 @@ +namespace CourseApp +{ + namespace Abilities + { + using Players; + using Effects; + public class IceArrows : IAbility + { + public int NumberUses { get; set; } = 0; + private int MaxUses { get; set; } = 1; + public string AbilityName { get; set; } = "Ледяные стрелы"; + public void Spell(IPlayer myself, IPlayer enemy, int round) + { + enemy.MyEffects.Add(new LongDamage(10, round)); + NumberUses++; + } + + public bool CanSpell() + { + if (NumberUses < MaxUses) + { + return true; + } + else + { + return false; + } + } + } + } +} diff --git a/CourseApp/Entities/Abilities/StunStrike.cs b/CourseApp/Entities/Abilities/StunStrike.cs new file mode 100644 index 0000000..bb39df9 --- /dev/null +++ b/CourseApp/Entities/Abilities/StunStrike.cs @@ -0,0 +1,23 @@ +namespace CourseApp +{ + namespace Abilities + { + using Players; + using Effects; + public class StunStrike : IAbility + { + public int NumberUses { get; set; } = 0; + public string AbilityName { get; set; } = "Оглушающий удар"; + public void Spell(IPlayer myself, IPlayer enemy, int round) + { + enemy.MyEffects.Add(new Stun(round)); + NumberUses++; + } + + public bool CanSpell() + { + return true; + } + } + } +} diff --git a/CourseApp/Entities/Abilities/VengeanceStrike.cs b/CourseApp/Entities/Abilities/VengeanceStrike.cs new file mode 100644 index 0000000..5b0b40e --- /dev/null +++ b/CourseApp/Entities/Abilities/VengeanceStrike.cs @@ -0,0 +1,29 @@ +namespace CourseApp +{ + namespace Abilities + { + using Players; + using Effects; + public class VengeanceStrike : IAbility + { + public int NumberUses { get; set; } = 0; + + public string AbilityName { get; set; } = "Удар возмездия"; + public void Spell(IPlayer myself, IPlayer enemy, int round) + { + IEffect generateBuff = new Buff(1.3, round);; + myself.MyEffects.Add(generateBuff); + int indexEffect = myself.MyEffects.IndexOf(generateBuff); + myself.MyEffects[indexEffect].State(myself); + enemy.Health -= myself.Strength; + NumberUses++; + } + + public bool CanSpell() + { + return true; + } + } + } +} + diff --git a/CourseApp/Entities/Effects/Buff.cs b/CourseApp/Entities/Effects/Buff.cs new file mode 100644 index 0000000..6da0db4 --- /dev/null +++ b/CourseApp/Entities/Effects/Buff.cs @@ -0,0 +1,40 @@ +namespace CourseApp +{ + namespace Effects + { + using System.Linq; + using Players; + public class Buff : IEffect + { + public double Factor { get; set; } + + public int LastUsedRound { get; set; } + + public Buff(double factor, int round) + { + Factor = factor; + LastUsedRound = round; + } + + public void State(IPlayer Player) + { + Player.Strength = (int)((double)Player.Strength * Factor); + } + + public void DeleteState(IPlayer Player, int Round, int numberPlayer) + { + if (Round - LastUsedRound == 1) + { + if (Player.NormalState is Normal normal) normal.RestoreStrength(Player); + foreach (var effect in Player.MyEffects.ToList()) + { + if (effect is Buff buff) + { + Player.MyEffects.Remove(buff); + } + } + } + } + } + } +} diff --git a/CourseApp/Entities/Effects/IEffect.cs b/CourseApp/Entities/Effects/IEffect.cs new file mode 100644 index 0000000..9fc7a4b --- /dev/null +++ b/CourseApp/Entities/Effects/IEffect.cs @@ -0,0 +1,13 @@ +namespace CourseApp +{ + namespace Effects + { + using Players; + public interface IEffect + { + int LastUsedRound { get; set; } + void State(IPlayer Player); + void DeleteState(IPlayer Player, int round, int numberPlayer); + } + } +} diff --git a/CourseApp/Entities/Effects/LongDamage.cs b/CourseApp/Entities/Effects/LongDamage.cs new file mode 100644 index 0000000..af868f7 --- /dev/null +++ b/CourseApp/Entities/Effects/LongDamage.cs @@ -0,0 +1,40 @@ +namespace CourseApp +{ + namespace Effects + { + using System.Linq; + using Players; + public class LongDamage : IEffect + { + public int Factor { get; set; } + + public int LastUsedRound { get; set; } + + + public LongDamage(int factor, int round) + { + Factor = factor; + LastUsedRound = round; + } + + public void State(IPlayer enemy) + { + enemy.Health -= Factor; + } + + public void DeleteState(IPlayer Player, int Round, int numberPlayer) + { + if ((Round - LastUsedRound == 10 && numberPlayer == 2) || (Round - LastUsedRound == 11 && numberPlayer == 1)) + { + foreach (var effect in Player.MyEffects.ToList()) + { + if (effect is LongDamage longDamage) + { + Player.MyEffects.Remove(longDamage); + } + } + } + } + } + } +} diff --git a/CourseApp/Entities/Effects/Normal.cs b/CourseApp/Entities/Effects/Normal.cs new file mode 100644 index 0000000..3823860 --- /dev/null +++ b/CourseApp/Entities/Effects/Normal.cs @@ -0,0 +1,42 @@ +namespace CourseApp +{ + namespace Effects + { + using Players; + public class Normal : IEffect + { + public int Health { get; set; } + public int Strength { get; set; } + + public int LastUsedRound { get; set; } + + + public Normal(int strength, int health) + { + Health = health; + Strength = strength; + } + + public void State(IPlayer myself) + { + myself.Strength = Strength; + myself.Health = Health; + } + + public void RestoreStrength(IPlayer myself) + { + myself.Strength = Strength; + } + + public void RestoreHealth(IPlayer myself) + { + myself.Health = Health; + } + + public void DeleteState(IPlayer Player, int Round, int numberPlayer) + { + Player.MyEffects = null; + } + } + } +} diff --git a/CourseApp/Entities/Effects/Stun.cs b/CourseApp/Entities/Effects/Stun.cs new file mode 100644 index 0000000..30a1690 --- /dev/null +++ b/CourseApp/Entities/Effects/Stun.cs @@ -0,0 +1,37 @@ +namespace CourseApp +{ + namespace Effects + { + using System.Linq; + using Players; + public class Stun : IEffect + { + public int LastUsedRound { get; set; } + + public Stun(int round) + { + LastUsedRound = round; + } + + public void State(IPlayer Player) + { + Player.Strength = 0; + } + + public void DeleteState(IPlayer Player, int Round, int numberPlayer) + { + foreach (var effect in Player.MyEffects.ToList()) + { + if (effect is Stun stun) + { + if ((Round - effect.LastUsedRound == 1 && numberPlayer == 2) || (Round - effect.LastUsedRound == 2 && numberPlayer == 1)) + { + Player.MyEffects.Remove(stun); + if (Player.NormalState is Normal normal) normal.RestoreStrength(Player); + } + } + } + } + } + } +} diff --git a/CourseApp/Entities/Players/Archer.cs b/CourseApp/Entities/Players/Archer.cs new file mode 100644 index 0000000..3ad5f2e --- /dev/null +++ b/CourseApp/Entities/Players/Archer.cs @@ -0,0 +1,104 @@ +namespace CourseApp +{ + namespace Players + { + using System; + using System.Collections.Generic; + using System.Linq; + using Abilities; + using Effects; + public class Archer : IPlayer + { + public string Name { get; set; } + public int Strength { get; set; } + public int Health { get; set; } + public List Abilities { get; set; } = new List(); + public int CurrentAbility { get; set; } + public List MyEffects { get; set; } = new List(); + public IEffect NormalState { get; set; } + public string ClassName { get; set; } + + public Archer(string name, int strength, int health, string className) + { + Name = name; + Strength = strength; + Health = health; + + ClassName = className; + + Abilities.Add(new FireArrows()); + if (ClassName == "Стрелок") + { + Abilities.Add(new IceArrows()); + } + NormalState = new Normal(Strength, Health); + } + + public void TakingDamage(int damage) + { + Health -= damage; + } + + public void AttackEnemy(IPlayer enemy) + { + enemy.TakingDamage(Strength); + } + + public void EnterCurrentAbility() + { + Random random = new Random(); + CurrentAbility = random.Next(0, Abilities.Count); + } + + public bool CanUltimate() + { + return Abilities[CurrentAbility].CanSpell(); + } + + public int Ultimate(IPlayer myself, IPlayer enemy, int round) + { + Abilities[CurrentAbility].Spell(myself, enemy, round); + return CurrentAbility; + } + + public void Effect(IPlayer myself) + { + if (MyEffects.Count != 0) + { + foreach (var effect in MyEffects) + { + effect.State(myself); + } + } + } + + public void DeleteEffect(IPlayer myself, int round, int numberPlayer) + { + if (MyEffects.Count != 0) + { + foreach (var effect in MyEffects.ToList()) + { + effect.DeleteState(myself, round, numberPlayer); + } + } + } + + public void RestoreAfterBattle() + { + if (NormalState is Normal normal) + { + Health = normal.Health; + Strength = normal.Strength; + } + + foreach (var ability in Abilities) + { + ability.NumberUses = 0; + } + + MyEffects.Clear(); + } + } + } +} + diff --git a/CourseApp/Entities/Players/IPlayer.cs b/CourseApp/Entities/Players/IPlayer.cs new file mode 100644 index 0000000..71fe860 --- /dev/null +++ b/CourseApp/Entities/Players/IPlayer.cs @@ -0,0 +1,29 @@ +namespace CourseApp +{ + namespace Players + { + using System.Collections.Generic; + using CourseApp.Abilities; + using CourseApp.Effects; + public interface IPlayer + { + string Name { get; set; } + int Strength { get; set; } + int Health { get; set; } + List Abilities { get; set; } + int CurrentAbility { get; set; } + List MyEffects { get; set; } + IEffect NormalState { get; set; } + string ClassName { get; set; } + void TakingDamage(int damage); + void AttackEnemy(IPlayer enemy); + void EnterCurrentAbility(); + bool CanUltimate(); + int Ultimate(IPlayer myself, IPlayer enemy, int round); + void Effect(IPlayer myself); + void DeleteEffect(IPlayer myself, int round, int numberPlayer); + void RestoreAfterBattle(); + } + } +} + diff --git a/CourseApp/Entities/Players/Knight.cs b/CourseApp/Entities/Players/Knight.cs new file mode 100644 index 0000000..97738ea --- /dev/null +++ b/CourseApp/Entities/Players/Knight.cs @@ -0,0 +1,104 @@ +namespace CourseApp +{ + namespace Players + { + using System; + using System.Collections.Generic; + using System.Linq; + using Abilities; + using Effects; + public class Knight : IPlayer + { + public string Name { get; set; } + public int Strength { get; set; } + public int Health { get; set; } + public List Abilities { get; set; } = new List(); + public int CurrentAbility { get; set; } + public List MyEffects { get; set; } = new List(); + public IEffect NormalState { get; set; } + public string ClassName { get; set; } + + public Knight(string name, int strength, int health, string className) + { + Name = name; + Strength = strength; + Health = health; + + ClassName = className; + + Abilities.Add(new VengeanceStrike()); + if (ClassName == "Воин") + { + Abilities.Add(new StunStrike()); + } + NormalState = new Normal(Strength, Health); + } + + public void TakingDamage(int damage) + { + Health -= damage; + } + + public void AttackEnemy(IPlayer enemy) + { + enemy.TakingDamage(Strength); + } + + public void EnterCurrentAbility() + { + Random random = new Random(); + CurrentAbility = random.Next(0, Abilities.Count); + } + + public bool CanUltimate() + { + return Abilities[CurrentAbility].CanSpell(); + } + + public int Ultimate(IPlayer myself, IPlayer enemy, int round) + { + Abilities[CurrentAbility].Spell(myself, enemy, round); + return CurrentAbility; + } + + public void Effect(IPlayer myself) + { + if (MyEffects.Count != 0) + { + foreach (var effect in MyEffects) + { + effect.State(myself); + } + } + } + + public void DeleteEffect(IPlayer myself, int round, int numberPlayer) + { + if (MyEffects.Count != 0) + { + foreach (var effect in MyEffects.ToList()) + { + effect.DeleteState(myself, round, numberPlayer); + } + } + } + + public void RestoreAfterBattle() + { + if (NormalState is Normal normal) + { + Health = normal.Health; + Strength = normal.Strength; + } + + foreach (var ability in Abilities) + { + ability.NumberUses = 0; + } + + MyEffects.Clear(); + } + } + } +} + diff --git a/CourseApp/Entities/Players/Mage.cs b/CourseApp/Entities/Players/Mage.cs new file mode 100644 index 0000000..b676dee --- /dev/null +++ b/CourseApp/Entities/Players/Mage.cs @@ -0,0 +1,104 @@ +namespace CourseApp +{ + namespace Players + { + using System; + using System.Collections.Generic; + using System.Linq; + using Abilities; + using Effects; + public class Mage : IPlayer + { + public string Name { get; set; } + public int Strength { get; set; } + public int Health { get; set; } + public List Abilities { get; set; } = new List(); + public int CurrentAbility { get; set; } + public List MyEffects { get; set; } = new List(); + public IEffect NormalState { get; set; } + public string ClassName { get; set; } + + public Mage(string name, int strength, int health, string className) + { + Name = name; + Strength = strength; + Health = health; + + ClassName = className; + + Abilities.Add(new Freeze()); + if (ClassName == "Огненный маг") + { + Abilities.Add(new Fireball()); + } + NormalState = new Normal(Strength, Health); + } + + public void TakingDamage(int damage) + { + Health -= damage; + } + + public void AttackEnemy(IPlayer enemy) + { + enemy.TakingDamage(Strength); + } + + public void EnterCurrentAbility() + { + Random random = new Random(); + CurrentAbility = random.Next(0, Abilities.Count); + } + + public bool CanUltimate() + { + return Abilities[CurrentAbility].CanSpell(); + } + + public int Ultimate(IPlayer myself, IPlayer enemy, int round) + { + Abilities[CurrentAbility].Spell(myself, enemy, round); + return CurrentAbility; + } + + public void Effect(IPlayer myself) + { + if (MyEffects.Count != 0) + { + foreach (var effect in MyEffects) + { + effect.State(myself); + } + } + } + + public void DeleteEffect(IPlayer myself, int round, int numberPlayer) + { + if (MyEffects.Count != 0) + { + foreach (var effect in MyEffects.ToList()) + { + effect.DeleteState(myself, round, numberPlayer); + } + } + } + + public void RestoreAfterBattle() + { + if (NormalState is Normal normal) + { + Health = normal.Health; + Strength = normal.Strength; + } + + foreach (var ability in Abilities) + { + ability.NumberUses = 0; + } + + MyEffects.Clear(); + } + } + } +} + diff --git a/CourseApp/Logger/GameLogger.cs b/CourseApp/Logger/GameLogger.cs new file mode 100644 index 0000000..75a4397 --- /dev/null +++ b/CourseApp/Logger/GameLogger.cs @@ -0,0 +1,151 @@ +namespace CourseApp +{ + namespace Logger + { + using Players; + using Effects; + using System; + + public class GameLogger : ILogger + { + public void PrintStart() + { + Console.WriteLine("\nПриветствуем в Akvelon RPG SAGA!"); + } + + public void PrintStartSelectHero() + { + Console.WriteLine("Добавьте персонажей с новыми способностями!"); + } + + public void PrintSelectHero() + { + Console.WriteLine("\n1 - Огненный маг\n2 - Воин\n3 - Стрелок"); + } + + public void PrintWrongNumber() + { + Console.WriteLine("Неправильное число!"); + } + + public void PrintAddAbility(int heroChoice) + { + if (heroChoice == 1) + { + Console.WriteLine("Фаербол - наносит 2 * сила урона"); + Console.WriteLine("Добавить? Да - Нет"); + } + else if (heroChoice == 2) + { + Console.WriteLine("Оглушающий удар - противник пропускает ход"); + Console.WriteLine("Добавить? Да - Нет"); + } + else if (heroChoice == 3) + { + Console.WriteLine("Ледяные стрелы - противник получает 10 урона за ход (можно применить один раз)"); + Console.WriteLine("Добавить? Да - Нет"); + } + } + + public void PrintStartNumberPlayers() + { + Console.WriteLine("\nПриступить к выбору количества игроков? Да - Нет"); + } + + public void PrintNumberPlayers() + { + Console.WriteLine("Выберите число игроков:"); + } + + public void PrintTour(int numberTour) + { + Console.WriteLine($"Кон {numberTour}.\n"); + + } + + public void PrintVersus(IPlayer firstPlayer, IPlayer secondPlayer) + { + Console.WriteLine($"({firstPlayer.ClassName}) {firstPlayer.Name} vs ({secondPlayer.ClassName}) {secondPlayer.Name}"); + } + + public void PrintAttack(IPlayer playerAttack, IPlayer playerDefend) + { + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} наносит урон {playerAttack.Strength} противнику ({playerDefend.ClassName}) {playerDefend.Name}"); + } + + public void PrintUltimate(IPlayer playerAttack, IPlayer playerDefend, int randomUlt) + { + if (playerAttack.ClassName == "Маг") + { + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) на противника ({playerDefend.ClassName}) {playerDefend.Name}"); + } + else if (playerAttack.ClassName == "Рыцарь") + { + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и наносит урон {playerAttack.Strength} противнику ({playerDefend.ClassName}) {playerDefend.Name}"); + } else if (playerAttack.ClassName == "Лучник") + { + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и поджигает противника ({playerDefend.ClassName}) {playerDefend.Name}"); + } else if (playerAttack.ClassName == "Огненный маг") + { + if (playerAttack.Abilities[randomUlt].AbilityName == "Заворожение") + { + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) на противника ({playerDefend.ClassName}) {playerDefend.Name}"); + } + else + { + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и наносит урон {playerAttack.Strength} противнику ({playerDefend.ClassName}) {playerDefend.Name}"); + } + } + else if (playerAttack.ClassName == "Воин") + { + if (playerAttack.Abilities[randomUlt].AbilityName == "Удар возмездия") + { + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и наносит урон {playerAttack.Strength} противнику ({playerDefend.ClassName}) {playerDefend.Name}"); + } + else + { + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) на противника ({playerDefend.ClassName}) {playerDefend.Name}"); + } + } + else if (playerAttack.ClassName == "Стрелок") + { + if (playerAttack.Abilities[randomUlt].AbilityName == "Огненные стрелы") + { + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и поджигает противника ({playerDefend.ClassName}) {playerDefend.Name}"); + } + else + { + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) на противника ({playerDefend.ClassName}) {playerDefend.Name}"); + } + } + } + + public void PrintEffect(IPlayer player) + { + foreach (var effect in player.MyEffects) + { + if (effect is Stun) + { + Console.WriteLine($"({player.ClassName}) {player.Name} пропускает ход!"); + } + + if (effect is LongDamage longDamage) + { + Console.WriteLine($"({player.ClassName}) {player.Name} получает урон {longDamage.Factor}"); + } + } + + } + + public void PrintDefeat(IPlayer loser) + { + Console.WriteLine($"({loser.ClassName}) {loser.Name} погибает! \n\n"); + } + + public void PrintEnd(IPlayer winner) + { + Console.WriteLine($"({winner.ClassName}) {winner.Name} побеждает! \nThe END..."); + } + } + } +} diff --git a/CourseApp/Logger/ILogger.cs b/CourseApp/Logger/ILogger.cs new file mode 100644 index 0000000..1331b74 --- /dev/null +++ b/CourseApp/Logger/ILogger.cs @@ -0,0 +1,24 @@ +namespace CourseApp +{ + namespace Logger + { + using Players; + public interface ILogger + { + void PrintStart(); + void PrintStartSelectHero(); + void PrintSelectHero(); + void PrintWrongNumber(); + void PrintAddAbility(int heroChoice); + void PrintStartNumberPlayers(); + void PrintNumberPlayers(); + void PrintTour(int numberTour); + void PrintEnd(IPlayer winner); + void PrintVersus(IPlayer firstPlayer, IPlayer secondPlayer); + void PrintAttack(IPlayer playerAttack, IPlayer playerDefend); + void PrintUltimate(IPlayer playerAttack, IPlayer playerDefend, int randomUlt); + void PrintEffect(IPlayer player); + void PrintDefeat(IPlayer loser); + } + } +} diff --git a/CourseApp/Main/Fight.cs b/CourseApp/Main/Fight.cs new file mode 100644 index 0000000..0b70238 --- /dev/null +++ b/CourseApp/Main/Fight.cs @@ -0,0 +1,124 @@ +namespace CourseApp +{ + namespace Fight + { + using Players; + using Logger; + using Effects; + using System.Collections.Generic; + using System; + + public class Fight + { + private ILogger Logger { get; set; } + private IPlayer FirstPlayer { get; set; } + private IPlayer SecondPlayer { get; set; } + private int round { get; set; } = 1; + List AllPlayers { get; set; } + + public Fight(IPlayer firstPlayer, IPlayer secondPlayer, ref List allPlayers, ILogger logger) + { + FirstPlayer = firstPlayer; + SecondPlayer = secondPlayer; + AllPlayers = allPlayers; + Logger = logger; + } + + public void Battle() + { + bool stopGame; + + Logger.PrintVersus(FirstPlayer, SecondPlayer); + + while (true) + { + + stopGame = PlayerTurn(FirstPlayer, SecondPlayer, 1); + + if (stopGame) + { + break; + } + + stopGame = PlayerTurn(SecondPlayer, FirstPlayer, 2); + + if (stopGame) + { + break; + } + + round++; + } + } + + private bool PlayerTurn(IPlayer playerGame, IPlayer playerWait, int numberPlayer) + { + Random rand = new Random(); + bool stopGame = false; + bool isStun = false; + + playerGame.DeleteEffect(playerGame, round, numberPlayer); + playerGame.Effect(playerGame); + Logger.PrintEffect(playerGame); + + if (IsDefeat(playerGame, playerWait)) + { + stopGame = true; + return stopGame; + } + + foreach (var effect in playerGame.MyEffects) + { + if (effect is Stun) + { + isStun = true; + } + } + + if (!isStun) + { + if (rand.Next(0, 3) > 0) + { + playerGame.AttackEnemy(playerWait); + Logger.PrintAttack(playerGame, playerWait); + } + else + { + playerGame.EnterCurrentAbility(); + if (playerGame.CanUltimate()) + { + int randomUlt = playerGame.Ultimate(playerGame, playerWait, round); + Logger.PrintUltimate(playerGame, playerWait, randomUlt); + } + else + { + playerGame.AttackEnemy(playerWait); + Logger.PrintAttack(playerGame, playerWait); + } + } + } + + if (IsDefeat(playerWait, playerGame)) + { + stopGame = true; + return stopGame; + } + + return stopGame; + } + + private bool IsDefeat(IPlayer loser, IPlayer winner) + { + if (loser.Health <= 0) + { + Logger.PrintDefeat(loser); + AllPlayers.Remove(loser); + winner.RestoreAfterBattle(); + return true; + } + + return false; + } + } + } +} diff --git a/CourseApp/Main/Game.cs b/CourseApp/Main/Game.cs new file mode 100644 index 0000000..e5e8fe2 --- /dev/null +++ b/CourseApp/Main/Game.cs @@ -0,0 +1,99 @@ +namespace CourseApp +{ + namespace Base + { + using System.Text.Json; + using Logger; + using SelectorGame; + using GeneratePlayers; + using Players; + using Fight; + using PlayerNames; + using System.Collections.Generic; + using System.IO; + using System; + + #nullable enable + + public class Game + { + private ILogger Logger { get; set; } + private int numberTour { get; set; } + private List? playerNames { get; set; } + public Game(ILogger GameLogger) + { + Logger = GameLogger; + numberTour = 1; + + const string filepath = @"/home/kiosk/Develop/Tprogramming_2022/CourseApp/Main/Names.json"; + var json = File.ReadAllText(filepath); + playerNames = JsonSerializer.Deserialize>(json); + } + public void Run() + { + Logger.PrintStart(); + + Selector selector = new Selector(Logger); + + List newClasses = selector.SelectCustomClass(); + + int playerNumbers = selector.SelectNumbPlayers(); + + PlayersGenerator playersGenerator = new PlayersGenerator(playerNumbers, playerNames, newClasses); + + List players = new List(playersGenerator.GeneratePlayersArray()); + + while (true) + { + Logger.PrintTour(numberTour); + numberTour++; + + Draft(players); + Tour(players); + + if (EndGame(players)) + { + break; + } + } + } + + public void Draft(List players) + { + Random random = new Random(); + for (int i = players.Count - 1; i >= 1; i--) + { + int j = random.Next(i + 1); + var temp = players[j]; + players[j] = players[i]; + players[i] = temp; + } + } + + public void Tour(List players) + { + for (int i = 0; i < players.Count; i++) + { + if (i + 1 < players.Count) + { + Fight fight = new Fight(players[i], players[i+1], ref players, Logger); + fight.Battle(); + } + } + } + + public bool EndGame(List players) + { + if (players.Count == 1) + { + Logger.PrintEnd(players[0]); + return true; + } + else + { + return false; + } + } + } + } +} diff --git a/CourseApp/Main/Names.cs b/CourseApp/Main/Names.cs new file mode 100644 index 0000000..f829070 --- /dev/null +++ b/CourseApp/Main/Names.cs @@ -0,0 +1,7 @@ +namespace PlayerNames +{ + public class Names + { + public string PlayerName { get; set; } + } +} diff --git a/CourseApp/Main/Names.json b/CourseApp/Main/Names.json new file mode 100644 index 0000000..9abbce9 --- /dev/null +++ b/CourseApp/Main/Names.json @@ -0,0 +1,14 @@ +[ + {"PlayerName" : "Nikita"}, + {"PlayerName" : "Stanislav"}, + {"PlayerName" : "Oleg"}, + {"PlayerName" : "Danila"}, + {"PlayerName" : "Michael"}, + {"PlayerName" : "Max"}, + {"PlayerName" : "Ivan"}, + {"PlayerName" : "Nazar"}, + {"PlayerName" : "Kevin"}, + {"PlayerName" : "Vladislav"} +] + + diff --git a/CourseApp/Main/PlayersGenerator.cs b/CourseApp/Main/PlayersGenerator.cs new file mode 100644 index 0000000..08d0458 --- /dev/null +++ b/CourseApp/Main/PlayersGenerator.cs @@ -0,0 +1,91 @@ +namespace CourseApp +{ + namespace GeneratePlayers + { + using Players; + using PlayerNames; + using System.Collections.Generic; + using System; + + public class PlayersGenerator { + private int PlayersCount { get; set; } + private List PlayerNames { get; set; } + private List NewClasses { get; set; } + + public PlayersGenerator(int playerCount, List names, List newClasses) { + PlayersCount = playerCount; + PlayerNames = names; + NewClasses = newClasses; + } + + public List GeneratePlayersArray() { + var result = new List(); + var rand = new Random(); + for (int i = 0; i < PlayersCount; i++) { + IPlayer player; + var playerName = PlayerNames[rand.Next(PlayerNames.Count)].PlayerName; + var playerStrength = rand.Next(25, 51); + var playerHealth = rand.Next(50, 101); + var playerVariant = rand.Next(0, 3); + switch (playerVariant) { + case 0: + if (NewClasses[1] == true) + { + if (rand.Next(0, 2) > 0) + { + player = new Knight(playerName, playerStrength, playerHealth, "Рыцарь"); + } + else + { + player = new Knight(playerName, playerStrength, playerHealth, "Воин"); + } + } + else + { + player = new Knight(playerName, playerStrength, playerHealth, "Рыцарь"); + } + break; + case 1: + if (NewClasses[0] == true) + { + if (rand.Next(0, 2) > 0) + { + player = new Mage(playerName, playerStrength, playerHealth, "Маг"); + } + else + { + player = new Mage(playerName, playerStrength, playerHealth, "Огненный маг"); + } + } + else + { + player = new Mage(playerName, playerStrength, playerHealth, "Маг"); + } + break; + case 2: + if (NewClasses[2] == true) + { + if (rand.Next(0, 2) > 0) + { + player = new Archer(playerName, playerStrength, playerHealth, "Лучник"); + } + else + { + player = new Archer(playerName, playerStrength, playerHealth, "Стрелок"); + } + } + else + { + player = new Archer(playerName, playerStrength, playerHealth, "Лучник"); + } + break; + default: + throw new Exception(); + } + result.Add(player); + } + return result; + } + } + } +} \ No newline at end of file diff --git a/CourseApp/Main/Selector.cs b/CourseApp/Main/Selector.cs new file mode 100644 index 0000000..c718e47 --- /dev/null +++ b/CourseApp/Main/Selector.cs @@ -0,0 +1,104 @@ +namespace CourseApp +{ + namespace SelectorGame + { + using System; + using System.Collections.Generic; + using Logger; + + #nullable enable + + public class Selector + { + private int ChoiceNewHero { get; set; } + private ILogger Logger { get; set; } + private List NewClasses { get; set; } = new List(); + + public Selector(ILogger logger) + { + Logger = logger; + NewClasses.Add(false); + NewClasses.Add(false); + NewClasses.Add(false); + } + + private void IsAddNewClass(string? confirm) + { + if (confirm != "Да") + { + Logger.PrintAddAbility(ChoiceNewHero); + confirm = Console.ReadLine(); + + if (confirm == "Да") + { + NewClasses[ChoiceNewHero-1] = true; + confirm = "Нет"; + } + else + { + NewClasses[ChoiceNewHero-1] = false; + } + } + } + + public List SelectCustomClass() + { + Logger.PrintStartSelectHero(); + string? confirm = "Нет"; + + while (true) + { + Logger.PrintSelectHero(); + + string? HeroChoice = Console.ReadLine(); + + if (int.TryParse(HeroChoice, out int i) && i < 4) + { + ChoiceNewHero = i; + + IsAddNewClass(confirm); + + Logger.PrintStartNumberPlayers(); + + string? answer = Console.ReadLine(); + if (!(String.IsNullOrEmpty(answer))) + { + if (answer == "Да") + { + break; + } + } + } + else + { + Logger.PrintWrongNumber(); + } + } + return NewClasses; + } + + public int SelectNumbPlayers() + { + int playersNumbers; + + while (true) + { + Logger.PrintNumberPlayers(); + + string? numberOfPlayers = Console.ReadLine(); + + if (int.TryParse(numberOfPlayers, out int i) && (i % 2 == 0)) + { + playersNumbers = i; + break; + } + else + { + Logger.PrintWrongNumber(); + } + } + return playersNumbers; + } + } + } +} diff --git a/CourseApp/Phone.cs b/CourseApp/Phone.cs deleted file mode 100644 index 1c8e407..0000000 --- a/CourseApp/Phone.cs +++ /dev/null @@ -1,38 +0,0 @@ -namespace CourseApp -{ - using System; - - public class Phone - { - private float diaonal; - - public Phone(string name, float diagonal) - { - Name = name; - Diagonal = diagonal; - } - - public string Name { get; set; } - - public float Diagonal - { - get - { - return diaonal; - } - - set - { - if (value > 0 && value < 20) - { - this.diaonal = value; - } - } - } - - public void Show() - { - Console.WriteLine($"{Name} with diagonal {diaonal}"); - } - } -} \ No newline at end of file diff --git a/CourseApp/Program.cs b/CourseApp/Program.cs index 030f047..309b21a 100644 --- a/CourseApp/Program.cs +++ b/CourseApp/Program.cs @@ -1,26 +1,15 @@ namespace CourseApp { - using System; - - public class Program + namespace Base { - public static void Main(string[] args) + using Logger; + public class Program { - Phone phone1 = new Phone("iPhone", -7); - phone1.Show(); - phone1.Diagonal = 7; - phone1.Show(); - phone1.Diagonal = -16; - phone1.Show(); - - Phone tablet = new Phone("Android", 6); - tablet.Diagonal = 6; - tablet.Show(); - tablet.Diagonal = -10; - tablet.Show(); - tablet.Diagonal = 8; - tablet.Show(); - Console.WriteLine("Hello World"); + public static void Main(string[] args) + { + Game game = new Game(new GameLogger()); + game.Run(); + } } } -} +} \ No newline at end of file diff --git a/courseworkspace.code-workspace b/courseworkspace.code-workspace index 38f6cc3..5e4953c 100644 --- a/courseworkspace.code-workspace +++ b/courseworkspace.code-workspace @@ -1,15 +1,17 @@ { "folders": [ { + "name": "CourseApp", "path": "CourseApp" }, { - "path": "CourseApp.Tests" + "name": "Configs (Root)", + "path": "." }, { - "name": "Configs (Root)", - "path": "." - }, + "name": "CourseApp.Tests", + "path": "CourseApp.Tests" + } ], "settings": {}, "extensions": { From c45939f0955b4a7004fd9eb1b9c507186c325ccf Mon Sep 17 00:00:00 2001 From: castaval Date: Mon, 12 Dec 2022 15:35:08 +0300 Subject: [PATCH 3/3] refactor: use stylecop --- CourseApp.Tests/CourseApp.Tests.csproj | 2 +- CourseApp.Tests/FightTest.cs | 7 +- CourseApp.Tests/GameTest.cs | 5 +- CourseApp.Tests/PlayersGeneratorTest.cs | 3 - CourseApp.Tests/SelectorTest.cs | 6 +- CourseApp/CourseApp.csproj | 2 +- CourseApp/Entities/Abilities/FireArrows.cs | 42 ++-- CourseApp/Entities/Abilities/Fireball.cs | 51 ++--- CourseApp/Entities/Abilities/Freeze.cs | 32 +-- CourseApp/Entities/Abilities/IAbility.cs | 25 +-- CourseApp/Entities/Abilities/IceArrows.cs | 45 ++-- CourseApp/Entities/Abilities/StunStrike.cs | 32 +-- .../Entities/Abilities/VengeanceStrike.cs | 42 ++-- CourseApp/Entities/Effects/Buff.cs | 52 ++--- CourseApp/Entities/Effects/IEffect.cs | 18 +- CourseApp/Entities/Effects/LongDamage.cs | 45 ++-- CourseApp/Entities/Effects/Normal.cs | 70 +++--- CourseApp/Entities/Effects/Stun.cs | 41 ++-- CourseApp/Entities/Players/Archer.cs | 157 ++++++------- CourseApp/Entities/Players/IPlayer.cs | 62 +++--- CourseApp/Entities/Players/Knight.cs | 156 ++++++------- CourseApp/Entities/Players/Mage.cs | 159 ++++++------- CourseApp/Logger/GameLogger.cs | 209 +++++++++--------- CourseApp/Logger/ILogger.cs | 51 +++-- CourseApp/Main/Fight.cs | 174 +++++++-------- CourseApp/Main/Game.cs | 144 ++++++------ CourseApp/Main/Names.cs | 2 +- CourseApp/Main/PlayersGenerator.cs | 145 ++++++------ CourseApp/Main/Selector.cs | 149 ++++++------- CourseApp/Program.cs | 16 +- 30 files changed, 992 insertions(+), 952 deletions(-) diff --git a/CourseApp.Tests/CourseApp.Tests.csproj b/CourseApp.Tests/CourseApp.Tests.csproj index bbf701d..e43252f 100644 --- a/CourseApp.Tests/CourseApp.Tests.csproj +++ b/CourseApp.Tests/CourseApp.Tests.csproj @@ -2,7 +2,7 @@ net6.0 - False + True false diff --git a/CourseApp.Tests/FightTest.cs b/CourseApp.Tests/FightTest.cs index 328db30..87796b1 100644 --- a/CourseApp.Tests/FightTest.cs +++ b/CourseApp.Tests/FightTest.cs @@ -77,9 +77,9 @@ public void EffectTest() IPlayer secondPlayer = new Mage("Nikita", 20, 40, "Маг"); IPlayer thirdPlayer = new Knight("Kevin", 20, 40, "Рыцарь"); - int[] firstPlayerUnderUltimate = {firstPlayer.Health, firstPlayer.Strength}; - int[] secondPlayerUnderUltimate = {secondPlayer.Health, secondPlayer.Strength}; - int[] thirdPlayerUnderUltimate = {thirdPlayer.Health, thirdPlayer.Strength}; + int[] firstPlayerUnderUltimate = { firstPlayer.Health, firstPlayer.Strength }; + int[] secondPlayerUnderUltimate = { secondPlayer.Health, secondPlayer.Strength }; + int[] thirdPlayerUnderUltimate = { thirdPlayer.Health, thirdPlayer.Strength }; firstPlayer.Ultimate(firstPlayer, secondPlayer, 1); secondPlayer.Ultimate(secondPlayer, thirdPlayer, 1); @@ -114,5 +114,4 @@ public void EffectTest() Assert.True(secondResult); Assert.True(thirdResult); } - } \ No newline at end of file diff --git a/CourseApp.Tests/GameTest.cs b/CourseApp.Tests/GameTest.cs index 3557377..d43654f 100644 --- a/CourseApp.Tests/GameTest.cs +++ b/CourseApp.Tests/GameTest.cs @@ -28,7 +28,6 @@ public void DraftTest() var stringReader = new StringReader(stringBuilder.ToString()); Console.SetIn(stringReader); - Game game = new Game(new GameLogger()); Selector selector = new Selector(new GameLogger()); List newClasses = selector.SelectCustomClass(); @@ -55,7 +54,7 @@ public void TourTest() { // Arrange Game game = new Game(new GameLogger()); - List players= new List(); + List players = new List(); players.Add(new Archer("Max", 10, 30, "Рыцарь")); players.Add(new Archer("Max", 10, 30, "Рыцарь")); players.Add(new Archer("Max", 10, 30, "Рыцарь")); @@ -72,7 +71,7 @@ public void EndGameTest() { // Arrange Game game = new Game(new GameLogger()); - List players= new List(); + List players = new List(); players.Add(new Archer("Max", 40, 30, "Рыцарь")); // Act diff --git a/CourseApp.Tests/PlayersGeneratorTest.cs b/CourseApp.Tests/PlayersGeneratorTest.cs index caa4281..0303c36 100644 --- a/CourseApp.Tests/PlayersGeneratorTest.cs +++ b/CourseApp.Tests/PlayersGeneratorTest.cs @@ -29,7 +29,6 @@ public void GeneratePlayersArrayTest(string number, string isAdd, string startCh var stringReader = new StringReader(stringBuilder.ToString()); Console.SetIn(stringReader); - Selector selector = new Selector(new GameLogger()); List newClasses = selector.SelectCustomClass(); @@ -41,11 +40,9 @@ public void GeneratePlayersArrayTest(string number, string isAdd, string startCh var playersGenerator = new PlayersGenerator(playerNumbers, playerNames, newClasses); - // Act var players = playersGenerator.GeneratePlayersArray(); - // Assert Assert.NotEmpty(players); } diff --git a/CourseApp.Tests/SelectorTest.cs b/CourseApp.Tests/SelectorTest.cs index 41292c0..5f706ac 100644 --- a/CourseApp.Tests/SelectorTest.cs +++ b/CourseApp.Tests/SelectorTest.cs @@ -28,9 +28,9 @@ public void SelectCustomClassTest(string number, string isAdd, string startChoic // Act bool result = false; - List ListBool = selector.SelectCustomClass(); + List listBool = selector.SelectCustomClass(); - foreach (var element in ListBool) + foreach (var element in listBool) { result = element; @@ -55,7 +55,7 @@ public void SelectNumbPlayersTest(string number, string secondNumber = "14") var stringBuilder = new StringBuilder(); stringBuilder.AppendLine(number); - if (!(Int32.Parse(number) % 2 == 0)) + if (!(int.Parse(number) % 2 == 0)) { stringBuilder.AppendLine(secondNumber); } diff --git a/CourseApp/CourseApp.csproj b/CourseApp/CourseApp.csproj index 707f86e..eb22147 100644 --- a/CourseApp/CourseApp.csproj +++ b/CourseApp/CourseApp.csproj @@ -3,7 +3,7 @@ Exe net6.0 - False + True diff --git a/CourseApp/Entities/Abilities/FireArrows.cs b/CourseApp/Entities/Abilities/FireArrows.cs index 5de896b..f422225 100644 --- a/CourseApp/Entities/Abilities/FireArrows.cs +++ b/CourseApp/Entities/Abilities/FireArrows.cs @@ -1,29 +1,31 @@ -namespace CourseApp +namespace CourseApp.Abilities { - namespace Abilities + using CourseApp.Effects; + using CourseApp.Players; + + public class FireArrows : IAbility { - using Players; - using Effects; - public class FireArrows : IAbility + public string AbilityName { get; set; } = "Огненные стрелы"; + + public int NumberUses { get; set; } = 0; + + private int MaxUses { get; set; } = 1; + + public void Spell(IPlayer myself, IPlayer enemy, int round) { - public int NumberUses { get; set; } = 0; - private int MaxUses { get; set; } = 1; - public string AbilityName { get; set; } = "Огненные стрелы"; - public void Spell(IPlayer myself, IPlayer enemy, int round) + enemy.MyEffects.Add(new LongDamage(5, round)); + NumberUses++; + } + + public bool CanSpell() + { + if (NumberUses < MaxUses) { - enemy.MyEffects.Add(new LongDamage(5, round)); - NumberUses++; + return true; } - public bool CanSpell() + else { - if (NumberUses < MaxUses) - { - return true; - } - else - { - return false; - } + return false; } } } diff --git a/CourseApp/Entities/Abilities/Fireball.cs b/CourseApp/Entities/Abilities/Fireball.cs index 13b3ab4..cf7a7f2 100644 --- a/CourseApp/Entities/Abilities/Fireball.cs +++ b/CourseApp/Entities/Abilities/Fireball.cs @@ -1,34 +1,35 @@ -namespace CourseApp +namespace CourseApp.Abilities { - namespace Abilities + using CourseApp.Effects; + using CourseApp.Players; + + public class Fireball : IAbility { - using Players; - using Effects; - public class Fireball : IAbility + public int NumberUses { get; set; } = 0; + + public string AbilityName { get; set; } = "Фаерболл"; + + private int MaxUses { get; set; } = 2; + + public void Spell(IPlayer myself, IPlayer enemy, int round) { - public int NumberUses { get; set; } = 0; - private int MaxUses { get; set; } = 2; - public string AbilityName { get; set; } = "Фаерболл"; - public void Spell(IPlayer myself, IPlayer enemy, int round) + IEffect generateBuff = new Buff(2, round); + myself.MyEffects.Add(generateBuff); + int indexEffect = myself.MyEffects.IndexOf(generateBuff); + myself.MyEffects[indexEffect].State(myself); + enemy.Health -= myself.Strength; + NumberUses++; + } + + public bool CanSpell() + { + if (NumberUses < MaxUses) { - IEffect generateBuff = new Buff(2, round); - myself.MyEffects.Add(generateBuff); - int indexEffect = myself.MyEffects.IndexOf(generateBuff); - myself.MyEffects[indexEffect].State(myself); - enemy.Health -= myself.Strength; - NumberUses++; + return true; } - - public bool CanSpell() + else { - if (NumberUses < MaxUses) - { - return true; - } - else - { - return false; - } + return false; } } } diff --git a/CourseApp/Entities/Abilities/Freeze.cs b/CourseApp/Entities/Abilities/Freeze.cs index 18ea132..97bc0ba 100644 --- a/CourseApp/Entities/Abilities/Freeze.cs +++ b/CourseApp/Entities/Abilities/Freeze.cs @@ -1,23 +1,23 @@ -namespace CourseApp +namespace CourseApp.Abilities { - namespace Abilities + using CourseApp.Effects; + using CourseApp.Players; + + public class Freeze : IAbility { - using Players; - using Effects; - public class Freeze : IAbility + public int NumberUses { get; set; } = 0; + + public string AbilityName { get; set; } = "Заворожение"; + + public void Spell(IPlayer myself, IPlayer enemy, int round) { - public int NumberUses { get; set; } = 0; - public string AbilityName { get; set; } = "Заворожение"; - public void Spell(IPlayer myself, IPlayer enemy, int round) - { - enemy.MyEffects.Add(new Stun(round)); - NumberUses++; - } + enemy.MyEffects.Add(new Stun(round)); + NumberUses++; + } - public bool CanSpell() - { - return true; - } + public bool CanSpell() + { + return true; } } } diff --git a/CourseApp/Entities/Abilities/IAbility.cs b/CourseApp/Entities/Abilities/IAbility.cs index 4edb9a9..db6e337 100644 --- a/CourseApp/Entities/Abilities/IAbility.cs +++ b/CourseApp/Entities/Abilities/IAbility.cs @@ -1,16 +1,15 @@ -namespace CourseApp -{ - namespace Abilities +namespace CourseApp.Abilities +{ + using CourseApp.Players; + + public interface IAbility { - using Players; - using Effects; - public interface IAbility - { - int NumberUses { get; set; } - string AbilityName { get; set; } - void Spell(IPlayer myself, IPlayer enemy, int round); - bool CanSpell(); - } + int NumberUses { get; set; } + + string AbilityName { get; set; } + + void Spell(IPlayer myself, IPlayer enemy, int round); + + bool CanSpell(); } } - diff --git a/CourseApp/Entities/Abilities/IceArrows.cs b/CourseApp/Entities/Abilities/IceArrows.cs index 8941de5..6a1e028 100644 --- a/CourseApp/Entities/Abilities/IceArrows.cs +++ b/CourseApp/Entities/Abilities/IceArrows.cs @@ -1,31 +1,32 @@ -namespace CourseApp +namespace CourseApp.Abilities { - namespace Abilities + using CourseApp.Effects; + using CourseApp.Players; + + public class IceArrows : IAbility { - using Players; - using Effects; - public class IceArrows : IAbility + public int NumberUses { get; set; } = 0; + + public string AbilityName { get; set; } = "Ледяные стрелы"; + + private int MaxUses { get; set; } = 1; + + public void Spell(IPlayer myself, IPlayer enemy, int round) { - public int NumberUses { get; set; } = 0; - private int MaxUses { get; set; } = 1; - public string AbilityName { get; set; } = "Ледяные стрелы"; - public void Spell(IPlayer myself, IPlayer enemy, int round) + enemy.MyEffects.Add(new LongDamage(10, round)); + NumberUses++; + } + + public bool CanSpell() + { + if (NumberUses < MaxUses) { - enemy.MyEffects.Add(new LongDamage(10, round)); - NumberUses++; + return true; } - - public bool CanSpell() + else { - if (NumberUses < MaxUses) - { - return true; - } - else - { - return false; - } + return false; } - } + } } } diff --git a/CourseApp/Entities/Abilities/StunStrike.cs b/CourseApp/Entities/Abilities/StunStrike.cs index bb39df9..cc5589c 100644 --- a/CourseApp/Entities/Abilities/StunStrike.cs +++ b/CourseApp/Entities/Abilities/StunStrike.cs @@ -1,23 +1,23 @@ -namespace CourseApp +namespace CourseApp.Abilities { - namespace Abilities + using CourseApp.Effects; + using CourseApp.Players; + + public class StunStrike : IAbility { - using Players; - using Effects; - public class StunStrike : IAbility + public int NumberUses { get; set; } = 0; + + public string AbilityName { get; set; } = "Оглушающий удар"; + + public void Spell(IPlayer myself, IPlayer enemy, int round) { - public int NumberUses { get; set; } = 0; - public string AbilityName { get; set; } = "Оглушающий удар"; - public void Spell(IPlayer myself, IPlayer enemy, int round) - { - enemy.MyEffects.Add(new Stun(round)); - NumberUses++; - } + enemy.MyEffects.Add(new Stun(round)); + NumberUses++; + } - public bool CanSpell() - { - return true; - } + public bool CanSpell() + { + return true; } } } diff --git a/CourseApp/Entities/Abilities/VengeanceStrike.cs b/CourseApp/Entities/Abilities/VengeanceStrike.cs index 5b0b40e..7eb0fe0 100644 --- a/CourseApp/Entities/Abilities/VengeanceStrike.cs +++ b/CourseApp/Entities/Abilities/VengeanceStrike.cs @@ -1,29 +1,27 @@ -namespace CourseApp +namespace CourseApp.Abilities { - namespace Abilities + using CourseApp.Effects; + using CourseApp.Players; + + public class VengeanceStrike : IAbility { - using Players; - using Effects; - public class VengeanceStrike : IAbility - { - public int NumberUses { get; set; } = 0; + public int NumberUses { get; set; } = 0; - public string AbilityName { get; set; } = "Удар возмездия"; - public void Spell(IPlayer myself, IPlayer enemy, int round) - { - IEffect generateBuff = new Buff(1.3, round);; - myself.MyEffects.Add(generateBuff); - int indexEffect = myself.MyEffects.IndexOf(generateBuff); - myself.MyEffects[indexEffect].State(myself); - enemy.Health -= myself.Strength; - NumberUses++; - } + public string AbilityName { get; set; } = "Удар возмездия"; - public bool CanSpell() - { - return true; - } + public void Spell(IPlayer myself, IPlayer enemy, int round) + { + IEffect generateBuff = new Buff(1.3, round); + myself.MyEffects.Add(generateBuff); + int indexEffect = myself.MyEffects.IndexOf(generateBuff); + myself.MyEffects[indexEffect].State(myself); + enemy.Health -= myself.Strength; + NumberUses++; + } + + public bool CanSpell() + { + return true; } } } - diff --git a/CourseApp/Entities/Effects/Buff.cs b/CourseApp/Entities/Effects/Buff.cs index 6da0db4..ac8a8bf 100644 --- a/CourseApp/Entities/Effects/Buff.cs +++ b/CourseApp/Entities/Effects/Buff.cs @@ -1,40 +1,42 @@ -namespace CourseApp +namespace CourseApp.Effects { - namespace Effects + using System.Linq; + using CourseApp.Players; + + public class Buff : IEffect { - using System.Linq; - using Players; - public class Buff : IEffect + public Buff(double factor, int round) { - public double Factor { get; set; } + Factor = factor; + LastUsedRound = round; + } - public int LastUsedRound { get; set; } + public double Factor { get; set; } - public Buff(double factor, int round) - { - Factor = factor; - LastUsedRound = round; - } + public int LastUsedRound { get; set; } - public void State(IPlayer Player) - { - Player.Strength = (int)((double)Player.Strength * Factor); - } + public void State(IPlayer player) + { + player.Strength = (int)((double)player.Strength * Factor); + } - public void DeleteState(IPlayer Player, int Round, int numberPlayer) + public void DeleteState(IPlayer player, int round, int numberPlayer) + { + if (round - LastUsedRound == 1) { - if (Round - LastUsedRound == 1) + if (player.NormalState is Normal normal) + { + normal.RestoreStrength(player); + } + + foreach (var effect in player.MyEffects.ToList()) { - if (Player.NormalState is Normal normal) normal.RestoreStrength(Player); - foreach (var effect in Player.MyEffects.ToList()) + if (effect is Buff buff) { - if (effect is Buff buff) - { - Player.MyEffects.Remove(buff); - } + player.MyEffects.Remove(buff); } } } - } + } } } diff --git a/CourseApp/Entities/Effects/IEffect.cs b/CourseApp/Entities/Effects/IEffect.cs index 9fc7a4b..68aa6b9 100644 --- a/CourseApp/Entities/Effects/IEffect.cs +++ b/CourseApp/Entities/Effects/IEffect.cs @@ -1,13 +1,13 @@ -namespace CourseApp +namespace CourseApp.Effects { - namespace Effects + using CourseApp.Players; + + public interface IEffect { - using Players; - public interface IEffect - { - int LastUsedRound { get; set; } - void State(IPlayer Player); - void DeleteState(IPlayer Player, int round, int numberPlayer); - } + int LastUsedRound { get; set; } + + void State(IPlayer player); + + void DeleteState(IPlayer player, int round, int numberPlayer); } } diff --git a/CourseApp/Entities/Effects/LongDamage.cs b/CourseApp/Entities/Effects/LongDamage.cs index af868f7..420c9d6 100644 --- a/CourseApp/Entities/Effects/LongDamage.cs +++ b/CourseApp/Entities/Effects/LongDamage.cs @@ -1,37 +1,34 @@ -namespace CourseApp +namespace CourseApp.Effects { - namespace Effects + using System.Linq; + using CourseApp.Players; + + public class LongDamage : IEffect { - using System.Linq; - using Players; - public class LongDamage : IEffect + public LongDamage(int factor, int round) { - public int Factor { get; set; } - - public int LastUsedRound { get; set; } + Factor = factor; + LastUsedRound = round; + } + public int Factor { get; set; } - public LongDamage(int factor, int round) - { - Factor = factor; - LastUsedRound = round; - } + public int LastUsedRound { get; set; } - public void State(IPlayer enemy) - { - enemy.Health -= Factor; - } + public void State(IPlayer enemy) + { + enemy.Health -= Factor; + } - public void DeleteState(IPlayer Player, int Round, int numberPlayer) + public void DeleteState(IPlayer player, int round, int numberPlayer) + { + if ((round - LastUsedRound == 10 && numberPlayer == 2) || (round - LastUsedRound == 11 && numberPlayer == 1)) { - if ((Round - LastUsedRound == 10 && numberPlayer == 2) || (Round - LastUsedRound == 11 && numberPlayer == 1)) + foreach (var effect in player.MyEffects.ToList()) { - foreach (var effect in Player.MyEffects.ToList()) + if (effect is LongDamage longDamage) { - if (effect is LongDamage longDamage) - { - Player.MyEffects.Remove(longDamage); - } + player.MyEffects.Remove(longDamage); } } } diff --git a/CourseApp/Entities/Effects/Normal.cs b/CourseApp/Entities/Effects/Normal.cs index 3823860..2c32ad7 100644 --- a/CourseApp/Entities/Effects/Normal.cs +++ b/CourseApp/Entities/Effects/Normal.cs @@ -1,42 +1,40 @@ -namespace CourseApp +namespace CourseApp.Effects { - namespace Effects + using CourseApp.Players; + + public class Normal : IEffect { - using Players; - public class Normal : IEffect + public Normal(int strength, int health) + { + Health = health; + Strength = strength; + } + + public int Health { get; set; } + + public int Strength { get; set; } + + public int LastUsedRound { get; set; } + + public void State(IPlayer myself) + { + myself.Strength = Strength; + myself.Health = Health; + } + + public void RestoreStrength(IPlayer myself) + { + myself.Strength = Strength; + } + + public void RestoreHealth(IPlayer myself) + { + myself.Health = Health; + } + + public void DeleteState(IPlayer player, int round, int numberPlayer) { - public int Health { get; set; } - public int Strength { get; set; } - - public int LastUsedRound { get; set; } - - - public Normal(int strength, int health) - { - Health = health; - Strength = strength; - } - - public void State(IPlayer myself) - { - myself.Strength = Strength; - myself.Health = Health; - } - - public void RestoreStrength(IPlayer myself) - { - myself.Strength = Strength; - } - - public void RestoreHealth(IPlayer myself) - { - myself.Health = Health; - } - - public void DeleteState(IPlayer Player, int Round, int numberPlayer) - { - Player.MyEffects = null; - } + player.MyEffects = null; } } } diff --git a/CourseApp/Entities/Effects/Stun.cs b/CourseApp/Entities/Effects/Stun.cs index 30a1690..9e97a91 100644 --- a/CourseApp/Entities/Effects/Stun.cs +++ b/CourseApp/Entities/Effects/Stun.cs @@ -1,33 +1,34 @@ -namespace CourseApp +namespace CourseApp.Effects { - namespace Effects + using System.Linq; + using CourseApp.Players; + + public class Stun : IEffect { - using System.Linq; - using Players; - public class Stun : IEffect + public Stun(int round) { - public int LastUsedRound { get; set; } + LastUsedRound = round; + } - public Stun(int round) - { - LastUsedRound = round; - } + public int LastUsedRound { get; set; } - public void State(IPlayer Player) - { - Player.Strength = 0; - } + public void State(IPlayer player) + { + player.Strength = 0; + } - public void DeleteState(IPlayer Player, int Round, int numberPlayer) + public void DeleteState(IPlayer player, int round, int numberPlayer) + { + foreach (var effect in player.MyEffects.ToList()) { - foreach (var effect in Player.MyEffects.ToList()) + if (effect is Stun stun) { - if (effect is Stun stun) + if ((round - effect.LastUsedRound == 1 && numberPlayer == 2) || (round - effect.LastUsedRound == 2 && numberPlayer == 1)) { - if ((Round - effect.LastUsedRound == 1 && numberPlayer == 2) || (Round - effect.LastUsedRound == 2 && numberPlayer == 1)) + player.MyEffects.Remove(stun); + if (player.NormalState is Normal normal) { - Player.MyEffects.Remove(stun); - if (Player.NormalState is Normal normal) normal.RestoreStrength(Player); + normal.RestoreStrength(player); } } } diff --git a/CourseApp/Entities/Players/Archer.cs b/CourseApp/Entities/Players/Archer.cs index 3ad5f2e..d0a79dc 100644 --- a/CourseApp/Entities/Players/Archer.cs +++ b/CourseApp/Entities/Players/Archer.cs @@ -1,104 +1,109 @@ -namespace CourseApp +namespace CourseApp.Players { - namespace Players + using System; + using System.Collections.Generic; + using System.Linq; + using CourseApp.Abilities; + using CourseApp.Effects; + + public class Archer : IPlayer { - using System; - using System.Collections.Generic; - using System.Linq; - using Abilities; - using Effects; - public class Archer : IPlayer + public Archer(string name, int strength, int health, string className) { - public string Name { get; set; } - public int Strength { get; set; } - public int Health { get; set; } - public List Abilities { get; set; } = new List(); - public int CurrentAbility { get; set; } - public List MyEffects { get; set; } = new List(); - public IEffect NormalState { get; set; } - public string ClassName { get; set; } - - public Archer(string name, int strength, int health, string className) - { - Name = name; - Strength = strength; - Health = health; + Name = name; + Strength = strength; + Health = health; - ClassName = className; + ClassName = className; - Abilities.Add(new FireArrows()); - if (ClassName == "Стрелок") - { - Abilities.Add(new IceArrows()); - } - NormalState = new Normal(Strength, Health); - } - - public void TakingDamage(int damage) + Abilities.Add(new FireArrows()); + if (ClassName == "Стрелок") { - Health -= damage; + Abilities.Add(new IceArrows()); } - public void AttackEnemy(IPlayer enemy) - { - enemy.TakingDamage(Strength); - } + NormalState = new Normal(Strength, Health); + } - public void EnterCurrentAbility() - { - Random random = new Random(); - CurrentAbility = random.Next(0, Abilities.Count); - } + public string Name { get; set; } - public bool CanUltimate() - { - return Abilities[CurrentAbility].CanSpell(); - } + public int Strength { get; set; } - public int Ultimate(IPlayer myself, IPlayer enemy, int round) - { - Abilities[CurrentAbility].Spell(myself, enemy, round); - return CurrentAbility; - } + public int Health { get; set; } + + public List Abilities { get; set; } = new List(); + + public int CurrentAbility { get; set; } + + public List MyEffects { get; set; } = new List(); + + public IEffect NormalState { get; set; } - public void Effect(IPlayer myself) + public string ClassName { get; set; } + + public void TakingDamage(int damage) + { + Health -= damage; + } + + public void AttackEnemy(IPlayer enemy) + { + enemy.TakingDamage(Strength); + } + + public void EnterCurrentAbility() + { + Random random = new Random(); + CurrentAbility = random.Next(0, Abilities.Count); + } + + public bool CanUltimate() + { + return Abilities[CurrentAbility].CanSpell(); + } + + public int Ultimate(IPlayer myself, IPlayer enemy, int round) + { + Abilities[CurrentAbility].Spell(myself, enemy, round); + return CurrentAbility; + } + + public void Effect(IPlayer myself) + { + if (MyEffects.Count != 0) { - if (MyEffects.Count != 0) + foreach (var effect in MyEffects) { - foreach (var effect in MyEffects) - { - effect.State(myself); - } + effect.State(myself); } } + } - public void DeleteEffect(IPlayer myself, int round, int numberPlayer) + public void DeleteEffect(IPlayer myself, int round, int numberPlayer) + { + if (MyEffects.Count != 0) { - if (MyEffects.Count != 0) + foreach (var effect in MyEffects.ToList()) { - foreach (var effect in MyEffects.ToList()) - { - effect.DeleteState(myself, round, numberPlayer); - } + effect.DeleteState(myself, round, numberPlayer); } } + } - public void RestoreAfterBattle() + public void RestoreAfterBattle() + { + if (NormalState is Normal normal) { - if (NormalState is Normal normal) - { - Health = normal.Health; - Strength = normal.Strength; - } - - foreach (var ability in Abilities) - { - ability.NumberUses = 0; - } + Health = normal.Health; + Strength = normal.Strength; + } - MyEffects.Clear(); + foreach (var ability in Abilities) + { + ability.NumberUses = 0; } + + MyEffects.Clear(); } } } - diff --git a/CourseApp/Entities/Players/IPlayer.cs b/CourseApp/Entities/Players/IPlayer.cs index 71fe860..a7f9d2c 100644 --- a/CourseApp/Entities/Players/IPlayer.cs +++ b/CourseApp/Entities/Players/IPlayer.cs @@ -1,29 +1,41 @@ -namespace CourseApp +namespace CourseApp.Players { - namespace Players + using System.Collections.Generic; + using CourseApp.Abilities; + using CourseApp.Effects; + + public interface IPlayer { - using System.Collections.Generic; - using CourseApp.Abilities; - using CourseApp.Effects; - public interface IPlayer - { - string Name { get; set; } - int Strength { get; set; } - int Health { get; set; } - List Abilities { get; set; } - int CurrentAbility { get; set; } - List MyEffects { get; set; } - IEffect NormalState { get; set; } - string ClassName { get; set; } - void TakingDamage(int damage); - void AttackEnemy(IPlayer enemy); - void EnterCurrentAbility(); - bool CanUltimate(); - int Ultimate(IPlayer myself, IPlayer enemy, int round); - void Effect(IPlayer myself); - void DeleteEffect(IPlayer myself, int round, int numberPlayer); - void RestoreAfterBattle(); - } + string Name { get; set; } + + int Strength { get; set; } + + int Health { get; set; } + + List Abilities { get; set; } + + int CurrentAbility { get; set; } + + List MyEffects { get; set; } + + IEffect NormalState { get; set; } + + string ClassName { get; set; } + + void TakingDamage(int damage); + + void AttackEnemy(IPlayer enemy); + + void EnterCurrentAbility(); + + bool CanUltimate(); + + int Ultimate(IPlayer myself, IPlayer enemy, int round); + + void Effect(IPlayer myself); + + void DeleteEffect(IPlayer myself, int round, int numberPlayer); + + void RestoreAfterBattle(); } } - diff --git a/CourseApp/Entities/Players/Knight.cs b/CourseApp/Entities/Players/Knight.cs index 97738ea..b9a2c58 100644 --- a/CourseApp/Entities/Players/Knight.cs +++ b/CourseApp/Entities/Players/Knight.cs @@ -1,104 +1,110 @@ -namespace CourseApp +namespace CourseApp.Players { - namespace Players + using System; + using System.Collections.Generic; + using System.Linq; + using CourseApp.Abilities; + using CourseApp.Effects; + + public class Knight : IPlayer { - using System; - using System.Collections.Generic; - using System.Linq; - using Abilities; - using Effects; - public class Knight : IPlayer + public Knight(string name, int strength, int health, string className) { - public string Name { get; set; } - public int Strength { get; set; } - public int Health { get; set; } - public List Abilities { get; set; } = new List(); - public int CurrentAbility { get; set; } - public List MyEffects { get; set; } = new List(); - public IEffect NormalState { get; set; } - public string ClassName { get; set; } - - public Knight(string name, int strength, int health, string className) - { - Name = name; - Strength = strength; - Health = health; + Name = name; + Strength = strength; + Health = health; - ClassName = className; + ClassName = className; - Abilities.Add(new VengeanceStrike()); - if (ClassName == "Воин") - { - Abilities.Add(new StunStrike()); - } - NormalState = new Normal(Strength, Health); - } + Abilities.Add(new VengeanceStrike()); - public void TakingDamage(int damage) + if (ClassName == "Воин") { - Health -= damage; + Abilities.Add(new StunStrike()); } - public void AttackEnemy(IPlayer enemy) - { - enemy.TakingDamage(Strength); - } + NormalState = new Normal(Strength, Health); + } - public void EnterCurrentAbility() - { - Random random = new Random(); - CurrentAbility = random.Next(0, Abilities.Count); - } + public string Name { get; set; } - public bool CanUltimate() - { - return Abilities[CurrentAbility].CanSpell(); - } + public int Strength { get; set; } - public int Ultimate(IPlayer myself, IPlayer enemy, int round) - { - Abilities[CurrentAbility].Spell(myself, enemy, round); - return CurrentAbility; - } + public int Health { get; set; } + + public List Abilities { get; set; } = new List(); + + public int CurrentAbility { get; set; } + + public List MyEffects { get; set; } = new List(); + + public IEffect NormalState { get; set; } + + public string ClassName { get; set; } + + public void TakingDamage(int damage) + { + Health -= damage; + } + + public void AttackEnemy(IPlayer enemy) + { + enemy.TakingDamage(Strength); + } + + public void EnterCurrentAbility() + { + Random random = new Random(); + CurrentAbility = random.Next(0, Abilities.Count); + } + + public bool CanUltimate() + { + return Abilities[CurrentAbility].CanSpell(); + } + + public int Ultimate(IPlayer myself, IPlayer enemy, int round) + { + Abilities[CurrentAbility].Spell(myself, enemy, round); + return CurrentAbility; + } - public void Effect(IPlayer myself) + public void Effect(IPlayer myself) + { + if (MyEffects.Count != 0) { - if (MyEffects.Count != 0) + foreach (var effect in MyEffects) { - foreach (var effect in MyEffects) - { - effect.State(myself); - } + effect.State(myself); } } + } - public void DeleteEffect(IPlayer myself, int round, int numberPlayer) + public void DeleteEffect(IPlayer myself, int round, int numberPlayer) + { + if (MyEffects.Count != 0) { - if (MyEffects.Count != 0) + foreach (var effect in MyEffects.ToList()) { - foreach (var effect in MyEffects.ToList()) - { - effect.DeleteState(myself, round, numberPlayer); - } + effect.DeleteState(myself, round, numberPlayer); } } + } - public void RestoreAfterBattle() + public void RestoreAfterBattle() + { + if (NormalState is Normal normal) { - if (NormalState is Normal normal) - { - Health = normal.Health; - Strength = normal.Strength; - } - - foreach (var ability in Abilities) - { - ability.NumberUses = 0; - } + Health = normal.Health; + Strength = normal.Strength; + } - MyEffects.Clear(); + foreach (var ability in Abilities) + { + ability.NumberUses = 0; } + + MyEffects.Clear(); } } } - diff --git a/CourseApp/Entities/Players/Mage.cs b/CourseApp/Entities/Players/Mage.cs index b676dee..1135d63 100644 --- a/CourseApp/Entities/Players/Mage.cs +++ b/CourseApp/Entities/Players/Mage.cs @@ -1,104 +1,109 @@ -namespace CourseApp +namespace CourseApp.Players { - namespace Players + using System; + using System.Collections.Generic; + using System.Linq; + using CourseApp.Abilities; + using CourseApp.Effects; + + public class Mage : IPlayer { - using System; - using System.Collections.Generic; - using System.Linq; - using Abilities; - using Effects; - public class Mage : IPlayer + public Mage(string name, int strength, int health, string className) { - public string Name { get; set; } - public int Strength { get; set; } - public int Health { get; set; } - public List Abilities { get; set; } = new List(); - public int CurrentAbility { get; set; } - public List MyEffects { get; set; } = new List(); - public IEffect NormalState { get; set; } - public string ClassName { get; set; } - - public Mage(string name, int strength, int health, string className) - { - Name = name; - Strength = strength; - Health = health; - - ClassName = className; + Name = name; + Strength = strength; + Health = health; - Abilities.Add(new Freeze()); - if (ClassName == "Огненный маг") - { - Abilities.Add(new Fireball()); - } - NormalState = new Normal(Strength, Health); - } + ClassName = className; - public void TakingDamage(int damage) + Abilities.Add(new Freeze()); + if (ClassName == "Огненный маг") { - Health -= damage; + Abilities.Add(new Fireball()); } - public void AttackEnemy(IPlayer enemy) - { - enemy.TakingDamage(Strength); - } + NormalState = new Normal(Strength, Health); + } - public void EnterCurrentAbility() - { - Random random = new Random(); - CurrentAbility = random.Next(0, Abilities.Count); - } + public string Name { get; set; } - public bool CanUltimate() - { - return Abilities[CurrentAbility].CanSpell(); - } + public int Strength { get; set; } - public int Ultimate(IPlayer myself, IPlayer enemy, int round) - { - Abilities[CurrentAbility].Spell(myself, enemy, round); - return CurrentAbility; - } + public int Health { get; set; } + + public List Abilities { get; set; } = new List(); + + public int CurrentAbility { get; set; } + + public List MyEffects { get; set; } = new List(); + + public IEffect NormalState { get; set; } + + public string ClassName { get; set; } + + public void TakingDamage(int damage) + { + Health -= damage; + } - public void Effect(IPlayer myself) + public void AttackEnemy(IPlayer enemy) + { + enemy.TakingDamage(Strength); + } + + public void EnterCurrentAbility() + { + Random random = new Random(); + CurrentAbility = random.Next(0, Abilities.Count); + } + + public bool CanUltimate() + { + return Abilities[CurrentAbility].CanSpell(); + } + + public int Ultimate(IPlayer myself, IPlayer enemy, int round) + { + Abilities[CurrentAbility].Spell(myself, enemy, round); + return CurrentAbility; + } + + public void Effect(IPlayer myself) + { + if (MyEffects.Count != 0) { - if (MyEffects.Count != 0) + foreach (var effect in MyEffects) { - foreach (var effect in MyEffects) - { - effect.State(myself); - } + effect.State(myself); } } + } - public void DeleteEffect(IPlayer myself, int round, int numberPlayer) + public void DeleteEffect(IPlayer myself, int round, int numberPlayer) + { + if (MyEffects.Count != 0) { - if (MyEffects.Count != 0) + foreach (var effect in MyEffects.ToList()) { - foreach (var effect in MyEffects.ToList()) - { - effect.DeleteState(myself, round, numberPlayer); - } + effect.DeleteState(myself, round, numberPlayer); } } + } - public void RestoreAfterBattle() + public void RestoreAfterBattle() + { + if (NormalState is Normal normal) { - if (NormalState is Normal normal) - { - Health = normal.Health; - Strength = normal.Strength; - } - - foreach (var ability in Abilities) - { - ability.NumberUses = 0; - } + Health = normal.Health; + Strength = normal.Strength; + } - MyEffects.Clear(); + foreach (var ability in Abilities) + { + ability.NumberUses = 0; } - } + + MyEffects.Clear(); + } } } - diff --git a/CourseApp/Logger/GameLogger.cs b/CourseApp/Logger/GameLogger.cs index 75a4397..de525b0 100644 --- a/CourseApp/Logger/GameLogger.cs +++ b/CourseApp/Logger/GameLogger.cs @@ -1,151 +1,148 @@ -namespace CourseApp +namespace CourseApp.Logger { - namespace Logger + using System; + using CourseApp.Effects; + using CourseApp.Players; + + public class GameLogger : ILogger { - using Players; - using Effects; - using System; + public void PrintStart() + { + Console.WriteLine("\nПриветствуем в Akvelon RPG SAGA!"); + } - public class GameLogger : ILogger + public void PrintStartSelectHero() { - public void PrintStart() - { - Console.WriteLine("\nПриветствуем в Akvelon RPG SAGA!"); - } + Console.WriteLine("Добавьте персонажей с новыми способностями!"); + } - public void PrintStartSelectHero() - { - Console.WriteLine("Добавьте персонажей с новыми способностями!"); - } + public void PrintSelectHero() + { + Console.WriteLine("\n1 - Огненный маг\n2 - Воин\n3 - Стрелок"); + } - public void PrintSelectHero() - { - Console.WriteLine("\n1 - Огненный маг\n2 - Воин\n3 - Стрелок"); - } + public void PrintWrongNumber() + { + Console.WriteLine("Неправильное число!"); + } - public void PrintWrongNumber() + public void PrintAddAbility(int heroChoice) + { + if (heroChoice == 1) { - Console.WriteLine("Неправильное число!"); + Console.WriteLine("Фаербол - наносит 2 * сила урона"); + Console.WriteLine("Добавить? Да - Нет"); } - - public void PrintAddAbility(int heroChoice) + else if (heroChoice == 2) { - if (heroChoice == 1) - { - Console.WriteLine("Фаербол - наносит 2 * сила урона"); - Console.WriteLine("Добавить? Да - Нет"); - } - else if (heroChoice == 2) - { - Console.WriteLine("Оглушающий удар - противник пропускает ход"); - Console.WriteLine("Добавить? Да - Нет"); - } - else if (heroChoice == 3) - { - Console.WriteLine("Ледяные стрелы - противник получает 10 урона за ход (можно применить один раз)"); - Console.WriteLine("Добавить? Да - Нет"); - } + Console.WriteLine("Оглушающий удар - противник пропускает ход"); + Console.WriteLine("Добавить? Да - Нет"); } - - public void PrintStartNumberPlayers() + else if (heroChoice == 3) { - Console.WriteLine("\nПриступить к выбору количества игроков? Да - Нет"); + Console.WriteLine("Ледяные стрелы - противник получает 10 урона за ход (можно применить один раз)"); + Console.WriteLine("Добавить? Да - Нет"); } + } - public void PrintNumberPlayers() - { - Console.WriteLine("Выберите число игроков:"); - } + public void PrintStartNumberPlayers() + { + Console.WriteLine("\nПриступить к выбору количества игроков? Да - Нет"); + } - public void PrintTour(int numberTour) - { - Console.WriteLine($"Кон {numberTour}.\n"); + public void PrintNumberPlayers() + { + Console.WriteLine("Выберите число игроков:"); + } - } + public void PrintTour(int numberTour) + { + Console.WriteLine($"Кон {numberTour}.\n"); + } + + public void PrintVersus(IPlayer firstPlayer, IPlayer secondPlayer) + { + Console.WriteLine($"({firstPlayer.ClassName}) {firstPlayer.Name} vs ({secondPlayer.ClassName}) {secondPlayer.Name}"); + } - public void PrintVersus(IPlayer firstPlayer, IPlayer secondPlayer) + public void PrintAttack(IPlayer playerAttack, IPlayer playerDefend) + { + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} наносит урон {playerAttack.Strength} противнику ({playerDefend.ClassName}) {playerDefend.Name}"); + } + + public void PrintUltimate(IPlayer playerAttack, IPlayer playerDefend, int randomUlt) + { + if (playerAttack.ClassName == "Маг") { - Console.WriteLine($"({firstPlayer.ClassName}) {firstPlayer.Name} vs ({secondPlayer.ClassName}) {secondPlayer.Name}"); + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) на противника ({playerDefend.ClassName}) {playerDefend.Name}"); } - - public void PrintAttack(IPlayer playerAttack, IPlayer playerDefend) + else if (playerAttack.ClassName == "Рыцарь") { - Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} наносит урон {playerAttack.Strength} противнику ({playerDefend.ClassName}) {playerDefend.Name}"); + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и наносит урон {playerAttack.Strength} противнику ({playerDefend.ClassName}) {playerDefend.Name}"); } - - public void PrintUltimate(IPlayer playerAttack, IPlayer playerDefend, int randomUlt) + else if (playerAttack.ClassName == "Лучник") + { + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и поджигает противника ({playerDefend.ClassName}) {playerDefend.Name}"); + } + else if (playerAttack.ClassName == "Огненный маг") { - if (playerAttack.ClassName == "Маг") + if (playerAttack.Abilities[randomUlt].AbilityName == "Заворожение") { Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) на противника ({playerDefend.ClassName}) {playerDefend.Name}"); } - else if (playerAttack.ClassName == "Рыцарь") + else { Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и наносит урон {playerAttack.Strength} противнику ({playerDefend.ClassName}) {playerDefend.Name}"); - } else if (playerAttack.ClassName == "Лучник") + } + } + else if (playerAttack.ClassName == "Воин") + { + if (playerAttack.Abilities[randomUlt].AbilityName == "Удар возмездия") { - Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и поджигает противника ({playerDefend.ClassName}) {playerDefend.Name}"); - } else if (playerAttack.ClassName == "Огненный маг") + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и наносит урон {playerAttack.Strength} противнику ({playerDefend.ClassName}) {playerDefend.Name}"); + } + else { - if (playerAttack.Abilities[randomUlt].AbilityName == "Заворожение") - { - Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) на противника ({playerDefend.ClassName}) {playerDefend.Name}"); - } - else - { - Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и наносит урон {playerAttack.Strength} противнику ({playerDefend.ClassName}) {playerDefend.Name}"); - } + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) на противника ({playerDefend.ClassName}) {playerDefend.Name}"); } - else if (playerAttack.ClassName == "Воин") + } + else if (playerAttack.ClassName == "Стрелок") + { + if (playerAttack.Abilities[randomUlt].AbilityName == "Огненные стрелы") { - if (playerAttack.Abilities[randomUlt].AbilityName == "Удар возмездия") - { - Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и наносит урон {playerAttack.Strength} противнику ({playerDefend.ClassName}) {playerDefend.Name}"); - } - else - { - Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) на противника ({playerDefend.ClassName}) {playerDefend.Name}"); - } + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и поджигает противника ({playerDefend.ClassName}) {playerDefend.Name}"); } - else if (playerAttack.ClassName == "Стрелок") + else { - if (playerAttack.Abilities[randomUlt].AbilityName == "Огненные стрелы") - { - Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) и поджигает противника ({playerDefend.ClassName}) {playerDefend.Name}"); - } - else - { - Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) на противника ({playerDefend.ClassName}) {playerDefend.Name}"); - } + Console.WriteLine($"({playerAttack.ClassName}) {playerAttack.Name} использует ({playerAttack.Abilities[randomUlt].AbilityName}) на противника ({playerDefend.ClassName}) {playerDefend.Name}"); } } + } - public void PrintEffect(IPlayer player) + public void PrintEffect(IPlayer player) + { + foreach (var effect in player.MyEffects) { - foreach (var effect in player.MyEffects) + if (effect is Stun) { - if (effect is Stun) - { - Console.WriteLine($"({player.ClassName}) {player.Name} пропускает ход!"); - } - - if (effect is LongDamage longDamage) - { - Console.WriteLine($"({player.ClassName}) {player.Name} получает урон {longDamage.Factor}"); - } + Console.WriteLine($"({player.ClassName}) {player.Name} пропускает ход!"); } + if (effect is LongDamage longDamage) + { + Console.WriteLine($"({player.ClassName}) {player.Name} получает урон {longDamage.Factor}"); + } } + } - public void PrintDefeat(IPlayer loser) - { - Console.WriteLine($"({loser.ClassName}) {loser.Name} погибает! \n\n"); - } + public void PrintDefeat(IPlayer loser) + { + Console.WriteLine($"({loser.ClassName}) {loser.Name} погибает! \n\n"); + } - public void PrintEnd(IPlayer winner) - { - Console.WriteLine($"({winner.ClassName}) {winner.Name} побеждает! \nThe END..."); - } - } + public void PrintEnd(IPlayer winner) + { + Console.WriteLine($"({winner.ClassName}) {winner.Name} побеждает! \nThe END..."); + } } } diff --git a/CourseApp/Logger/ILogger.cs b/CourseApp/Logger/ILogger.cs index 1331b74..7b7bf7e 100644 --- a/CourseApp/Logger/ILogger.cs +++ b/CourseApp/Logger/ILogger.cs @@ -1,24 +1,35 @@ -namespace CourseApp +namespace CourseApp.Logger { - namespace Logger + using CourseApp.Players; + + public interface ILogger { - using Players; - public interface ILogger - { - void PrintStart(); - void PrintStartSelectHero(); - void PrintSelectHero(); - void PrintWrongNumber(); - void PrintAddAbility(int heroChoice); - void PrintStartNumberPlayers(); - void PrintNumberPlayers(); - void PrintTour(int numberTour); - void PrintEnd(IPlayer winner); - void PrintVersus(IPlayer firstPlayer, IPlayer secondPlayer); - void PrintAttack(IPlayer playerAttack, IPlayer playerDefend); - void PrintUltimate(IPlayer playerAttack, IPlayer playerDefend, int randomUlt); - void PrintEffect(IPlayer player); - void PrintDefeat(IPlayer loser); - } + void PrintStart(); + + void PrintStartSelectHero(); + + void PrintSelectHero(); + + void PrintWrongNumber(); + + void PrintAddAbility(int heroChoice); + + void PrintStartNumberPlayers(); + + void PrintNumberPlayers(); + + void PrintTour(int numberTour); + + void PrintEnd(IPlayer winner); + + void PrintVersus(IPlayer firstPlayer, IPlayer secondPlayer); + + void PrintAttack(IPlayer playerAttack, IPlayer playerDefend); + + void PrintUltimate(IPlayer playerAttack, IPlayer playerDefend, int randomUlt); + + void PrintEffect(IPlayer player); + + void PrintDefeat(IPlayer loser); } } diff --git a/CourseApp/Main/Fight.cs b/CourseApp/Main/Fight.cs index 0b70238..059db02 100644 --- a/CourseApp/Main/Fight.cs +++ b/CourseApp/Main/Fight.cs @@ -1,124 +1,124 @@ -namespace CourseApp +namespace CourseApp.Fight { - namespace Fight - { - using Players; - using Logger; - using Effects; - using System.Collections.Generic; - using System; + using System; + using System.Collections.Generic; + using CourseApp.Effects; + using CourseApp.Logger; + using CourseApp.Players; - public class Fight + public class Fight + { + public Fight(IPlayer firstPlayer, IPlayer secondPlayer, ref List allPlayers, ILogger logger) { - private ILogger Logger { get; set; } - private IPlayer FirstPlayer { get; set; } - private IPlayer SecondPlayer { get; set; } - private int round { get; set; } = 1; - List AllPlayers { get; set; } + FirstPlayer = firstPlayer; + SecondPlayer = secondPlayer; + AllPlayers = allPlayers; + Logger = logger; + } - public Fight(IPlayer firstPlayer, IPlayer secondPlayer, ref List allPlayers, ILogger logger) - { - FirstPlayer = firstPlayer; - SecondPlayer = secondPlayer; - AllPlayers = allPlayers; - Logger = logger; - } + private ILogger Logger { get; set; } - public void Battle() - { - bool stopGame; + private IPlayer FirstPlayer { get; set; } - Logger.PrintVersus(FirstPlayer, SecondPlayer); + private IPlayer SecondPlayer { get; set; } - while (true) - { + private int Round { get; set; } = 1; - stopGame = PlayerTurn(FirstPlayer, SecondPlayer, 1); + private List AllPlayers { get; set; } - if (stopGame) - { - break; - } + public void Battle() + { + bool stopGame; - stopGame = PlayerTurn(SecondPlayer, FirstPlayer, 2); + Logger.PrintVersus(FirstPlayer, SecondPlayer); - if (stopGame) - { - break; - } + while (true) + { + stopGame = PlayerTurn(FirstPlayer, SecondPlayer, 1); - round++; + if (stopGame) + { + break; + } + + stopGame = PlayerTurn(SecondPlayer, FirstPlayer, 2); + + if (stopGame) + { + break; } + + Round++; } + } - private bool PlayerTurn(IPlayer playerGame, IPlayer playerWait, int numberPlayer) - { - Random rand = new Random(); - bool stopGame = false; - bool isStun = false; + private bool PlayerTurn(IPlayer playerGame, IPlayer playerWait, int numberPlayer) + { + Random rand = new Random(); + bool stopGame = false; + bool isStun = false; - playerGame.DeleteEffect(playerGame, round, numberPlayer); - playerGame.Effect(playerGame); - Logger.PrintEffect(playerGame); + playerGame.DeleteEffect(playerGame, Round, numberPlayer); + playerGame.Effect(playerGame); + Logger.PrintEffect(playerGame); - if (IsDefeat(playerGame, playerWait)) + if (IsDefeat(playerGame, playerWait)) + { + stopGame = true; + return stopGame; + } + + foreach (var effect in playerGame.MyEffects) + { + if (effect is Stun) { - stopGame = true; - return stopGame; + isStun = true; } + } - foreach (var effect in playerGame.MyEffects) + if (!isStun) + { + if (rand.Next(0, 3) > 0) { - if (effect is Stun) - { - isStun = true; - } + playerGame.AttackEnemy(playerWait); + Logger.PrintAttack(playerGame, playerWait); } - - if (!isStun) + else { - if (rand.Next(0, 3) > 0) + playerGame.EnterCurrentAbility(); + if (playerGame.CanUltimate()) { - playerGame.AttackEnemy(playerWait); - Logger.PrintAttack(playerGame, playerWait); + int randomUlt = playerGame.Ultimate(playerGame, playerWait, Round); + Logger.PrintUltimate(playerGame, playerWait, randomUlt); } else { - playerGame.EnterCurrentAbility(); - if (playerGame.CanUltimate()) - { - int randomUlt = playerGame.Ultimate(playerGame, playerWait, round); - Logger.PrintUltimate(playerGame, playerWait, randomUlt); - } - else - { - playerGame.AttackEnemy(playerWait); - Logger.PrintAttack(playerGame, playerWait); - } + playerGame.AttackEnemy(playerWait); + Logger.PrintAttack(playerGame, playerWait); } } + } - if (IsDefeat(playerWait, playerGame)) - { - stopGame = true; - return stopGame; - } - + if (IsDefeat(playerWait, playerGame)) + { + stopGame = true; return stopGame; } - private bool IsDefeat(IPlayer loser, IPlayer winner) - { - if (loser.Health <= 0) - { - Logger.PrintDefeat(loser); - AllPlayers.Remove(loser); - winner.RestoreAfterBattle(); - return true; - } + return stopGame; + } - return false; + private bool IsDefeat(IPlayer loser, IPlayer winner) + { + if (loser.Health <= 0) + { + Logger.PrintDefeat(loser); + AllPlayers.Remove(loser); + winner.RestoreAfterBattle(); + return true; } - } + + return false; + } } } diff --git a/CourseApp/Main/Game.cs b/CourseApp/Main/Game.cs index e5e8fe2..f90160a 100644 --- a/CourseApp/Main/Game.cs +++ b/CourseApp/Main/Game.cs @@ -1,99 +1,101 @@ -namespace CourseApp +namespace CourseApp.Base { - namespace Base + using System; + using System.Collections.Generic; + using System.IO; + using System.Text.Json; + using CourseApp.Fight; + using CourseApp.GeneratePlayers; + using CourseApp.Logger; + using CourseApp.PlayerNames; + using CourseApp.Players; + using CourseApp.SelectorGame; + + #nullable enable + + public class Game { - using System.Text.Json; - using Logger; - using SelectorGame; - using GeneratePlayers; - using Players; - using Fight; - using PlayerNames; - using System.Collections.Generic; - using System.IO; - using System; - - #nullable enable - - public class Game + public Game(ILogger gameLogger) { - private ILogger Logger { get; set; } - private int numberTour { get; set; } - private List? playerNames { get; set; } - public Game(ILogger GameLogger) - { - Logger = GameLogger; - numberTour = 1; + Logger = gameLogger; + NumberTour = 1; - const string filepath = @"/home/kiosk/Develop/Tprogramming_2022/CourseApp/Main/Names.json"; - var json = File.ReadAllText(filepath); - playerNames = JsonSerializer.Deserialize>(json); - } - public void Run() - { - Logger.PrintStart(); + const string filepath = @"/home/kiosk/Develop/Tprogramming_2022/CourseApp/Main/Names.json"; - Selector selector = new Selector(Logger); + var json = File.ReadAllText(filepath); + PlayerNames = JsonSerializer.Deserialize>(json); + } - List newClasses = selector.SelectCustomClass(); + private ILogger Logger { get; set; } - int playerNumbers = selector.SelectNumbPlayers(); + private int NumberTour { get; set; } - PlayersGenerator playersGenerator = new PlayersGenerator(playerNumbers, playerNames, newClasses); + private List? PlayerNames { get; set; } - List players = new List(playersGenerator.GeneratePlayersArray()); + public void Run() + { + Logger.PrintStart(); - while (true) - { - Logger.PrintTour(numberTour); - numberTour++; + Selector selector = new Selector(Logger); - Draft(players); - Tour(players); + List newClasses = selector.SelectCustomClass(); - if (EndGame(players)) - { - break; - } - } - } + int playerNumbers = selector.SelectNumbPlayers(); + + PlayersGenerator playersGenerator = new PlayersGenerator(playerNumbers, PlayerNames, newClasses); + + List players = new List(playersGenerator.GeneratePlayersArray()); - public void Draft(List players) + while (true) { - Random random = new Random(); - for (int i = players.Count - 1; i >= 1; i--) + Logger.PrintTour(NumberTour); + NumberTour++; + + Draft(players); + Tour(players); + + if (EndGame(players)) { - int j = random.Next(i + 1); - var temp = players[j]; - players[j] = players[i]; - players[i] = temp; + break; } } + } - public void Tour(List players) + public void Draft(List players) + { + Random random = new Random(); + for (int i = players.Count - 1; i >= 1; i--) { - for (int i = 0; i < players.Count; i++) - { - if (i + 1 < players.Count) - { - Fight fight = new Fight(players[i], players[i+1], ref players, Logger); - fight.Battle(); - } - } + int j = random.Next(i + 1); + var temp = players[j]; + players[j] = players[i]; + players[i] = temp; } + } - public bool EndGame(List players) + public void Tour(List players) + { + for (int i = 0; i < players.Count; i++) { - if (players.Count == 1) - { - Logger.PrintEnd(players[0]); - return true; - } - else + if (i + 1 < players.Count) { - return false; + Fight fight = new Fight(players[i], players[i + 1], ref players, Logger); + fight.Battle(); } } } + + public bool EndGame(List players) + { + if (players.Count == 1) + { + Logger.PrintEnd(players[0]); + return true; + } + else + { + return false; + } + } } } diff --git a/CourseApp/Main/Names.cs b/CourseApp/Main/Names.cs index f829070..b1afcb6 100644 --- a/CourseApp/Main/Names.cs +++ b/CourseApp/Main/Names.cs @@ -1,4 +1,4 @@ -namespace PlayerNames +namespace CourseApp.PlayerNames { public class Names { diff --git a/CourseApp/Main/PlayersGenerator.cs b/CourseApp/Main/PlayersGenerator.cs index 08d0458..15b1777 100644 --- a/CourseApp/Main/PlayersGenerator.cs +++ b/CourseApp/Main/PlayersGenerator.cs @@ -1,91 +1,100 @@ -namespace CourseApp +namespace CourseApp.GeneratePlayers { - namespace GeneratePlayers + using System; + using System.Collections.Generic; + using CourseApp.PlayerNames; + using CourseApp.Players; + + public class PlayersGenerator { - using Players; - using PlayerNames; - using System.Collections.Generic; - using System; + public PlayersGenerator(int playerCount, List names, List newClasses) + { + PlayersCount = playerCount; + PlayerNames = names; + NewClasses = newClasses; + } - public class PlayersGenerator { - private int PlayersCount { get; set; } - private List PlayerNames { get; set; } - private List NewClasses { get; set; } + private int PlayersCount { get; set; } - public PlayersGenerator(int playerCount, List names, List newClasses) { - PlayersCount = playerCount; - PlayerNames = names; - NewClasses = newClasses; - } + private List PlayerNames { get; set; } - public List GeneratePlayersArray() { - var result = new List(); - var rand = new Random(); - for (int i = 0; i < PlayersCount; i++) { - IPlayer player; - var playerName = PlayerNames[rand.Next(PlayerNames.Count)].PlayerName; - var playerStrength = rand.Next(25, 51); - var playerHealth = rand.Next(50, 101); - var playerVariant = rand.Next(0, 3); - switch (playerVariant) { - case 0: - if (NewClasses[1] == true) + private List NewClasses { get; set; } + + public List GeneratePlayersArray() + { + var result = new List(); + var rand = new Random(); + for (int i = 0; i < PlayersCount; i++) + { + IPlayer player; + var playerName = PlayerNames[rand.Next(PlayerNames.Count)].PlayerName; + var playerStrength = rand.Next(25, 51); + var playerHealth = rand.Next(50, 101); + var playerVariant = rand.Next(0, 3); + switch (playerVariant) + { + case 0: + if (NewClasses[1] == true) + { + if (rand.Next(0, 2) > 0) { - if (rand.Next(0, 2) > 0) - { - player = new Knight(playerName, playerStrength, playerHealth, "Рыцарь"); - } - else - { - player = new Knight(playerName, playerStrength, playerHealth, "Воин"); - } + player = new Knight(playerName, playerStrength, playerHealth, "Рыцарь"); } else { - player = new Knight(playerName, playerStrength, playerHealth, "Рыцарь"); + player = new Knight(playerName, playerStrength, playerHealth, "Воин"); } - break; - case 1: - if (NewClasses[0] == true) + } + else + { + player = new Knight(playerName, playerStrength, playerHealth, "Рыцарь"); + } + + break; + case 1: + if (NewClasses[0] == true) + { + if (rand.Next(0, 2) > 0) { - if (rand.Next(0, 2) > 0) - { - player = new Mage(playerName, playerStrength, playerHealth, "Маг"); - } - else - { - player = new Mage(playerName, playerStrength, playerHealth, "Огненный маг"); - } + player = new Mage(playerName, playerStrength, playerHealth, "Маг"); } else { - player = new Mage(playerName, playerStrength, playerHealth, "Маг"); + player = new Mage(playerName, playerStrength, playerHealth, "Огненный маг"); } - break; - case 2: - if (NewClasses[2] == true) + } + else + { + player = new Mage(playerName, playerStrength, playerHealth, "Маг"); + } + + break; + case 2: + if (NewClasses[2] == true) + { + if (rand.Next(0, 2) > 0) { - if (rand.Next(0, 2) > 0) - { - player = new Archer(playerName, playerStrength, playerHealth, "Лучник"); - } - else - { - player = new Archer(playerName, playerStrength, playerHealth, "Стрелок"); - } + player = new Archer(playerName, playerStrength, playerHealth, "Лучник"); } else { - player = new Archer(playerName, playerStrength, playerHealth, "Лучник"); + player = new Archer(playerName, playerStrength, playerHealth, "Стрелок"); } - break; - default: - throw new Exception(); - } - result.Add(player); + } + else + { + player = new Archer(playerName, playerStrength, playerHealth, "Лучник"); + } + + break; + default: + throw new Exception(); } - return result; + + result.Add(player); } - } + + return result; + } } -} \ No newline at end of file +} diff --git a/CourseApp/Main/Selector.cs b/CourseApp/Main/Selector.cs index c718e47..1a65483 100644 --- a/CourseApp/Main/Selector.cs +++ b/CourseApp/Main/Selector.cs @@ -1,103 +1,104 @@ -namespace CourseApp +namespace CourseApp.SelectorGame { - namespace SelectorGame - { - using System; - using System.Collections.Generic; - using Logger; + using System; + using System.Collections.Generic; + using CourseApp.Logger; - #nullable enable + #nullable enable - public class Selector + public class Selector + { + public Selector(ILogger logger) { - private int ChoiceNewHero { get; set; } - private ILogger Logger { get; set; } - private List NewClasses { get; set; } = new List(); + Logger = logger; + NewClasses.Add(false); + NewClasses.Add(false); + NewClasses.Add(false); + } - public Selector(ILogger logger) - { - Logger = logger; - NewClasses.Add(false); - NewClasses.Add(false); - NewClasses.Add(false); - } + private int ChoiceNewHero { get; set; } - private void IsAddNewClass(string? confirm) - { - if (confirm != "Да") - { - Logger.PrintAddAbility(ChoiceNewHero); - confirm = Console.ReadLine(); + private ILogger Logger { get; set; } - if (confirm == "Да") - { - NewClasses[ChoiceNewHero-1] = true; - confirm = "Нет"; - } - else - { - NewClasses[ChoiceNewHero-1] = false; - } - } - } + private List NewClasses { get; set; } = new List(); - public List SelectCustomClass() - { - Logger.PrintStartSelectHero(); - string? confirm = "Нет"; + public List SelectCustomClass() + { + Logger.PrintStartSelectHero(); + string? confirm = "Нет"; - while (true) - { - Logger.PrintSelectHero(); + while (true) + { + Logger.PrintSelectHero(); - string? HeroChoice = Console.ReadLine(); + string? heroChoice = Console.ReadLine(); - if (int.TryParse(HeroChoice, out int i) && i < 4) - { - ChoiceNewHero = i; + if (int.TryParse(heroChoice, out int i) && i < 4) + { + ChoiceNewHero = i; - IsAddNewClass(confirm); + IsAddNewClass(confirm); - Logger.PrintStartNumberPlayers(); + Logger.PrintStartNumberPlayers(); - string? answer = Console.ReadLine(); - if (!(String.IsNullOrEmpty(answer))) + string? answer = Console.ReadLine(); + if (!string.IsNullOrEmpty(answer)) + { + if (answer == "Да") { - if (answer == "Да") - { - break; - } + break; } } - else - { - Logger.PrintWrongNumber(); - } } - return NewClasses; + else + { + Logger.PrintWrongNumber(); + } } - public int SelectNumbPlayers() + return NewClasses; + } + + public int SelectNumbPlayers() + { + int playersNumbers; + + while (true) { - int playersNumbers; + Logger.PrintNumberPlayers(); - while (true) + string? numberOfPlayers = Console.ReadLine(); + + if (int.TryParse(numberOfPlayers, out int i) && (i % 2 == 0)) + { + playersNumbers = i; + break; + } + else { - Logger.PrintNumberPlayers(); + Logger.PrintWrongNumber(); + } + } - string? numberOfPlayers = Console.ReadLine(); + return playersNumbers; + } - if (int.TryParse(numberOfPlayers, out int i) && (i % 2 == 0)) - { - playersNumbers = i; - break; - } - else - { - Logger.PrintWrongNumber(); - } + private void IsAddNewClass(string? confirm) + { + if (confirm != "Да") + { + Logger.PrintAddAbility(ChoiceNewHero); + confirm = Console.ReadLine(); + + if (confirm == "Да") + { + NewClasses[ChoiceNewHero - 1] = true; + confirm = "Нет"; + } + else + { + NewClasses[ChoiceNewHero - 1] = false; } - return playersNumbers; } } } diff --git a/CourseApp/Program.cs b/CourseApp/Program.cs index 309b21a..0c5e1a1 100644 --- a/CourseApp/Program.cs +++ b/CourseApp/Program.cs @@ -1,15 +1,13 @@ -namespace CourseApp +namespace CourseApp.Base { - namespace Base + using CourseApp.Logger; + + public class Program { - using Logger; - public class Program + public static void Main(string[] args) { - public static void Main(string[] args) - { - Game game = new Game(new GameLogger()); - game.Run(); - } + Game game = new Game(new GameLogger()); + game.Run(); } } } \ No newline at end of file