diff --git a/.gitignore b/.gitignore index 24cb440..35d4ccd 100644 --- a/.gitignore +++ b/.gitignore @@ -198,6 +198,7 @@ $RECYCLE.BIN/ **/node_modules/* # Added by Jskonst +.vscode/ Properties/ ##### diff --git a/CourseApp.Tests/DemoTest.cs b/CourseApp.Tests/DemoTest.cs index 52c0aa3..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 TestMyFunctionZeros() - { - var res = Program.Formula(0.0, 0.0); - Assert.Equal(double.NaN, res); - } - - [Fact] - public void TestTaskB() - { - List x = new List { 1.84, 4.05, 3.67, 2.18, 1.17 }; - List res = Program.TaskB(1.6, x); - List expy = new List { 3.691061372588238, 1392.8345934281351, 350.7785466064311, 6.25933353327923, 2.622414465082322 }; - for (int i = 0; i < 5; i++) - { - Assert.Equal(expy[i], res[i], 3); - } - } - - [Fact] - public void TestTaskA() - { - double a = 1.6; - double xn = 1.2; - double xk = 3.7; - double dx = 0.5; - List res = Program.TaskA(a, xn, xk, dx); - List expy = new List { 2.58628588710697, 3.15454831838707, 6.49450906742811, 19.428489457705, 76.9595290357977 }; - for (int i = 0; i < 5; i++) - { - Assert.Equal(expy[i], res[i], 3); - } - } - - [Fact] - public void XnMoreThanXkAndUncorrectDx() - { - List res = Program.TaskA(1.6, 3.7, 1.2, 0.7); - Assert.Equal(res, new List()); - } } } diff --git a/CourseApp.Tests/PersonTest.cs b/CourseApp.Tests/PersonTest.cs deleted file mode 100644 index bc89213..0000000 --- a/CourseApp.Tests/PersonTest.cs +++ /dev/null @@ -1,78 +0,0 @@ -using System; -using Xunit; - -namespace CourseApp.Tests -{ - public class PersonTest - { - [Fact] - public void TestConstructor() - { - var item = new Person(); - Assert.Equal(18, item.Age); - Assert.Equal("Name", item.Name); - Assert.Equal("LastName", item.LastName); - } - - [Fact] - public void TestSetAge() - { - var item = new Person(); - item.Age = 30; - Assert.Equal(30, item.Age); - } - - [Fact] - public void TestIncorrectSetAge() - { - try - { - var item = new Person(); - item.Age = -1000; - } - catch (System.Exception) - { - Console.WriteLine("Age should be more 0 and less than 100"); - Assert.True(true); - } - } - - [Fact] - public void TestCorrectIncorrectSetAge() - { - var item = new Person(); - item.Age = 27; - try - { - item.Age = -1; - } - catch - { - Assert.Equal(27, item.Age); - return; - } - - Assert.Equal(27, item.Age); - } - - [Fact] - public void TestIncorrectSetString() - { - var item = new Person(); - item.Name = string.Empty; - item.LastName = string.Empty; - Assert.Equal(string.Empty, item.Name); - Assert.Equal(string.Empty, item.LastName); - } - - [Fact] - public void TestCorrectSetString() - { - var item = new Person(); - item.Name = "VikiVik"; - item.LastName = "Moro"; - Assert.Equal("VikiVik", item.Name); - Assert.Equal("Moro", item.LastName); - } - } -} diff --git a/CourseApp/Person.cs b/CourseApp/Person.cs deleted file mode 100644 index e069e53..0000000 --- a/CourseApp/Person.cs +++ /dev/null @@ -1,61 +0,0 @@ -using System; - -namespace CourseApp -{ - public class Person - { - private int age; - - public Person() - : this("Name") - { - } - - public Person(string name) - : this(name, "LastName") - { - } - - public Person(string name, string lastname) - : this(name, lastname, 18) - { - } - - public Person(string name, string lastname, int age) - { - this.Name = name; - this.LastName = lastname; - this.age = age; - } - - public int Age - { - get - { - return this.age; - } - - set - { - if (value >= 0 && value < 100) - { - this.age = value; - } - else - { - throw new System.Exception("Age should be more 0 and less than 100"); - } - } - } - - public string Name { get; set; } - - public string LastName { get; set; } - - public override string ToString() - { - string s = $"Hi. I am {Name} {LastName}. I am {Age} years old."; - return s; - } - } -} \ No newline at end of file diff --git a/CourseApp/Program.cs b/CourseApp/Program.cs index ac6d37a..03d3ca1 100644 --- a/CourseApp/Program.cs +++ b/CourseApp/Program.cs @@ -5,69 +5,8 @@ namespace CourseApp { public class Program { - public static double Formula(double a, double x) - { - var y = Math.Pow(a, Math.Pow(x, 2) - 1) - Math.Log10(Math.Pow(x, 2) - 1) + Math.Pow(Math.Sqrt(Math.Pow(x, 2) - 1), 1 / 3); - 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 (double x = xn; x < xk; x += dx) - { - y.Add(Formula(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(Formula(a, x[i])); - } - - return y; - } - public static void Main(string[] args) { - const double a = 1.6; - const double xn = 1.2; - const double xk = 3.7; - const double dx = 0.5; - Console.WriteLine("Task А:"); - foreach (var item in TaskA(a, xn, xk, dx)) - { - Console.WriteLine($"y = {item}"); - } - - Console.WriteLine("Task B:"); - List x = new List { 1.28, 1.36, 2.47, 3.68, 4.56 }; - foreach (var item in TaskB(a, x)) - { - Console.WriteLine($"y = {item}"); - } - - Person[] people = new Person[2]; - people[0] = new Person("Sasha", "Smirnov", 25); - people[1] = new Person("Polina", "Suvorova", 22); - foreach (var item in people) - { - Console.WriteLine(item); - } - - Console.ReadLine(); } } } 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 +}