diff --git a/CourseApp.Tests/DemoTest.cs b/CourseApp.Tests/DemoTest.cs index 8dbd86d..157a469 100644 --- a/CourseApp.Tests/DemoTest.cs +++ b/CourseApp.Tests/DemoTest.cs @@ -11,46 +11,5 @@ public void Test1() { Assert.True(true); } - - [Fact] - public void TestNullMass() - { - var res = Program.MyFunction(0.0, 0.0); - Assert.Equal(double.PositiveInfinity, res); - } - - [Fact] - public void TaskBWork() - { - List arr = new List { 1.02, 1.21, 1.5, 2.3, 2.71 }; - List resB = Program.TaskB(2.0, arr); - List exp = new List { 0.02526278072091896, 0.02489759880547166, 0.024164084643521107, 0.021702665452373534, 0.020418098612637083 }; - for (int i = 0; i < 5; i++) - { - Assert.Equal(exp[i], resB[i], 3); - } - } - - [Fact] - public void TaskAWork() - { - double a = 2.0; - double xn = 1.2; - double xk = 4.2; - double dx = 0.6; - List resA = Program.TaskA(a, xn, xk, dx); - List exp = new List { 0.025, 0.023, 0.021, 0.02, 0.018 }; - for (int i = 0; i < resA.Count; i++) - { - Assert.Equal(exp[i], resA[i], 3); - } - } - - [Fact] - public void XnMoreThanXkAndUncorrectDx() - { - List res = Program.TaskA(2.0, 4.2, 1.2, 0.7); - Assert.Equal(res, new List()); - } } } diff --git a/CourseApp/Program.cs b/CourseApp/Program.cs index afa3891..7b5e66f 100644 --- a/CourseApp/Program.cs +++ b/CourseApp/Program.cs @@ -5,74 +5,8 @@ namespace CourseApp { public class Program { - public static double MyFunction(double a, double x) - { - var y = Math.Pow(Math.Log10(a + x), 2) / Math.Pow(a + x, 2); - return y; - } - - public static List TaskA(double a, double xn, double xk, double dx) - { - if (xk < xn) - { - return new List(); - } - else - { - List y = new List((int)((xk - xn) / dx)); - for (var x = xn; x < xk; x += dx) - { - y.Add(MyFunction(a, x)); - } - - return y; - } - } - - public static List TaskB(double a, List x) - { - List y = new List(); - - for (var i = 0; i < x.Count; i++) - { - y.Add(MyFunction(a, x[i])); - } - - return y; - } - public static void Main(string[] args) { - const double a = 2.0; - const double xn = 1.2; - const double xk = 4.2; - const double dx = 0.6; - Console.WriteLine("Task A:"); - foreach (var item in TaskA(a, xn, xk, dx)) - { - Console.WriteLine($"y = {item}"); - } - - List x = new List { 1.16, 1.32, 1.47, 1.65, 1.93 }; - Console.WriteLine("Task B:"); - foreach (var item in TaskB(a, x)) - { - Console.WriteLine($"y = {item}"); - } - - Console.WriteLine(); - - Animal[] masss = new Animal[2]; - masss[0] = new Mouse("Larisa", 2, false, true); - masss[1] = new Cat("Kyza", 7, true, true); - foreach (var item in masss) - { - Console.WriteLine(item.ToString()); - Console.WriteLine(item.Voice()); - Console.WriteLine(); - } - - Console.ReadLine(); } } } \ No newline at end of file diff --git a/RPG.Tests/RPG.Tests.csproj b/RPG.Tests/RPG.Tests.csproj new file mode 100644 index 0000000..c278cda --- /dev/null +++ b/RPG.Tests/RPG.Tests.csproj @@ -0,0 +1,30 @@ + + + + netcoreapp3.0 + True + 1573,1591,1701;1702;1705 + false + + + + + + + + + + + + + + + ../_stylecop/stylecop.ruleset + true + + + + + + + diff --git a/RPG.Tests/RPGTests.cs b/RPG.Tests/RPGTests.cs new file mode 100644 index 0000000..92884bb --- /dev/null +++ b/RPG.Tests/RPGTests.cs @@ -0,0 +1,103 @@ +using System; +using Xunit; +using RPG; + +namespace RPG.Tests +{ + public class RPGTests + { + [Fact] + public void CreationTest() + { + Player knight = new Knight(); + Player archer = new Archer(); + Player wizard = new Wizard(); + + if (knight.Health > 0 && knight.Strength > 0 && archer.Health > 0 && archer.Strength > 0 && wizard.Health > 0 && wizard.Strength > 0) + { + Assert.True(true); + } + } + + [Fact] + public void KnightSkillsTest() + { + Player knight = new Knight(); + + int damage; + string skillName; + + knight.Skill(out skillName, out damage); + + if ((skillName == "Удар возмездия" || skillName == "Буря клинков" || skillName == "Удар смерти") && damage > 0) + { + Assert.True(true); + } + } + + [Fact] + public void ArcherSkillsTest() + { + Player archer = new Archer(); + + int damage; + string skillName; + + archer.Skill(out skillName, out damage); + + if (skillName == "Огненные стрелы" && archer.buff && damage == 0) + { + Assert.True(true); + } + else if ((skillName == "Стрела правосудия" || skillName == "Шквал стрел") && damage > 0) + { + Assert.True(true); + } + } + + [Fact] + public void WizardSkillsTest() + { + Player wizard = new Wizard(); + + int damage; + string skillName; + + wizard.Skill(out skillName, out damage); + + if (skillName == "Заворожение" && wizard.sleepTime > 0 && damage == 0) + { + Assert.True(true); + } + else if (skillName == "Огненный шар" && damage > 0) + { + Assert.True(true); + } + } + + [Fact] + public void GetDamageTest() + { + Player wizard = new Wizard(); + + int health = wizard.GetDamage(30); + + Assert.Equal(wizard.maxHealth - 30, health); + } + + [Fact] + public void AtackTest() + { + Player archer = new Archer(); + + int damage; + + archer.Atack(out damage); + + if (damage > 0) + { + Assert.True(true); + } + } + } +} \ No newline at end of file diff --git a/RPG/Archer.cs b/RPG/Archer.cs new file mode 100644 index 0000000..e91ea39 --- /dev/null +++ b/RPG/Archer.cs @@ -0,0 +1,63 @@ +using System; + +namespace RPG +{ + public class Archer : Player + { + public Archer() + : base() + { + typeClass = "Лучник"; + skills = new string[] { "Огненные стрелы", "Шквал стрел", "Стрела правосудия" }; + } + + public override void Skill(out string skillName, out int damage) + { + int probability = random.Next(0, 100); + if (!buff) + { + if (probability <= 20) + { + skillName = "Стрела правосудия"; + } + else if (probability <= 90) + { + skillName = "Огненные стрелы"; + } + else + { + skillName = "Шквал стрел"; + } + } + else + { + if (probability <= 70) + { + skillName = "Стрела правосудия"; + } + else + { + skillName = "Шквал стрел"; + } + } + + switch (skillName) + { + case "Стрела правосудия": + damage = (int)(Strength * 1.5); + break; + case "Шквал стрел": + damage = (int)(Strength * 2.5); + break; + case "Огненные стрелы": + buffName = "Огненные стрелы"; + buff = true; + damage = 0; + break; + default: + damage = 0; + break; + } + } + } +} \ No newline at end of file diff --git a/RPG/Game.cs b/RPG/Game.cs new file mode 100644 index 0000000..d5efdd3 --- /dev/null +++ b/RPG/Game.cs @@ -0,0 +1,170 @@ +using System; +using System.Collections.Generic; + +namespace RPG +{ + public class Game + { + List Players = new List(); + Logger logger = new Logger(); + Random random = new Random(); + Player Player1; + Player Player2; + int counter = 0; + + public void Start(int numOfPlayers) + { + CreatePlayers(numOfPlayers); + while (Players.Count > 1) + { + Fight(); + } + + Console.WriteLine($"\nПобедитель: {Players[0].typeClass} {Players[0].Name}\n"); + } + + public void CreatePlayers(int numOfPlayers) + { + while (numOfPlayers > 0) + { + switch (random.Next(0, 3)) + { + case 0: + Players.Add(new Archer()); + break; + case 1: + Players.Add(new Knight()); + break; + case 2: + Players.Add(new Wizard()); + break; + default: + Players.Add(new Wizard()); + break; + } + + numOfPlayers--; + } + } + + public void Atack(Player Player1, Player Player2) + { + int damage; + + if (Player1.buff) + { + Player1.Atack(out damage); + logger.Atack(Player1, Player2, damage); + Player2.GetDamage(damage + 5); + } + else + { + Player1.Atack(out damage); + logger.Atack(Player1, Player2, damage); + Player2.GetDamage(damage); + } + } + + public void UseSkill(Player Player1, Player Player2) + { + int damage; + string skillName; + + if (Player1.buff) + { + Player1.Skill(out skillName, out damage); + logger.Skill(Player1, Player2, skillName, damage); + Player2.GetDamage(damage + 5); + } + else + { + Player1.Skill(out skillName, out damage); + logger.Skill(Player1, Player2, skillName, damage); + Player2.GetDamage(damage); + } + } + + public void Fight() + { + int i = random.Next(0, Players.Count - 1); + Player1 = Players[i]; + Players.RemoveAt(i); + + i = random.Next(0, Players.Count); + Player2 = Players[i]; + Players.RemoveAt(i); + + int turn = random.Next(0, 1); + counter++; + Console.WriteLine("\n/////////////"); + Console.WriteLine($"{counter} бой"); + Console.WriteLine("/////////////\n"); + + while (true) + { + if (turn == 0) + { + if (Player2.sleepTime == 0) + { + if (random.Next(0, 10) > 6) + { + UseSkill(Player1, Player2); + } + else + { + Atack(Player1, Player2); + } + } + else + { + logger.Sleep(Player1); + Player2.sleepTime--; + } + + if (Player2.Health <= 0) + { + Player1.sleepTime = 0; + Player1.buff = false; + Players.Add(Player1); + logger.Winner(Player1); + logger.Death(Player2); + break; + } + + turn = 1; + } + else + { + if (Player1.sleepTime == 0) + { + if (random.Next(0, 10) > 6) + { + UseSkill(Player2, Player1); + } + else + { + Atack(Player2, Player1); + } + } + else + { + logger.Sleep(Player2); + Player1.sleepTime--; + } + + if (Player1.Health <= 0) + { + Player2.sleepTime = 0; + Player2.buff = false; + Players.Add(Player2); + logger.Winner(Player2); + logger.Death(Player1); + break; + } + + turn = 0; + } + } + } + } +} \ No newline at end of file diff --git a/RPG/Knight.cs b/RPG/Knight.cs new file mode 100644 index 0000000..2906156 --- /dev/null +++ b/RPG/Knight.cs @@ -0,0 +1,48 @@ +using System; + +namespace RPG +{ + public class Knight : Player + { + public Knight() + : base() + { + typeClass = "Рыцарь"; + skills = new string[] { "Удар возмездия", "Буря клинков", "Удар смерти" }; + } + + public override void Skill(out string skillName, out int damage) + { + int probability = random.Next(0, 100); + if (probability <= 20) + { + skillName = "Удар возмездия"; + } + else if (probability <= 90) + { + skillName = "Буря клинков"; + } + else + { + skillName = "Удар смерти"; + } + + switch (skillName) + { + case "Удар возмездия": + damage = (int)Math.Floor(Strength * 1.5); + break; + case "Буря клинков": + damage = (int)Math.Floor(Strength * 1.3); + break; + case "Удар смерти": + sleepTime = 3; + damage = (int)Math.Floor(Strength * 2.5); + break; + default: + damage = 0; + break; + } + } + } +} \ No newline at end of file diff --git a/RPG/Logger.cs b/RPG/Logger.cs new file mode 100644 index 0000000..90020f8 --- /dev/null +++ b/RPG/Logger.cs @@ -0,0 +1,76 @@ +using System; + +namespace RPG +{ + class Logger + { + public void Atack(Player Player1, Player Player2, int damage) + { + if (Player1.typeClass == "Рыцарь") + { + Console.Write($"{Player1.typeClass} {Player1.Name} ({Player1.Health} из {Player1.maxHealth} hp) ударил мечом {Player2.typeClass} {Player2.Name} ({Player2.Health} из {Player2.maxHealth} hp) и нанёс {damage} урона."); + } + else if (Player1.typeClass == "Лучник") + { + Console.Write($"{Player1.typeClass} {Player1.Name} ({Player1.Health} из {Player1.maxHealth} hp) выстрелил в {Player2.typeClass} {Player2.Name} ({Player2.Health} из {Player2.maxHealth} hp) и нанёс {damage} урона."); + } + else + { + Console.Write($"{Player1.typeClass} {Player1.Name} ({Player1.Health} из {Player1.maxHealth} hp) ударил посохом {Player2.typeClass} {Player2.Name} ({Player2.Health} из {Player2.maxHealth} hp) и нанёс {damage} урона."); + } + + if (Player1.buff) + { + Console.WriteLine($" Дополнительный урон 5 единиц из-за усиления \"{Player1.buffName}\"."); + } + else + { + Console.WriteLine(); + } + } + + public void Skill(Player Player1, Player Player2, string skillName, int damage) + { + if (Player1.sleepTime > 0 && damage == 0) + { + Console.WriteLine($"{Player1.typeClass} {Player1.Name} ({Player1.Health} из {Player1.maxHealth} hp) использует умение \"{skillName}\" и оглушает {Player2.typeClass} {Player2.Name} ({Player2.Health} из {Player2.maxHealth} hp) на {Player1.sleepTime} хода."); + } + else if (Player1.sleepTime > 1) + { + Console.WriteLine($"{Player1.typeClass} {Player1.Name} ({Player1.Health} из {Player1.maxHealth} hp) использовал(-a) умение \"{skillName}\" и нанес(-ла) {Player2.typeClass} {Player2.Name} {damage} урона. {Player2.typeClass} {Player2.Name} ({Player2.Health} из {Player2.maxHealth} hp) оглушен(-а) на {Player1.sleepTime} ход(-а)."); + } + else if (Player1.buff && damage == 0) + { + Console.WriteLine($"{Player1.typeClass} {Player1.Name} ({Player1.Health} из {Player1.maxHealth} hp) активировал усиление \"{skillName}\""); + } + else + { + Console.Write($"{Player1.typeClass} {Player1.Name} ({Player1.Health} из {Player1.maxHealth} hp) использовал(-a) умение \"{skillName}\" и нанес(-ла) {Player2.typeClass} {Player2.Name} ({Player2.Health} из {Player2.maxHealth} hp) {damage} урона."); + + if (Player1.buff) + { + Console.WriteLine($" Дополнительный урон 5 единиц из-за усиления \"{Player1.buffName}\"."); + } + else + { + Console.WriteLine(); + } + } + } + + public void Sleep(Player Player) + { + Console.WriteLine($"{Player.typeClass} {Player.Name} ({Player.Health} из {Player.maxHealth} hp) оглушен(-а) и пропускает ход."); + } + + public void Winner(Player Player) + { + Console.WriteLine($"{Player.typeClass} {Player.Name} ({Player.Health} из {Player.maxHealth} hp) победил(-а)!"); + } + + public void Death(Player Player) + { + Console.WriteLine($"{Player.typeClass} {Player.Name} погибает"); + } + } +} \ No newline at end of file diff --git a/RPG/Player.cs b/RPG/Player.cs new file mode 100644 index 0000000..c9223be --- /dev/null +++ b/RPG/Player.cs @@ -0,0 +1,49 @@ +using System; + +namespace RPG +{ + public abstract class Player + { + public string typeClass; + public string[] skills; + public string skillName; + public bool buff = false; + public string buffName; + public int sleepTime = 0; + public int maxHealth; + protected static readonly Random random = new Random(); + + public Player() + { + Health = random.Next(50, 100); + maxHealth = Health; + Name = Names[random.Next(0, 9)]; + Strength = random.Next(10, 30); + } + + public static string[] Names = { "Akuma", "Geki", "Retsy", "Balrog", "Vaiper", "Juli", "Set", "Fei Long", "Xokyto", "Ingrid" }; + + public string Name { get; protected set; } + + public int Strength { get; protected set; } + + public int Health { get; set; } + + public virtual void Skill(out string skillName, out int damage) + { + skillName = ""; + damage = 0; + } + + public void Atack(out int damage) + { + damage = random.Next(1, Strength); + } + + public int GetDamage(int damage) + { + Health -= damage; + return Health; + } + } +} diff --git a/RPG/Prog.cs b/RPG/Prog.cs new file mode 100644 index 0000000..5502b6e --- /dev/null +++ b/RPG/Prog.cs @@ -0,0 +1,23 @@ +using System; +namespace RPG +{ + public class Prog + { + public static void Main(string[] args) + { + Game game = new Game(); + Console.Write("Введите число героев: "); + + int numOfHeroes = Int32.Parse(Console.ReadLine()); + + if (numOfHeroes % 2 != 0) + { + numOfHeroes += 1; + } + + game.Start(numOfHeroes); + + Console.ReadKey(); + } + } +} \ No newline at end of file diff --git a/RPG/Program.cs b/RPG/Program.cs new file mode 100644 index 0000000..d3fcea7 --- /dev/null +++ b/RPG/Program.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace RPG +{ + class Program + { + static void Main(string[] args) + { + Game game = new Game(); + Console.Write("Введите число игроков: "); + + int numOfPlayers = Int32.Parse(Console.ReadLine()); + + if (numOfPlayers % 2 != 0) + { + numOfPlayers += 1; + } + + game.Start(numOfPlayers); + + Console.ReadKey(); + } + } +} \ No newline at end of file diff --git a/RPG/RPG.csproj b/RPG/RPG.csproj new file mode 100644 index 0000000..7f29fcb --- /dev/null +++ b/RPG/RPG.csproj @@ -0,0 +1,14 @@ + + + + Exe + netcoreapp3.0 + True + 1573,1591,1701;1702;1705; + + + + RPG.Prog + + + diff --git a/RPG/Wizard.cs b/RPG/Wizard.cs new file mode 100644 index 0000000..feee86c --- /dev/null +++ b/RPG/Wizard.cs @@ -0,0 +1,41 @@ +using System; + +namespace RPG +{ + public class Wizard : Player + { + public Wizard() + : base() + { + typeClass = "Маг"; + skills = new string[] { "Заворожение", "Огненный шар" }; + } + + public override void Skill(out string skillName, out int damage) + { + int probability = random.Next(0, 100); + if (probability <= 60 && sleepTime == 0) + { + skillName = "Заворожение"; + } + else + { + skillName = "Огненный шар"; + } + + switch (skillName) + { + case "Заворожение": + sleepTime = 2; + damage = 0; + break; + case "Огненный шар": + damage = (int)Math.Floor(Strength * 2.5); + break; + default: + damage = 0; + break; + } + } + } +} \ No newline at end of file diff --git a/courseworkspace.code-workspace b/courseworkspace.code-workspace index 4f9af01..8c996fa 100644 --- a/courseworkspace.code-workspace +++ b/courseworkspace.code-workspace @@ -1,4 +1,26 @@ { + + "folders": [ + { + "name": "CourseApp", + "path": "CourseApp" + }, + { + "name": "CourseApp.Tests", + "path": "CourseApp.Tests" + }, + { + "name": "RPG", + "path": "RPG" + }, + { + "name": "RPG.Tests", + "path": "RPG.Tests" + } + ], + "settings": {} +} + "folders": [ { "path": "CourseApp" @@ -8,4 +30,4 @@ } ], "settings": {} -} \ No newline at end of file +}