├── 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 |
--------------------------------------------------------------------------------