├── Bad ├── Bad.sln └── Bad │ ├── App.config │ ├── Bad.csproj │ ├── Bidlos │ ├── Alkash.cs │ ├── Exhibitionist.cs │ └── Gopnik.cs │ ├── GameObjects │ ├── Bench.cs │ └── Tree.cs │ ├── Games │ ├── EzGame.cs │ ├── HardGame.cs │ ├── IGame.cs │ └── MiddleGame.cs │ ├── Hero.cs │ ├── IBidlo.cs │ ├── Park.cs │ ├── Program.cs │ └── Properties │ └── AssemblyInfo.cs ├── CoolGood ├── Factory.sln └── Factory │ ├── App.config │ ├── Enemies │ ├── Boozer.cs │ ├── Exebitionist.cs │ └── Gopnik.cs │ ├── Factories │ ├── EasyLevelEnemiesFactory.cs │ ├── HardLevelEnemiesFactory.cs │ └── MiddleLevelEnemiesFactory.cs │ ├── Factory.csproj │ ├── Game.cs │ ├── Helpers │ └── IRngProvider.cs │ ├── IEnemiesFactory.cs │ ├── IEnemy.cs │ ├── IGame.cs │ ├── IPlayer.cs │ ├── Player.cs │ ├── Program.cs │ ├── Properties │ └── AssemblyInfo.cs │ └── World │ ├── Bench.cs │ ├── Builder │ ├── GameWorldBuilder.cs │ └── IGameWorldBuilder.cs │ ├── GameObject.cs │ ├── GameWorld.cs │ ├── IGameWorld.cs │ └── Tree.cs ├── Good ├── Good.sln └── Good │ ├── App.config │ ├── Bidlos │ ├── Alkash.cs │ ├── Exhibitionist.cs │ └── Gopnik.cs │ ├── Factories │ ├── EzLvlBidloFactory.cs │ ├── HardLvlBidloFactory.cs │ └── MidleLvlBidloFactory.cs │ ├── GameObjects │ ├── Bench.cs │ └── Tree.cs │ ├── Games │ └── Game.cs │ ├── Good.csproj │ ├── Hero.cs │ ├── IBidlo.cs │ ├── IBidloFactory.cs │ ├── Park.cs │ ├── Program.cs │ └── Properties │ └── AssemblyInfo.cs └── README.md /Bad/Bad.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.26730.12 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Bad", "Bad\Bad.csproj", "{E14D4E3B-4684-4093-B58C-21AF94EBE236}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {E14D4E3B-4684-4093-B58C-21AF94EBE236}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {E14D4E3B-4684-4093-B58C-21AF94EBE236}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {E14D4E3B-4684-4093-B58C-21AF94EBE236}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {E14D4E3B-4684-4093-B58C-21AF94EBE236}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {4BE960F9-4D68-42D2-BC6D-8B4455B08E7C} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /Bad/Bad/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Bad/Bad/Bad.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {E14D4E3B-4684-4093-B58C-21AF94EBE236} 8 | Exe 9 | Bad 10 | Bad 11 | v4.6.1 12 | 512 13 | true 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | -------------------------------------------------------------------------------- /Bad/Bad/Bidlos/Alkash.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Bad.Bidlos 4 | { 5 | class Alkash : IBidlo 6 | { 7 | public void BatleRoar() 8 | { 9 | Console.WriteLine("Дай пятюню, мне на проезд"); 10 | } 11 | 12 | public override string ToString() 13 | { 14 | return "Алкаш"; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Bad/Bad/Bidlos/Exhibitionist.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Bad.Bidlos 4 | { 5 | class Exhibitionist : IBidlo 6 | { 7 | public void BatleRoar() 8 | { 9 | Console.WriteLine("Здрасте, а вот что у меня под плащом"); 10 | } 11 | 12 | public override string ToString() 13 | { 14 | return "Эксгибиционист"; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Bad/Bad/Bidlos/Gopnik.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Bad.Bidlos 4 | { 5 | class Gopnik : IBidlo 6 | { 7 | public void BatleRoar() 8 | { 9 | Console.WriteLine("Есть чё позвонить?"); 10 | } 11 | 12 | public override string ToString() 13 | { 14 | return "Гопник"; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Bad/Bad/GameObjects/Bench.cs: -------------------------------------------------------------------------------- 1 | namespace Bad.GameObjects 2 | { 3 | /// 4 | /// Класс представляющий игровой объект - скамейку 5 | /// 6 | class Bench 7 | { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Bad/Bad/GameObjects/Tree.cs: -------------------------------------------------------------------------------- 1 | namespace Bad.GameObjects 2 | { 3 | /// 4 | /// Класс представляющий игровой объект - дерево 5 | /// 6 | class Tree 7 | { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Bad/Bad/Games/EzGame.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using Bad.GameObjects; 4 | using Bad.Bidlos; 5 | 6 | namespace Bad.Games 7 | { 8 | 9 | /// 10 | /// 11 | /// Портянка 12 | /// 13 | /// Класс представляет игру лёгкой сложности 14 | /// 15 | /// p.s. Обратите внимание, что большое количество кода среди классов, 16 | /// представляющих лёгкую, среднюю и тяжёлую игру совпадает 17 | /// 18 | /// 19 | class EzGame : IGame 20 | { 21 | private static Random rnd = new Random(); 22 | 23 | private Park location; 24 | private Hero gamer; 25 | 26 | public EzGame() 27 | { 28 | gamer = new Hero(); // В игре должен быть главный герой, за которого бы будем играть 29 | 30 | Tree[] trees = new Tree[] { // Задаём список деревьев, которые будут на локации 31 | new Tree(), 32 | new Tree(), 33 | new Tree() 34 | }; 35 | 36 | Bench[] benches = new Bench[] { // Задаём список скамеек, которые буду на локации 37 | new Bench(), 38 | new Bench(), 39 | new Bench() 40 | }; 41 | 42 | IBidlo[] bidlos = new IBidlo[100]; 43 | 44 | string[] bidlosEnum = new string[] { 45 | "Алконафт", 46 | "Нудист", 47 | "Гопник" 48 | }; 49 | 50 | for (int i = 0; i < bidlos.Length; i++) 51 | { 52 | switch (bidlosEnum[rnd.Next(0, bidlosEnum.Length)]) // Рандомно выбираем из всех 53 | { 54 | case "Алконафт": 55 | bidlos[i] = new Alkash(); 56 | break; 57 | case "Нудист": 58 | bidlos[i] = new Exhibitionist(); 59 | break; 60 | case "Гопник": 61 | bidlos[i] = new Gopnik(); 62 | break; 63 | default: 64 | throw new Exception("Таких конкретных классов нет D:"); 65 | } 66 | } 67 | 68 | location = new Park(bidlos, trees, benches); // инициализируем игровую локацию 69 | } 70 | 71 | public void StartGame() 72 | { 73 | Console.WriteLine("Локация загружена"); 74 | Console.WriteLine("Деревья расставлены"); 75 | Console.WriteLine("Скамейки расставлены"); 76 | Console.WriteLine("Монстры на местах"); 77 | Console.WriteLine("Игрок загружен"); 78 | Console.WriteLine("И тут игра, такая, начинается"); 79 | 80 | location.BidloInfo(); // Выведем инфу о том, сколько и каких типов быдло у нас сгенерилось 81 | } 82 | 83 | public override string ToString() 84 | { 85 | return "Лёгкий уровень сложности"; 86 | } 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /Bad/Bad/Games/HardGame.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using Bad.GameObjects; 4 | using Bad.Bidlos; 5 | 6 | namespace Bad.Games 7 | { 8 | /// 9 | /// 10 | /// Портянка 11 | /// 12 | /// Класс представляет игру тяжёлой сложности 13 | /// 14 | /// p.s. Обратите внимание, что большое количество кода среди классов, 15 | /// представляющих лёгкую, среднюю и тяжёлую игру совпадает 16 | /// 17 | /// 18 | class HardGame : IGame 19 | { 20 | private static Random rnd = new Random(); 21 | 22 | private Park location; 23 | private Hero gamer; 24 | 25 | public HardGame() 26 | { 27 | gamer = new Hero(); // В игре должен быть главный герой, за которого бы будем играть 28 | 29 | Tree[] trees = new Tree[] { // Задаём список деревьев, которые будут на локации 30 | new Tree(), 31 | new Tree(), 32 | new Tree() 33 | }; 34 | 35 | Bench[] benches = new Bench[] { // Задаём список скамеек, которые буду на локации 36 | new Bench(), 37 | new Bench(), 38 | new Bench() 39 | }; 40 | 41 | IBidlo[] bidlos = new IBidlo[100]; 42 | 43 | string[] bidlosEnum = new string[] { 44 | "Нудист", 45 | "Гопник" 46 | }; 47 | 48 | for (int i = 0; i < bidlos.Length; i++) 49 | { 50 | switch (bidlosEnum[rnd.Next(0, bidlosEnum.Length)]) // Рандомно выбираем из всех 51 | { 52 | case "Нудист": 53 | bidlos[i] = new Exhibitionist(); 54 | break; 55 | case "Гопник": 56 | bidlos[i] = new Gopnik(); 57 | break; 58 | default: 59 | throw new Exception("Таких конкретных классов нет D:"); 60 | } 61 | } 62 | 63 | location = new Park(bidlos, trees, benches); // инициализируем игровую локацию 64 | } 65 | 66 | public void StartGame() 67 | { 68 | Console.WriteLine("Локация загружена"); 69 | Console.WriteLine("Деревья расставлены"); 70 | Console.WriteLine("Скамейки расставлены"); 71 | Console.WriteLine("Монстры на местах"); 72 | Console.WriteLine("Игрок загружен"); 73 | Console.WriteLine("И тут игра, такая, начинается"); 74 | 75 | location.BidloInfo(); // Выведем инфу о том, сколько и каких типов быдло у нас сгенерилось 76 | } 77 | 78 | public override string ToString() 79 | { 80 | return "Сложный уровень сложности"; 81 | } 82 | } 83 | } 84 | -------------------------------------------------------------------------------- /Bad/Bad/Games/IGame.cs: -------------------------------------------------------------------------------- 1 | namespace Bad.Games 2 | { 3 | /// 4 | /// Абстракция для портянки (игры) 5 | /// 6 | /// Если не понятно зачем нужны интерфейсы чекай этот видос: 7 | /// https://youtu.be/fu13d1V73K4 8 | /// 9 | /// 10 | interface IGame 11 | { 12 | void StartGame(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /Bad/Bad/Games/MiddleGame.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using Bad.GameObjects; 4 | using Bad.Bidlos; 5 | 6 | namespace Bad.Games 7 | { 8 | /// 9 | /// 10 | /// Портянка 11 | /// 12 | /// Класс представляет игру средней сложности 13 | /// 14 | /// p.s. Обратите внимание, что большое количество кода среди классов, 15 | /// представляющих лёгкую, среднюю и тяжёлую игру совпадает 16 | /// 17 | /// 18 | class MiddleGame : IGame 19 | { 20 | private static Random rnd = new Random(); 21 | 22 | private Park location; 23 | private Hero gamer; 24 | 25 | public MiddleGame() 26 | { 27 | gamer = new Hero(); // В игре должен быть главный герой, за которого бы будем играть 28 | 29 | Tree[] trees = new Tree[] { // Задаём список деревьев, которые будут на локации 30 | new Tree(), 31 | new Tree(), 32 | new Tree() 33 | }; 34 | 35 | Bench[] benches = new Bench[] { // Задаём список скамеек, которые буду на локации 36 | new Bench(), 37 | new Bench(), 38 | new Bench() 39 | }; 40 | 41 | IBidlo[] bidlos = new IBidlo[100]; 42 | 43 | string[] bidlosEnum = new string[] { 44 | "Алконафт", 45 | "Нудист", 46 | "Гопник" 47 | }; 48 | 49 | for (int i = 0; i < 10; i++) // Сначала создаём 10 самых сильных мобов, что бы их нагенерилось чуть больше, чем обычно 50 | { 51 | bidlos[i] = new Gopnik(); 52 | } 53 | 54 | for (int i = 10; i < bidlos.Length; i++) 55 | { 56 | switch (bidlosEnum[rnd.Next(0, bidlosEnum.Length)]) // Рандомно выбираем из всех 57 | { 58 | case "Алконафт": 59 | bidlos[i] = new Alkash(); 60 | break; 61 | case "Нудист": 62 | bidlos[i] = new Exhibitionist(); 63 | break; 64 | case "Гопник": 65 | bidlos[i] = new Gopnik(); 66 | break; 67 | default: 68 | throw new Exception("Таких конкретных классов нет D:"); 69 | } 70 | } 71 | 72 | location = new Park(bidlos, trees, benches); // инициализируем игровую локацию 73 | } 74 | 75 | public void StartGame() 76 | { 77 | Console.WriteLine("Локация загружена"); 78 | Console.WriteLine("Деревья расставлены"); 79 | Console.WriteLine("Скамейки расставлены"); 80 | Console.WriteLine("Монстры на местах"); 81 | Console.WriteLine("Игрок загружен"); 82 | Console.WriteLine("И тут игра, такая, начинается"); 83 | 84 | location.BidloInfo(); // Выведем инфу о том, сколько и каких типов быдло у нас сгенерилось 85 | } 86 | 87 | public override string ToString() 88 | { 89 | return "Средний уровень сложности"; 90 | } 91 | } 92 | } 93 | -------------------------------------------------------------------------------- /Bad/Bad/Hero.cs: -------------------------------------------------------------------------------- 1 | namespace Bad 2 | { 3 | /// 4 | /// Класс представляющий главного героя 5 | /// 6 | class Hero 7 | { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Bad/Bad/IBidlo.cs: -------------------------------------------------------------------------------- 1 | namespace Bad 2 | { 3 | /// 4 | /// Абстракция для быдло 5 | /// 6 | /// Если не понятно зачем нужны интерфейсы чекай этот видос: 7 | /// https://youtu.be/fu13d1V73K4 8 | /// 9 | /// 10 | interface IBidlo 11 | { 12 | /// 13 | /// Каждое быдло может издавать боевой клич 14 | /// 15 | void BatleRoar(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Bad/Bad/Park.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using Bad.GameObjects; 4 | 5 | namespace Bad 6 | { 7 | /// 8 | /// Класс представляющий локацию 9 | /// 10 | class Park 11 | { 12 | /// 13 | /// Монстры, обитающие на локации 14 | /// 15 | private IBidlo[] bidlos; 16 | 17 | /// 18 | /// Деревья на локации 19 | /// 20 | private Tree[] trees; 21 | 22 | /// 23 | /// Скамейки на локации 24 | /// 25 | private Bench[] benches; 26 | 27 | public Park(IBidlo[] bidlos, Tree[] trees, Bench[] benches) 28 | { 29 | this.bidlos = bidlos; 30 | this.trees = trees; 31 | this.benches = benches; 32 | } 33 | 34 | /// 35 | /// Выводит информацию по количеству быдла определённого типа в консоль 36 | /// 37 | /// Например: 38 | /// 15 Алкаш 39 | /// 100 Эксгибицонистов 40 | /// 55 Гопников 41 | /// 42 | /// 43 | /// P.S. если вам не понятно, что в этом методе происходит 44 | /// то не заморачивайтесь, для понимания темы паттернов это не нужно 45 | /// просто знайте, что этот метод считает кого и сколько у нас в парке. 46 | /// Этот метод нужен просто для наглядности, что бы знать, что генерация объектов 47 | /// сработала правильно 48 | /// 49 | /// 50 | public void BidloInfo() 51 | { 52 | var alkash = bidlos.Where((item) => { 53 | return item.ToString() == "Алкаш"; 54 | }).Count(); 55 | 56 | Console.WriteLine($"{alkash} Алкаш"); 57 | 58 | 59 | var exhibitionist = bidlos.Where((item) => { 60 | return item.ToString() == "Эксгибиционист"; 61 | }).Count(); 62 | 63 | Console.WriteLine($"{exhibitionist} Эксгибиционист"); 64 | 65 | 66 | var gopnik = bidlos.Where((item) => { 67 | return item.ToString() == "Гопник"; 68 | }).Count(); 69 | 70 | Console.WriteLine($"{gopnik} Гопник"); 71 | } 72 | 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /Bad/Bad/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Text; 5 | using System.Threading.Tasks; 6 | 7 | using Bad.Games; 8 | 9 | namespace Bad 10 | { 11 | class Program 12 | { 13 | static void Main(string[] args) 14 | { 15 | IGame[] lvls = new IGame[] { // инициализируем уровни сложности, пользователь будет их выбирать 16 | new EzGame(), 17 | new MiddleGame(), 18 | new HardGame() 19 | }; 20 | 21 | Console.WriteLine("Выберете уровень сложности и введите его номер:"); 22 | 23 | for (int i = 0; i < lvls.Length; i++) // выведем все уровни сложности пользователю 24 | { 25 | Console.WriteLine($"{i + 1}. {lvls[i].ToString()}"); // i+1 потому что нормальные люди считают с 1, а не с 0 26 | } 27 | 28 | int lvlNumber = Convert.ToInt32(Console.ReadLine()) - 1; // -1 потому что нормальные люди всё ещё считают с 1))) 29 | 30 | if (lvlNumber > -1 && lvlNumber < lvls.Length) // проверяем находится ли число в пределах массива 31 | { 32 | IGame game = lvls[lvlNumber]; // создаём игру с выбранным уровнем сложности 33 | game.StartGame(); 34 | } 35 | else 36 | { 37 | Console.WriteLine("Недопустимое число"); 38 | } 39 | 40 | Console.ReadKey(); 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /Bad/Bad/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Общие сведения об этой сборке предоставляются следующим набором 6 | // набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения, 7 | // связанные со сборкой. 8 | [assembly: AssemblyTitle("Bad")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Bad")] 13 | [assembly: AssemblyCopyright("Copyright © 2017")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми 18 | // для компонентов COM. Если необходимо обратиться к типу в этой сборке через 19 | // COM, задайте атрибуту ComVisible значение TRUE для этого типа. 20 | [assembly: ComVisible(false)] 21 | 22 | // Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM 23 | [assembly: Guid("e14d4e3b-4684-4093-b58c-21af94ebe236")] 24 | 25 | // Сведения о версии сборки состоят из следующих четырех значений: 26 | // 27 | // Основной номер версии 28 | // Дополнительный номер версии 29 | // Номер сборки 30 | // Редакция 31 | // 32 | // Можно задать все значения или принять номер сборки и номер редакции по умолчанию. 33 | // используя "*", как показано ниже: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /CoolGood/Factory.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.26730.10 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Factory", "Factory\Factory.csproj", "{36E9B543-57A0-4EC8-9507-38F12AD23FBB}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {36E9B543-57A0-4EC8-9507-38F12AD23FBB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {36E9B543-57A0-4EC8-9507-38F12AD23FBB}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {36E9B543-57A0-4EC8-9507-38F12AD23FBB}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {36E9B543-57A0-4EC8-9507-38F12AD23FBB}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {F9A0E803-0BEC-45B4-83CF-5C5E857D640E} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /CoolGood/Factory/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /CoolGood/Factory/Enemies/Boozer.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Factory.Enemies 4 | { 5 | /// 6 | /// Класс представляющий врага 'Алкаш' 7 | /// 8 | class Boozer : IEnemy 9 | { 10 | /// 11 | /// Издает боевой клич 12 | /// 13 | public void BattleRoar() 14 | { 15 | Console.WriteLine("Дай пятюню, мне на проезд"); 16 | } 17 | 18 | public override string ToString() 19 | { 20 | return "Алкаш"; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /CoolGood/Factory/Enemies/Exebitionist.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Factory.Enemies 4 | { 5 | /// 6 | /// Класс представляющий врага 'Эксгибиционист' 7 | /// 8 | class Exebitionist : IEnemy 9 | { 10 | /// 11 | /// Издает боевой клич 12 | /// 13 | public void BattleRoar() 14 | { 15 | Console.WriteLine("Здрасте, а вот что у меня под плащом"); 16 | } 17 | 18 | public override string ToString() 19 | { 20 | return "Эксгибиционист"; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /CoolGood/Factory/Enemies/Gopnik.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Factory.Enemies 4 | { 5 | /// 6 | /// Класс представляющий врага 'Гопник' 7 | /// 8 | class Gopnik : IEnemy 9 | { 10 | /// 11 | /// Издает боевой клич 12 | /// 13 | public void BattleRoar() 14 | { 15 | Console.WriteLine("Есть чё позвонить?"); 16 | } 17 | 18 | public override string ToString() 19 | { 20 | return "Гопник"; 21 | } 22 | } 23 | } 24 | -------------------------------------------------------------------------------- /CoolGood/Factory/Factories/EasyLevelEnemiesFactory.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | using Factory.Enemies; 5 | 6 | namespace Factory.Factories 7 | { 8 | /// 9 | /// Класс редставляет реализацию шаблона "Фабричный метод" 10 | /// Для создания противников легкого уровня сложности 11 | /// 12 | class EasyLevelEnemiesFactory : IEnemiesFactory 13 | { 14 | /// 15 | /// Типы врагов для этого уровня сложности 16 | /// 17 | private readonly List _enemies = new List() 18 | { 19 | typeof(Boozer), 20 | typeof(Exebitionist), 21 | typeof(Gopnik) 22 | }; 23 | 24 | public IEnemy Create() 25 | { 26 | var enemyIndex = RngProvider.Random.Next(0, _enemies.Count); 27 | var typeOfEnemy = _enemies[enemyIndex]; // Тип выбираем случайно 28 | 29 | return Activator.CreateInstance(typeOfEnemy) as IEnemy; // Создаем экземпляр класса 30 | } 31 | 32 | public override string ToString() 33 | { 34 | return "Легкий уровень"; 35 | } 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /CoolGood/Factory/Factories/HardLevelEnemiesFactory.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | using Factory.Enemies; 5 | 6 | namespace Factory.Factories 7 | { 8 | /// 9 | /// Класс редставляет реализацию шаблона "Фабричный метод" 10 | /// Для создания противников тяжелого уровня сложности 11 | /// 12 | class HardLevelEnemiesFactory : IEnemiesFactory 13 | { 14 | private readonly List _enemies = new List() 15 | { 16 | typeof(Exebitionist), 17 | typeof(Gopnik) 18 | }; 19 | 20 | public IEnemy Create() 21 | { 22 | var enemyIndex = RngProvider.Random.Next(0, _enemies.Count); 23 | var typeOfEnemy = _enemies[enemyIndex]; // Выбираем случайно 24 | 25 | return Activator.CreateInstance(typeOfEnemy) as IEnemy; // Создаем экземпляр 26 | } 27 | 28 | public override string ToString() 29 | { 30 | return "Сложный уровень"; 31 | } 32 | } 33 | } 34 | -------------------------------------------------------------------------------- /CoolGood/Factory/Factories/MiddleLevelEnemiesFactory.cs: -------------------------------------------------------------------------------- 1 | using Factory.Enemies; 2 | 3 | namespace Factory.Factories 4 | { 5 | /// 6 | /// Класс редставляет реализацию шаблона "Фабричный метод" 7 | /// Для создания противников среднего уровня сложности 8 | /// 9 | class MiddleLevelEnemiesFactory : IEnemiesFactory 10 | { 11 | private static readonly int hardEnemiesToCreate = 10; 12 | private static int hardEnemiesCreated = 0; 13 | 14 | public IEnemy Create() 15 | { 16 | if (hardEnemiesCreated < hardEnemiesToCreate) // проверяем созданы ли 10 сильных мобов 17 | { 18 | hardEnemiesCreated++; 19 | return new Gopnik(); // если нет, то создаём 20 | } 21 | 22 | // если 10 сильных врагов созданы, то генерируем остальных рандомно 23 | var easyLevelFactory = new EasyLevelEnemiesFactory(); 24 | return easyLevelFactory.Create(); 25 | } 26 | 27 | public override string ToString() 28 | { 29 | return "Средний уровень"; 30 | } 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /CoolGood/Factory/Factory.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {36E9B543-57A0-4EC8-9507-38F12AD23FBB} 8 | Exe 9 | Factory 10 | Factory 11 | v4.5.2 12 | 512 13 | true 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /CoolGood/Factory/Game.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | using System.Linq; 4 | using System.Security.Cryptography; 5 | using Factory.World; 6 | using Factory.World.Builder; 7 | 8 | namespace Factory 9 | { 10 | /// 11 | /// Класс предоставляющий базовые параметры настройки игры 12 | /// 13 | class Game : IGame 14 | { 15 | /// 16 | /// Текущая фабрика для создания врагов 17 | /// 18 | private IEnemiesFactory _factory; 19 | 20 | /// 21 | /// Игровой мир 22 | /// 23 | private IGameWorld _world; 24 | 25 | /// 26 | /// Игрок 27 | /// 28 | private IPlayer _player; 29 | 30 | /// 31 | /// Добавляет объект реализующий 32 | /// для создания врагов в зависимости от уровня сложности 33 | /// 34 | /// Объект реализующий 35 | /// 36 | public IGame AddEnemyFactory(IEnemiesFactory factory) 37 | { 38 | _factory = factory; 39 | return this; 40 | } 41 | 42 | /// 43 | /// Добавляет игрока в игру 44 | /// 45 | /// Объект реализующий 46 | /// 47 | public IGame AddPlayer(IPlayer player) 48 | { 49 | _player = player; 50 | return this; 51 | } 52 | 53 | /// 54 | /// Старт игры 55 | /// 56 | public void Play() 57 | { 58 | if (_player == null) 59 | { 60 | throw new NullReferenceException(nameof(_player)); 61 | } 62 | 63 | if (_factory == null) 64 | { 65 | throw new NullReferenceException(nameof(_factory)); 66 | } 67 | 68 | var gameWorld = new GameWorldBuilder().Build(_factory); // Строим игровой мир 69 | PrintGameWorldInfo(gameWorld); // Выводим информацию о мире 70 | } 71 | 72 | private void PrintGameWorldInfo(IGameWorld world) 73 | { 74 | var enemies = world.Enemies; 75 | 76 | PrintByType("Алкаш", enemies); 77 | PrintByType("Эксгибиционист", enemies); 78 | PrintByType("Гопник", enemies); 79 | } 80 | 81 | private void PrintByType(string name, IEnumerable enemies) 82 | { 83 | var enemy = enemies.Count(item => item.ToString() == name); 84 | Console.WriteLine($"{enemy} {name}"); 85 | } 86 | 87 | } 88 | } 89 | -------------------------------------------------------------------------------- /CoolGood/Factory/Helpers/IRngProvider.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Factory 4 | { 5 | /// 6 | /// Вспомогательный класс для генерации случайных чисел 7 | /// 8 | public static class RngProvider 9 | { 10 | /// 11 | /// Хранит экземпляр класса для генерации случайных чисел 12 | /// 13 | public static Random Random { get; } 14 | 15 | static RngProvider() 16 | { 17 | Random = new Random(); 18 | } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /CoolGood/Factory/IEnemiesFactory.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace Factory 3 | { 4 | /// 5 | /// Представляет интерфейс для шаблона "Фабричный метод" 6 | /// Для создания противников 7 | /// 8 | interface IEnemiesFactory 9 | { 10 | /// 11 | /// Создает новый объект реализующий 12 | /// 13 | /// Экземпляр реализующий интерфейс 14 | IEnemy Create(); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /CoolGood/Factory/IEnemy.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace Factory 3 | { 4 | /// 5 | /// Представляет интерфейс для врагов 6 | /// 7 | interface IEnemy 8 | { 9 | /// 10 | /// Издает боевой клич 11 | /// 12 | void BattleRoar(); 13 | } 14 | } 15 | -------------------------------------------------------------------------------- /CoolGood/Factory/IGame.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace Factory 3 | { 4 | /// 5 | /// Интерфейс предоставляющий базовые параметры настройки игры 6 | /// 7 | interface IGame 8 | { 9 | /// 10 | /// Добавляет объект реализующий 11 | /// для создания врагов в зависимости от уровня сложности 12 | /// 13 | /// Объект реализующий 14 | /// 15 | IGame AddEnemyFactory(IEnemiesFactory factory); 16 | 17 | /// 18 | /// Добавляет игрока в игру 19 | /// 20 | /// Объект реализующий 21 | /// 22 | IGame AddPlayer(IPlayer player); 23 | 24 | /// 25 | /// Старт игры 26 | /// 27 | void Play(); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /CoolGood/Factory/IPlayer.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace Factory 3 | { 4 | /// 5 | /// Интерфейс представляющий игрока 6 | /// 7 | interface IPlayer 8 | { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /CoolGood/Factory/Player.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace Factory 3 | { 4 | /// 5 | /// Класс представляющий игрока 6 | /// 7 | class Player : IPlayer 8 | { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /CoolGood/Factory/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | using Factory.Factories; 5 | 6 | namespace Factory 7 | { 8 | class Program 9 | { 10 | static void Main(string[] args) 11 | { 12 | var levels = new List() 13 | { 14 | new EasyLevelEnemiesFactory(), 15 | new MiddleLevelEnemiesFactory(), 16 | new HardLevelEnemiesFactory() 17 | }; 18 | 19 | 20 | Console.WriteLine("Выберете уровень сложности и введите его номер:"); 21 | 22 | for (int i = 0; i < levels.Count; i++) // выведем все уровни сложности пользователю 23 | { 24 | Console.WriteLine($"{i + 1}. {levels[i]}"); // i+1 потому что нормальные люди считают с 1, а не с 0 25 | } 26 | 27 | int selectedLevel; 28 | var userEnteredValue = Console.ReadLine(); 29 | 30 | var isSuccess = Int32.TryParse(userEnteredValue, out selectedLevel); 31 | 32 | if (!isSuccess) 33 | { 34 | Console.WriteLine("Critical error, all system crashed, pleaze reboooot ue pc"); 35 | Console.ReadKey(); 36 | return; 37 | } 38 | 39 | selectedLevel--; // -1 потому что нормальные люди всё ещё считают с 1))) 40 | 41 | if (selectedLevel > -1 && selectedLevel < levels.Count) // проверяем находится ли число в пределах массива 42 | { 43 | 44 | IGame game = new Game(); 45 | IEnemiesFactory factory = levels[selectedLevel]; 46 | 47 | game.AddPlayer(new Player()) 48 | .AddEnemyFactory(factory); 49 | 50 | game.Play(); 51 | } 52 | else 53 | { 54 | Console.WriteLine("Недопустимое число"); 55 | } 56 | 57 | Console.ReadKey(); 58 | } 59 | } 60 | } 61 | -------------------------------------------------------------------------------- /CoolGood/Factory/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // General Information about an assembly is controlled through the following 6 | // set of attributes. Change these attribute values to modify the information 7 | // associated with an assembly. 8 | [assembly: AssemblyTitle("Factory")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Factory")] 13 | [assembly: AssemblyCopyright("Copyright © 2017")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Setting ComVisible to false makes the types in this assembly not visible 18 | // to COM components. If you need to access a type in this assembly from 19 | // COM, set the ComVisible attribute to true on that type. 20 | [assembly: ComVisible(false)] 21 | 22 | // The following GUID is for the ID of the typelib if this project is exposed to COM 23 | [assembly: Guid("36e9b543-57a0-4ec8-9507-38f12ad23fbb")] 24 | 25 | // Version information for an assembly consists of the following four values: 26 | // 27 | // Major Version 28 | // Minor Version 29 | // Build Number 30 | // Revision 31 | // 32 | // You can specify all the values or you can default the Build and Revision Numbers 33 | // by using the '*' as shown below: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /CoolGood/Factory/World/Bench.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace Factory.World 3 | { 4 | /// 5 | /// Класс представляющий скамейки 6 | /// 7 | class Bench : GameObject 8 | { 9 | 10 | } 11 | } 12 | -------------------------------------------------------------------------------- /CoolGood/Factory/World/Builder/GameWorldBuilder.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Collections.Generic; 3 | 4 | namespace Factory.World.Builder 5 | { 6 | /// 7 | /// Представляет класс для построения игрового мира 8 | /// 9 | class GameWorldBuilder : IGameWorldBuilder 10 | { 11 | /// 12 | /// Коллекция врагов 13 | /// 14 | private readonly List _enemies; 15 | 16 | /// 17 | /// Коллекция игровых объектов 18 | /// 19 | private readonly List _gameObjects; 20 | 21 | /// 22 | /// Инициализирует объект для построения игрового мира 23 | /// 24 | public GameWorldBuilder() 25 | { 26 | _enemies = new List(); 27 | _gameObjects = new List(); 28 | } 29 | 30 | /// 31 | /// Добавляет врага к игровому миру 32 | /// 33 | /// Экземпляр 34 | /// Экземпляр 35 | public IGameWorldBuilder AddEnemy(IEnemy enemy) 36 | { 37 | _enemies.Add(enemy); 38 | return this; 39 | } 40 | 41 | /// 42 | /// Добавляет игровой объект к игровому миру 43 | /// 44 | /// Экземпляр 45 | /// Экземпляр 46 | public IGameWorldBuilder AddGameObject(GameObject obj) 47 | { 48 | _gameObjects.Add(obj); 49 | return this; 50 | } 51 | 52 | /// 53 | /// Собирает игровой мир из предоставленых материалов 54 | /// 55 | /// Экземпляр фабрики для создания врагов 56 | /// Экземпляр 57 | public IGameWorld Build(IEnemiesFactory enemiesFactory) 58 | { 59 | #region "Build level" 60 | int count = RngProvider.Random.Next(10, 100); 61 | 62 | //Build trees 63 | Console.WriteLine("Build Trees"); 64 | for (int i = 0; i < count; i++) 65 | { 66 | this.AddGameObject(new Tree()); 67 | } 68 | 69 | Console.WriteLine("Build Benchs"); 70 | count = RngProvider.Random.Next(10, 100); 71 | for (int i = 0; i < count; i++) 72 | { 73 | this.AddGameObject(new Bench()); 74 | } 75 | 76 | 77 | Console.WriteLine("Create enemies"); 78 | count = 100; 79 | for (int i = 0; i < count; i++) 80 | { 81 | this.AddEnemy(enemiesFactory.Create()); 82 | } 83 | 84 | #endregion 85 | 86 | return new GameWorld() 87 | { 88 | Enemies = _enemies, 89 | Objects = _gameObjects 90 | }; 91 | } 92 | } 93 | } 94 | -------------------------------------------------------------------------------- /CoolGood/Factory/World/Builder/IGameWorldBuilder.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace Factory.World.Builder 3 | { 4 | /// 5 | /// Представляет интерфейс для построения игрового мира 6 | /// 7 | interface IGameWorldBuilder 8 | { 9 | /// 10 | /// Добавляет врага к игровому миру 11 | /// 12 | /// Экземпляр 13 | /// Экземпляр 14 | IGameWorldBuilder AddEnemy(IEnemy enemy); 15 | 16 | /// 17 | /// Добавляет игровой объект к игровому миру 18 | /// 19 | /// Экземпляр 20 | /// Экземпляр 21 | IGameWorldBuilder AddGameObject(GameObject obj); 22 | 23 | /// 24 | /// Собирает игровой мир из предоставленых материалов 25 | /// 26 | /// Экземпляр фабрики для создания врагов 27 | /// Экземпляр 28 | IGameWorld Build(IEnemiesFactory enemiesFactory); 29 | } 30 | } 31 | -------------------------------------------------------------------------------- /CoolGood/Factory/World/GameObject.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace Factory.World 3 | { 4 | /// 5 | /// Базовый класс для игрового мира 6 | /// 7 | class GameObject 8 | { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /CoolGood/Factory/World/GameWorld.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Factory.World 4 | { 5 | /// 6 | /// Класс представляющий игровой мир 7 | /// 8 | class GameWorld : IGameWorld 9 | { 10 | /// 11 | /// Список объектов в игровом мире 12 | /// 13 | public IEnumerable Objects { get; set; } 14 | 15 | /// 16 | /// Список врагов в игровом мире 17 | /// 18 | public IEnumerable Enemies { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /CoolGood/Factory/World/IGameWorld.cs: -------------------------------------------------------------------------------- 1 | using System.Collections.Generic; 2 | 3 | namespace Factory.World 4 | { 5 | /// 6 | /// Интерфейс представляющий игровой мир 7 | /// 8 | interface IGameWorld 9 | { 10 | /// 11 | /// Список объектов в игровом мире 12 | /// 13 | IEnumerable Objects { get; set; } 14 | 15 | /// 16 | /// Список врагов в игровом мире 17 | /// 18 | IEnumerable Enemies { get; set; } 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /CoolGood/Factory/World/Tree.cs: -------------------------------------------------------------------------------- 1 |  2 | namespace Factory.World 3 | { 4 | /// 5 | /// Класс представляющий деревья 6 | /// 7 | class Tree : GameObject 8 | { 9 | } 10 | } 11 | -------------------------------------------------------------------------------- /Good/Good.sln: -------------------------------------------------------------------------------- 1 |  2 | Microsoft Visual Studio Solution File, Format Version 12.00 3 | # Visual Studio 15 4 | VisualStudioVersion = 15.0.26730.12 5 | MinimumVisualStudioVersion = 10.0.40219.1 6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Good", "Good\Good.csproj", "{A51CFE18-C803-42A3-BFD1-45D838E7A71E}" 7 | EndProject 8 | Global 9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution 10 | Debug|Any CPU = Debug|Any CPU 11 | Release|Any CPU = Release|Any CPU 12 | EndGlobalSection 13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution 14 | {A51CFE18-C803-42A3-BFD1-45D838E7A71E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU 15 | {A51CFE18-C803-42A3-BFD1-45D838E7A71E}.Debug|Any CPU.Build.0 = Debug|Any CPU 16 | {A51CFE18-C803-42A3-BFD1-45D838E7A71E}.Release|Any CPU.ActiveCfg = Release|Any CPU 17 | {A51CFE18-C803-42A3-BFD1-45D838E7A71E}.Release|Any CPU.Build.0 = Release|Any CPU 18 | EndGlobalSection 19 | GlobalSection(SolutionProperties) = preSolution 20 | HideSolutionNode = FALSE 21 | EndGlobalSection 22 | GlobalSection(ExtensibilityGlobals) = postSolution 23 | SolutionGuid = {D298C4D8-1803-426B-81F7-90C3AE8F47D9} 24 | EndGlobalSection 25 | EndGlobal 26 | -------------------------------------------------------------------------------- /Good/Good/App.config: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /Good/Good/Bidlos/Alkash.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Good.Bidlos 4 | { 5 | class Alkash : IBidlo 6 | { 7 | public void BatleRoar() 8 | { 9 | Console.WriteLine("Дай пятюню, мне на проезд"); 10 | } 11 | 12 | public override string ToString() 13 | { 14 | return "Алкаш"; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Good/Good/Bidlos/Exhibitionist.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Good.Bidlos 4 | { 5 | class Exhibitionist : IBidlo 6 | { 7 | public void BatleRoar() 8 | { 9 | Console.WriteLine("Здрасте, а вот что у меня под плащом"); 10 | } 11 | 12 | public override string ToString() 13 | { 14 | return "Эксгибиционист"; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Good/Good/Bidlos/Gopnik.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | namespace Good.Bidlos 4 | { 5 | class Gopnik : IBidlo 6 | { 7 | public void BatleRoar() 8 | { 9 | Console.WriteLine("Есть чё позвонить?"); 10 | } 11 | 12 | public override string ToString() 13 | { 14 | return "Гопник"; 15 | } 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Good/Good/Factories/EzLvlBidloFactory.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using Good.Bidlos; 4 | 5 | namespace Good.Factories 6 | { 7 | /// 8 | /// 9 | /// Класс представляющий фабрику, которая генерирует монстров 10 | /// для лёгкого уровня сложности 11 | /// 12 | /// (абсолютно рандомно) 13 | /// 14 | /// 15 | class EzLvlBidloFactory : IBidloFactory 16 | { 17 | private static Random rnd = new Random(); 18 | 19 | public IBidlo Create() 20 | { 21 | string[] bidlos = new string[] { 22 | "Алконафт", 23 | "Нудист", 24 | "Гопник" 25 | }; 26 | 27 | switch(bidlos[rnd.Next(0, bidlos.Length)]) // Рандомно выбираем из всех 28 | { 29 | case "Алконафт": 30 | return new Alkash(); 31 | case "Нудист": 32 | return new Exhibitionist(); 33 | case "Гопник": 34 | return new Gopnik(); 35 | default: 36 | throw new Exception("Таких конкретных классов нет D:"); 37 | } 38 | } 39 | 40 | public override string ToString() // реализуем приведение экземпляра класс к строке 41 | { 42 | return "Лёгкий уровень сложности"; 43 | } 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /Good/Good/Factories/HardLvlBidloFactory.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using Good.Bidlos; 4 | 5 | namespace Good.Factories 6 | { 7 | /// 8 | /// 9 | /// Класс представляющий фабрику, которая генерирует монстров 10 | /// для сложного уровня сложности 11 | /// 12 | /// (абсолютно рандомно без учёта самых слабых монстров - Алкашей) 13 | /// 14 | /// 15 | class HardLvlBidloFactory : IBidloFactory 16 | { 17 | private static Random rnd = new Random(); 18 | public IBidlo Create() 19 | { 20 | string[] bidlos = new string[] { 21 | "Нудист", 22 | "Гопник" 23 | }; 24 | 25 | switch (bidlos[rnd.Next(0, bidlos.Length)]) // Рандомно выбираем из гопников и нудистов 26 | { 27 | case "Нудист": 28 | return new Exhibitionist(); 29 | case "Гопник": 30 | return new Gopnik(); 31 | default: 32 | throw new Exception("Таких конкретных классов нет D:"); 33 | } 34 | } 35 | 36 | public override string ToString() // реализуем приведение экземпляра класс к строке 37 | { 38 | return "Сложный уровень сложности"; 39 | } 40 | } 41 | } 42 | -------------------------------------------------------------------------------- /Good/Good/Factories/MidleLvlBidloFactory.cs: -------------------------------------------------------------------------------- 1 | using Good.Bidlos; 2 | 3 | namespace Good.Factories 4 | { 5 | /// 6 | /// 7 | /// Класс представляющий фабрику, которая генерирует монстров 8 | /// для среднего уровня сложности 9 | /// 10 | /// (абсолютно рандомно, но сначала генерит 10 сильных мобов, 11 | /// что обеспечит небольшое отклонение по количеству сильных мобов в большую сторону) 12 | /// 13 | /// 14 | class MidleLvlBidloFactory : IBidloFactory 15 | { 16 | private static int HardBidloCount = 0; 17 | 18 | public IBidlo Create() 19 | { 20 | if(HardBidloCount < 10) // проверяем созданы ли 10 сильных мобов 21 | { 22 | HardBidloCount += 1; 23 | return new Gopnik(); // если нет, то создаём 24 | } 25 | 26 | // если 10 сильных врагов созданы, то генерируем остальных рандомно 27 | IBidloFactory ezFactory = new EzLvlBidloFactory(); 28 | return ezFactory.Create(); 29 | } 30 | 31 | public override string ToString() // реализуем приведение экземпляра класс к строке 32 | { 33 | return "Средний уровень сложности"; 34 | } 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /Good/Good/GameObjects/Bench.cs: -------------------------------------------------------------------------------- 1 | namespace Good.GameObjects 2 | { 3 | /// 4 | /// Класс представляющий игровой объект - скамейку 5 | /// 6 | class Bench 7 | { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Good/Good/GameObjects/Tree.cs: -------------------------------------------------------------------------------- 1 | namespace Good.GameObjects 2 | { 3 | /// 4 | /// Класс представляющий игровой объект - дерево 5 | /// 6 | class Tree 7 | { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Good/Good/Games/Game.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using Good.GameObjects; 3 | 4 | namespace Good 5 | { 6 | /// 7 | /// Портянка представляющая игру. 8 | /// 9 | class Game 10 | { 11 | private Park location; 12 | private Hero gamer; 13 | 14 | public Game(IBidloFactory factory) 15 | { 16 | gamer = new Hero(); // В игре должен быть главный герой, за которого бы будем играть 17 | 18 | Tree[] trees = new Tree[] { // Задаём список деревьев, которые будут на локации 19 | new Tree(), 20 | new Tree(), 21 | new Tree() 22 | }; 23 | 24 | Bench[] benches = new Bench[] { // Задаём список скамеек, которые будут на локации 25 | new Bench(), 26 | new Bench(), 27 | new Bench() 28 | }; 29 | 30 | IBidlo[] bidlos = new IBidlo[100]; // Задаём список монстров на локации 31 | 32 | for(int i = 0; i < bidlos.Length; i++) 33 | { 34 | bidlos[i] = factory.Create(); // заполнение массива делегировано фабричному методу 35 | } 36 | 37 | location = new Park(bidlos, trees, benches); // инициализируем игровую локацию 38 | 39 | // Обратите внимание, что эта портянка вообще ничего не знает о пространстве имён с 40 | // конкретными монстрами. Вместо этого происходит манипуляция абстракциями и фабриками. 41 | // Теперь насколько бы большой не была бы иерархия наследования быдла, она не будет нам мешать 42 | // при разработке этой части приложения (да и вообще какой-то другой части). 43 | // О конкретном быдло (Alkash, Exhibitionist, Gopnik) знают только конкретные фабрики, которые 44 | // работают с быдлом. Но при этом фабрики ничего не знают о других частях программы. 45 | // Инкапсуляция, мать её. 46 | } 47 | 48 | /// 49 | /// Здесь все игровые элементы взаимодействуют и рендерятся. 50 | /// (на самом деле нет, потому что не в этом суть данного урока) 51 | /// 52 | public void StartGame() 53 | { 54 | Console.WriteLine("Локация загружена"); 55 | Console.WriteLine("Деревья расставлены"); 56 | Console.WriteLine("Скамейки расставлены"); 57 | Console.WriteLine("Монстры на местах"); 58 | Console.WriteLine("Игрок загружен"); 59 | Console.WriteLine("И тут игра, такая, начинается"); 60 | 61 | location.BidloInfo(); // Выведем инфу о том, сколько и каких типов быдло у нас сгенерилось 62 | 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /Good/Good/Good.csproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | 4 | 5 | Debug 6 | AnyCPU 7 | {A51CFE18-C803-42A3-BFD1-45D838E7A71E} 8 | Exe 9 | Good 10 | Good 11 | v4.6.1 12 | 512 13 | true 14 | 15 | 16 | AnyCPU 17 | true 18 | full 19 | false 20 | bin\Debug\ 21 | DEBUG;TRACE 22 | prompt 23 | 4 24 | 25 | 26 | AnyCPU 27 | pdbonly 28 | true 29 | bin\Release\ 30 | TRACE 31 | prompt 32 | 4 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | -------------------------------------------------------------------------------- /Good/Good/Hero.cs: -------------------------------------------------------------------------------- 1 | namespace Good 2 | { 3 | /// 4 | /// Класс представляющий главного героя 5 | /// 6 | class Hero 7 | { 8 | } 9 | } 10 | -------------------------------------------------------------------------------- /Good/Good/IBidlo.cs: -------------------------------------------------------------------------------- 1 | namespace Good 2 | { 3 | /// 4 | /// Абстракция для быдло 5 | /// 6 | /// Если не понятно зачем нужны интерфейсы чекай этот видос: 7 | /// https://youtu.be/fu13d1V73K4 8 | /// 9 | /// 10 | interface IBidlo 11 | { 12 | /// 13 | /// Каждое быдло может издавать боевой клич 14 | /// 15 | void BatleRoar(); 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /Good/Good/IBidloFactory.cs: -------------------------------------------------------------------------------- 1 | namespace Good 2 | { 3 | /// 4 | /// Абстракция для фабрики 5 | /// 6 | /// Если не понятно зачем нужны интерфейсы чекай этот видос: 7 | /// https://youtu.be/fu13d1V73K4 8 | /// 9 | /// 10 | interface IBidloFactory 11 | { 12 | /// 13 | /// Каждая конкретная фабрика должна реализовывать свой способ создания объекта 14 | /// 15 | /// 16 | IBidlo Create(); 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /Good/Good/Park.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | using System.Linq; 3 | using Good.GameObjects; 4 | 5 | namespace Good 6 | { 7 | /// 8 | /// Класс представляющий локацию 9 | /// 10 | class Park 11 | { 12 | /// 13 | /// Монстры, обитающие на локации 14 | /// 15 | private IBidlo[] bidlos; 16 | 17 | /// 18 | /// Деревья на локации 19 | /// 20 | private Tree[] trees; 21 | 22 | /// 23 | /// Скамейки на локации 24 | /// 25 | private Bench[] benches; 26 | 27 | public Park(IBidlo[] bidlos, Tree[] trees, Bench[] benches) 28 | { 29 | this.bidlos = bidlos; 30 | this.trees = trees; 31 | this.benches = benches; 32 | } 33 | 34 | /// 35 | /// Выводит информацию по количеству быдла определённого типа в консоль 36 | /// 37 | /// Например: 38 | /// 15 Алкаш 39 | /// 100 Эксгибицонистов 40 | /// 55 Гопников 41 | /// 42 | /// 43 | /// P.S. если вам не понятно, что в этом методе происходит 44 | /// то не заморачивайтесь, для понимания темы паттернов это не нужно 45 | /// просто знайте, что этот метод считает кого и сколько у нас в парке. 46 | /// Этот метод нужен просто для наглядности, что бы знать, что генерация объектов 47 | /// сработала правильно 48 | /// 49 | /// 50 | public void BidloInfo() 51 | { 52 | var alkash = bidlos.Where((item) => { 53 | return item.ToString() == "Алкаш"; 54 | }).Count(); 55 | 56 | Console.WriteLine($"{alkash} Алкаш"); 57 | 58 | 59 | var exhibitionist = bidlos.Where((item) => { 60 | return item.ToString() == "Эксгибиционист"; 61 | }).Count(); 62 | 63 | Console.WriteLine($"{exhibitionist} Эксгибиционист"); 64 | 65 | 66 | var gopnik = bidlos.Where((item) => { 67 | return item.ToString() == "Гопник"; 68 | }).Count(); 69 | 70 | Console.WriteLine($"{gopnik} Гопник"); 71 | } 72 | 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /Good/Good/Program.cs: -------------------------------------------------------------------------------- 1 | using System; 2 | 3 | using Good.Factories; 4 | 5 | namespace Good 6 | { 7 | class Program 8 | { 9 | static void Main(string[] args) 10 | { 11 | IBidloFactory[] lvls = new IBidloFactory[] { // инициализируем уровни сложности, пользователь будет их выбирать 12 | new EzLvlBidloFactory(), 13 | new MidleLvlBidloFactory(), 14 | new HardLvlBidloFactory() 15 | }; 16 | 17 | Console.WriteLine("Выберете уровень сложности и введите его номер:"); 18 | 19 | for (int i = 0; i < lvls.Length; i++) // выведем все уровни сложности пользователю 20 | { 21 | Console.WriteLine($"{i+1}. {lvls[i].ToString()}"); // i+1 потому что нормальные люди считают с 1, а не с 0 22 | } 23 | 24 | int lvlNumber = Convert.ToInt32(Console.ReadLine()) - 1; // -1 потому что нормальные люди всё ещё считают с 1))) 25 | 26 | if(lvlNumber > -1 && lvlNumber < lvls.Length) // проверяем находится ли число в пределах массива 27 | { 28 | Game game = new Game(lvls[lvlNumber]); // создаём игру с выбранным уровнем сложности 29 | game.StartGame(); 30 | } 31 | else 32 | { 33 | Console.WriteLine("Недопустимое число"); 34 | } 35 | 36 | Console.ReadKey(); 37 | } 38 | } 39 | } 40 | -------------------------------------------------------------------------------- /Good/Good/Properties/AssemblyInfo.cs: -------------------------------------------------------------------------------- 1 | using System.Reflection; 2 | using System.Runtime.CompilerServices; 3 | using System.Runtime.InteropServices; 4 | 5 | // Общие сведения об этой сборке предоставляются следующим набором 6 | // набора атрибутов. Измените значения этих атрибутов, чтобы изменить сведения, 7 | // связанные со сборкой. 8 | [assembly: AssemblyTitle("Good")] 9 | [assembly: AssemblyDescription("")] 10 | [assembly: AssemblyConfiguration("")] 11 | [assembly: AssemblyCompany("")] 12 | [assembly: AssemblyProduct("Good")] 13 | [assembly: AssemblyCopyright("Copyright © 2017")] 14 | [assembly: AssemblyTrademark("")] 15 | [assembly: AssemblyCulture("")] 16 | 17 | // Установка значения False для параметра ComVisible делает типы в этой сборке невидимыми 18 | // для компонентов COM. Если необходимо обратиться к типу в этой сборке через 19 | // COM, задайте атрибуту ComVisible значение TRUE для этого типа. 20 | [assembly: ComVisible(false)] 21 | 22 | // Следующий GUID служит для идентификации библиотеки типов, если этот проект будет видимым для COM 23 | [assembly: Guid("a51cfe18-c803-42a3-bfd1-45d838e7a71e")] 24 | 25 | // Сведения о версии сборки состоят из следующих четырех значений: 26 | // 27 | // Основной номер версии 28 | // Дополнительный номер версии 29 | // Номер сборки 30 | // Редакция 31 | // 32 | // Можно задать все значения или принять номер сборки и номер редакции по умолчанию. 33 | // используя "*", как показано ниже: 34 | // [assembly: AssemblyVersion("1.0.*")] 35 | [assembly: AssemblyVersion("1.0.0.0")] 36 | [assembly: AssemblyFileVersion("1.0.0.0")] 37 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Пример для видео "Фабричный Метод" от ExtremeCode 2 | 3 | Good - пример с использованием фабричного метода 4 | 5 | Bad - тот же пример, но уже без использования фабричного метода 6 | 7 | CoolGood - пример с использованием фабричного метода для продвинутых пользователей 8 | 9 | --------------------------------------------------------------------------------