diff --git a/.github/workflows/dotnetcore.yml b/.github/workflows/dotnetcore.yml index 22cc4eb..792e246 100644 --- a/.github/workflows/dotnetcore.yml +++ b/.github/workflows/dotnetcore.yml @@ -21,3 +21,7 @@ jobs: run: | cd CourseApp.Tests dotnet test + - name: Run tests + run: | + cd RPG + dotnet build --configuration Release \ No newline at end of file diff --git a/CourseApp/CourseApp.sln b/CourseApp/CourseApp.sln index 691a55b..3bde1fe 100644 --- a/CourseApp/CourseApp.sln +++ b/CourseApp/CourseApp.sln @@ -7,6 +7,8 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CourseApp", "CourseApp.cspr EndProject Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CourseApp.Tests", "..\CourseApp.Tests\CourseApp.Tests.csproj", "{6DB5C70B-4945-464C-8E04-247E385443AE}" EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "RPG", "..\RPG\RPG.csproj", "{E8AA026D-43F5-4535-AC82-7E2F3D1AD229}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU @@ -21,6 +23,10 @@ Global {6DB5C70B-4945-464C-8E04-247E385443AE}.Debug|Any CPU.Build.0 = Debug|Any CPU {6DB5C70B-4945-464C-8E04-247E385443AE}.Release|Any CPU.ActiveCfg = Release|Any CPU {6DB5C70B-4945-464C-8E04-247E385443AE}.Release|Any CPU.Build.0 = Release|Any CPU + {E8AA026D-43F5-4535-AC82-7E2F3D1AD229}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E8AA026D-43F5-4535-AC82-7E2F3D1AD229}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E8AA026D-43F5-4535-AC82-7E2F3D1AD229}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E8AA026D-43F5-4535-AC82-7E2F3D1AD229}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/RPG/Archer.cs b/RPG/Archer.cs new file mode 100644 index 0000000..1c38a76 --- /dev/null +++ b/RPG/Archer.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public class Archer : Player + { + public Archer() + : this("Без имени") + { + } + + public Archer(string name) + : base(name) + { + Class = "Лучник"; + Skills.Add(new ArcherSkill()); + } + } +} diff --git a/RPG/ArcherSkill.cs b/RPG/ArcherSkill.cs new file mode 100644 index 0000000..69c82c1 --- /dev/null +++ b/RPG/ArcherSkill.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public class ArcherSkill : IUseSkill + { + private int timeSkillUsed = 0; + + public void UseSkill(Player user) + { + if (timeSkillUsed < 1) + { + user.Opponent.Effects.Add(new FireArrow()); + Logger.LogMessage($"({user.Class}) {user.Name} использует (Огненные стрелы) на ({user.Opponent.Class}) {user.Opponent.Name}."); + timeSkillUsed++; + } + else + { + user.Usingskill = new Attack(); + user.UseSkill(); + } + } + } +} diff --git a/RPG/Attack.cs b/RPG/Attack.cs new file mode 100644 index 0000000..491872d --- /dev/null +++ b/RPG/Attack.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public class Attack : IUseSkill + { + public void UseSkill(Player user) + { + user.Opponent.Hp -= user.Strength; + Logger.LogMessage($"({user.Class}) {user.Name} наносит урон {user.Strength} противнику ({user.Opponent.Class}) {user.Opponent.Name}."); + } + } +} \ No newline at end of file diff --git a/RPG/Battle.cs b/RPG/Battle.cs new file mode 100644 index 0000000..213eb52 --- /dev/null +++ b/RPG/Battle.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public static class Battle + { + public static Player BattlePlayers(Player p) + { + Logger.LogBattle(p); + Random rand = new Random(); + while (p.Hp > 0 && p.Opponent.Hp > 0) + { + int randomSkill1 = rand.Next(0, p.Skills.Count); + int randomSkill2 = rand.Next(0, p.Opponent.Skills.Count); + p.SrabatEffects(); + if (p.IsStunned == false) + { + p.Usingskill = p.Skills[randomSkill1]; + p.UseSkill(); + } + else + { + p.IsStunned = false; + for (int i = 0; i < p.Effects.Count; i++) + { + if (p.Effects[i] is Skip) + { + p.Effects.RemoveAt(i); + i--; + } + } + } + + p.Opponent.SrabatEffects(); + + if (p.Opponent.Hp > 0) + { + if (p.Opponent.IsStunned == false) + { + p.Opponent.Usingskill = p.Opponent.Skills[randomSkill2]; + p.Opponent.UseSkill(); + } + else + { + p.Opponent.IsStunned = false; + for (int i = 0; i < p.Opponent.Effects.Count; i++) + { + if (p.Opponent.Effects[i] is Skip) + { + p.Opponent.Effects.RemoveAt(i); + i--; + } + } + } + } + } + + if (p.Hp < 1) + { + Logger.LogMessage($"({p.Class}) {p.Name} погиб!\n"); + p.Opponent.Hp = rand.Next(1, 100); + p.Opponent.Effects.Clear(); + return p; + } + else if (p.Opponent.Hp < 1) + { + Logger.LogMessage($"({p.Opponent.Class}) {p.Opponent.Name} погиб!\n"); + p.Hp = rand.Next(1, 100); + p.Effects.Clear(); + return p.Opponent; + } + + throw new Exception("Ошибка!!!"); + } + } +} diff --git a/RPG/FireArrow.cs b/RPG/FireArrow.cs new file mode 100644 index 0000000..df3332e --- /dev/null +++ b/RPG/FireArrow.cs @@ -0,0 +1,17 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public class FireArrow : IEffects + { + public const int DamageFireArrow = 2; + + public void Srabat(Player owner) + { + owner.Hp -= DamageFireArrow; + Logger.LogMessage($"({owner.Class}) {owner.Name} получает урон {DamageFireArrow} от эффекта Fire Arrow."); + } + } +} diff --git a/RPG/Game.cs b/RPG/Game.cs new file mode 100644 index 0000000..3e5c73e --- /dev/null +++ b/RPG/Game.cs @@ -0,0 +1,78 @@ +using System; +using System.Collections.Generic; + +namespace RPG +{ + public class Game + { + public static void Main(string[] args) + { + string[] players_names = { "Игрок1", "Игрок2", "Игрок3", "Игрок4", "Игрок5", "Игрок6", "Игрок7", "Игрок8", "Игрок9", "Игрок10", "Игрок11", "Игрок12", "Игрок13", "Игрок14", "Игрок15", "Игрок16" }; + int kol = 0; + try + { + Console.Write($"Введите кол-во игроков(1-16):"); + string nString = Console.ReadLine(); + kol = Convert.ToInt32(nString); + } + catch (System.FormatException) + { + Console.Write($"Введите кол-во игроков(1-16):"); + string nString = Console.ReadLine(); + kol = Convert.ToInt32(nString); + } + + while (kol % 2 != 0 || kol <= 0) + { + Console.Write($"Введите кол-во игроков(1-16):"); + kol = Convert.ToInt32(Console.ReadLine()); + } + + Random rand = new Random(); + List kon_a = new List(); + List kon_b = new List(); + int k = 0; + int kon = 1; + while (kon_a.Count < kol) + { + int r = rand.Next(0, 3); + switch (r) + { + case 0: + kon_a.Add(new Knight(players_names[k])); + break; + case 1: + kon_a.Add(new Archer(players_names[k])); + break; + case 2: + kon_a.Add(new Mage(players_names[k])); + break; + } + + k++; + } + + Logger.LogMessage($"{kon++}-й Кон\n"); + while (kon_a.Count + kon_b.Count > 1) + { + if (kon_a.Count >= 2) + { + Player tempPlayer = Battle.BattlePlayers(kon_a[PickPlayers.PickOp(kon_a)]); + kon_b.Add(tempPlayer.Opponent); + kon_a.Remove(tempPlayer.Opponent); + kon_a[kon_a.IndexOf(tempPlayer)].Opponent.Opponent = null; + kon_a.Remove(tempPlayer); + } + else + { + Logger.LogMessage($"{kon}-й Кон\n"); + kon_a.AddRange(kon_b); + kon_b.Clear(); + kon++; + } + } + + Logger.LogMessage($"({kon_b[0].Class}) {kon_b[0].Name} Победил!!!"); + } + } +} diff --git a/RPG/IEffects.cs b/RPG/IEffects.cs new file mode 100644 index 0000000..6c19a4f --- /dev/null +++ b/RPG/IEffects.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public interface IEffects + { + void Srabat(Player owner); + } +} diff --git a/RPG/IUseSkill.cs b/RPG/IUseSkill.cs new file mode 100644 index 0000000..118db41 --- /dev/null +++ b/RPG/IUseSkill.cs @@ -0,0 +1,11 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public interface IUseSkill + { + void UseSkill(Player user); + } +} diff --git a/RPG/Knight.cs b/RPG/Knight.cs new file mode 100644 index 0000000..1f99d71 --- /dev/null +++ b/RPG/Knight.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public class Knight : Player + { + public Knight() + : this("Без имени") + { + } + + public Knight(string name) + : base(name) + { + Class = "Рыцарь"; + Skills.Add(new KnightSkill()); + } + } +} diff --git a/RPG/KnightSkill.cs b/RPG/KnightSkill.cs new file mode 100644 index 0000000..892b64e --- /dev/null +++ b/RPG/KnightSkill.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public class KnightSkill : IUseSkill + { + public void UseSkill(Player user) + { + user.Opponent.Hp -= user.Strength * 1.3; + Logger.LogMessage($"({user.Class}) {user.Name} использует (Удар возмездия) и наносит урон {user.Strength * 1.3} противнику ({user.Opponent.Class}) {user.Opponent.Name}."); + } + } +} diff --git a/RPG/Logger.cs b/RPG/Logger.cs new file mode 100644 index 0000000..e31ca40 --- /dev/null +++ b/RPG/Logger.cs @@ -0,0 +1,19 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public static class Logger + { + public static void LogBattle(Player player) + { + Console.WriteLine($"{player.Class} {player.Name} vs {player.Opponent.Class} {player.Opponent.Name}."); + } + + public static void LogMessage(string message) + { + Console.WriteLine(message); + } + } +} diff --git a/RPG/Mage.cs b/RPG/Mage.cs new file mode 100644 index 0000000..3368ee0 --- /dev/null +++ b/RPG/Mage.cs @@ -0,0 +1,21 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public class Mage : Player + { + public Mage() + : this("Без имени") + { + } + + public Mage(string name) + : base(name) + { + Class = "Маг"; + Skills.Add(new MageSkill()); + } + } +} diff --git a/RPG/MageSkill.cs b/RPG/MageSkill.cs new file mode 100644 index 0000000..7c12b29 --- /dev/null +++ b/RPG/MageSkill.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public class MageSkill : IUseSkill + { + public void UseSkill(Player user) + { + user.Opponent.Effects.Add(new Skip()); + Logger.LogMessage($"({user.Class}) {user.Name} использует (Заворожение) на ({user.Opponent.Class}) {user.Opponent.Name}."); + } + } +} diff --git a/RPG/PickPlayers.cs b/RPG/PickPlayers.cs new file mode 100644 index 0000000..2acf78b --- /dev/null +++ b/RPG/PickPlayers.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public class PickPlayers + { + public static int PickOp(List kon_x) + { + Random rand = new Random(); + int randPlayer1 = rand.Next(0, kon_x.Count); + int randPlayer2 = rand.Next(0, kon_x.Count); + while (randPlayer1 == randPlayer2) + { + randPlayer2 = rand.Next(0, kon_x.Count); + } + + kon_x[randPlayer1].Opponent = kon_x[randPlayer2]; + kon_x[randPlayer2].Opponent = kon_x[randPlayer1]; + return randPlayer1; + } + } +} diff --git a/RPG/Player.cs b/RPG/Player.cs new file mode 100644 index 0000000..28fa852 --- /dev/null +++ b/RPG/Player.cs @@ -0,0 +1,61 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Text; +using System.Text.RegularExpressions; + +namespace RPG +{ + public abstract class Player + { + private static Random rand = new Random(); + + public Player() + : this("Без имени") + { + } + + public Player(string name) + { + Name = name; + Hp = rand.Next(1, 100); + Strength = rand.Next(1, 99); + Skills = new List(); + Effects = new List(); + Skills.Add(new Attack()); + } + + public string Class { get; protected set; } + + public string Name { get; set; } + + public Player Opponent { get; set; } = null; + + public double Hp { get; set; } + + public int Strength { get; } + + public bool IsStunned { get; set; } + + public IUseSkill Usingskill { get; set; } + + public List Skills { get; set; } + + public List Effects { get; set; } + + public void UseSkill() + { + { + Usingskill.UseSkill(this); + } + } + + public void SrabatEffects() + { + for (int i = 0; i < Effects.Count; i++) + { + Effects[i].Srabat(this); + } + } + } +} diff --git a/RPG/RPG.csproj b/RPG/RPG.csproj new file mode 100644 index 0000000..09097b7 --- /dev/null +++ b/RPG/RPG.csproj @@ -0,0 +1,29 @@ + + + + Exe + + True + 1573,1591,1701;1702;1705; + true + netcoreapp2.1;netstandard2.0 + v2 + true + + + + + + + + ../_stylecop/stylecop.ruleset + true + RPG.Game + + + + + + + + diff --git a/RPG/Skip.cs b/RPG/Skip.cs new file mode 100644 index 0000000..3ded930 --- /dev/null +++ b/RPG/Skip.cs @@ -0,0 +1,15 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace RPG +{ + public class Skip : IEffects + { + public void Srabat(Player owner) + { + owner.IsStunned = true; + Logger.LogMessage($"({owner.Class}) {owner.Name} пропускает ход."); + } + } +} diff --git a/images/png.jpg b/images/png.jpg new file mode 100644 index 0000000..cec61be Binary files /dev/null and b/images/png.jpg differ diff --git a/index.html b/index.html new file mode 100644 index 0000000..1bd7fba --- /dev/null +++ b/index.html @@ -0,0 +1,32 @@ + + + + + Моя страничка + + + +
+
+
Bootstrap - Класс!!!
+ +
+ Фото ИГХТУ +

Герасимов Александр Сергеевич

+
ИГХТУ, Группа 2/42 Многие думают, что Lorem Ipsum - взятый с потолка псевдо-латинский набор слов, но это не совсем так. Его корни уходят в один фрагмент классической латыни 45 года н.э., то есть более двух тысячелетий назад. Ричард МакКлинток, профессор латыни из колледжа Hampden-Sydney, штат Вирджиния, взял одно из самых странных слов в Lorem Ipsum, "consectetur", и занялся его поисками в классической латинской литературе. В результате он нашёл неоспоримый первоисточник Lorem Ipsum в разделах 1.10.32 и 1.10.33 книги "de Finibus Bonorum et Malorum" ("О пределах добра и зла"), написанной Цицероном в 45 году н.э. Этот трактат по теории этики был очень популярен в эпоху Возрождения. Первая строка Lorem Ipsum, "Lorem ipsum dolor sit amet..", происходит от одной из строк в разделе 1.10.32 Есть много вариантов Lorem Ipsum, но большинство из них имеет не всегда приемлемые модификации, например, юмористические вставки или слова, которые даже отдалённо не напоминают латынь. Если вам нужен Lorem Ipsum для серьёзного проекта, вы наверняка не хотите какой-нибудь шутки, скрытой в середине абзаца. Также все другие известные генераторы Lorem Ipsum используют один и тот же текст, который они просто повторяют, пока не достигнут нужный объём. Это делает предлагаемый здесь генератор единственным настоящим Lorem Ipsum генератором. Он использует словарь из более чем 200 латинских слов, а также набор моделей предложений. В результате сгенерированный Lorem Ipsum выглядит правдоподобно, не имеет повторяющихся абзацей или "невозможных" слов. Давно выяснено, что при оценке дизайна и композиции читаемый текст мешает сосредоточиться. Lorem Ipsum используют потому, что тот обеспечивает более или менее стандартное заполнение шаблона, а также реальное распределение букв и пробелов в абзацах, которое не получается при простой дубликации "Здесь ваш текст.. Здесь ваш текст.. Здесь ваш текст.." Многие программы электронной вёрстки и редакторы HTML используют Lorem Ipsum в качестве текста по умолчанию, так что поиск по ключевым словам "lorem ipsum" сразу показывает, как много веб-страниц всё ещё дожидаются своего настоящего рождения. За прошедшие годы текст Lorem Ipsum получил много версий. Некоторые версии появились по ошибке, некоторые - намеренно (например, юмористические варианты). +
+
+

+

+
+ + +
+
+ + diff --git a/styles/styles.css b/styles/styles.css new file mode 100644 index 0000000..0d165db --- /dev/null +++ b/styles/styles.css @@ -0,0 +1,62 @@ +<<<<<<< HEAD:Site/styles/styles.css +header{ + background-color: yellow; + height: 90px; +} +.center{ + color:blue; + background-color:#D8E3AB; +} +.title{ + font-size: 36px; + padding-top: 20px; + text-align: center; +} +.menu{ + position: absolute; + top: 10px; + right: 100px; + left: 10px; +} +.left{ + margin-left: 15px; + margin-top: 20px; +} +.text{ + color:blue; + margin-left:15px; +} +.button{ + margin-left: 15px; +======= +header{ + background-color: yellow; + height: 90px; +} +.center{ + color:blue; + background-color:#D8E3AB; +} +.title{ + font-size: 36px; + padding-top: 20px; + text-align: center; +} +.menu{ + position: absolute; + top: 10px; + right: 100px; + left: 10px; +} +.left{ + margin-left: 15px; + margin-top: 20px; +} +.text{ + color:blue; + margin-left:15px; +} +.button{ + margin-left: 15px; +>>>>>>> master:styles/styles.css +} \ No newline at end of file