-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPatternCompositeTask.txt
More file actions
76 lines (55 loc) · 4.57 KB
/
PatternCompositeTask.txt
File metadata and controls
76 lines (55 loc) · 4.57 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
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
73
74
75
76
Composite (Компоновщик) - идеальный паттерн для игр, когда у тебя есть объекты,
которые могут состоять из других объектов, и ты хочешь работать с ними одинаково.
Задание: "Система отрядов и боевых групп"
Контекст:
Ты разрабатываешь тактическую RPG. В игре есть юниты (солдаты, лучники, маги).
Они могут объединяться в отряды, а отряды - в армии. Геймдизайнер хочет, чтобы можно было:
- Отдать приказ одному юниту (он выполнит сам)
- Отдать приказ целому отряду (каждый юнит в отряде выполнит)
- Отдать приказ армии (каждый отряд, а в нем каждый юнит выполнит)
При этом интерфейс взаимодействия должен быть одинаковым - неважно, юнит это, отряд или армия.
Техническое задание
Что нужно сделать:
1. Создать интерфейс IGameEntity (игровая сущность). У него должен быть метод:
- void TakeDamage(int damage) — нанести урон (уменьшает здоровье)
2. Создать класс Unit (один юнит), реализующий IGameEntity:
- Поля: string Name, int Health
- В методе TakeDamage выводить:
"Юнит {Name} получил {damage} урона. Осталось здоровья: {Health}"
3. Создать класс Group (группа/отряд), реализующий IGameEntity:
- Внутри должен быть List<IGameEntity> _entities
- Метод Add(IGameEntity entity) - добавить сущность в группу
- Метод Remove(IGameEntity entity) - удалить из группы
- В методе TakeDamage каждая сущность внутри группы должна получить весь урон целиком
(каждый юнит получает damage)
4. В Main создать следующую структуру:
Армия "Северная" (Group)
├── Отряд "Мечники" (Group)
│ ├── Рыцарь (Unit, 100 HP)
│ ├── Солдат (Unit, 80 HP)
│ └── Солдат (Unit, 80 HP)
├── Отряд "Лучники" (Group)
│ ├── Лучник (Unit, 60 HP)
│ ├── Лучник (Unit, 60 HP)
│ └── Маг (Unit, 50 HP)
└── Одиночный герой "Паладин" (Unit, 150 HP)
5. Нанести урон 30 по:
- Всей армии (вызвать TakeDamage у корневой группы)
- Вывести результат (сколько здоровья осталось у каждого юнита после этого)
Пример вывода (как должно выглядеть):
Наносим 30 урона по всей армии:
Юнит Рыцарь получил 30 урона. Осталось здоровья: 70
Юнит Солдат получил 30 урона. Осталось здоровья: 50
Юнит Солдат получил 30 урона. Осталось здоровья: 50
Юнит Лучник получил 30 урона. Осталось здоровья: 30
Юнит Лучник получил 30 урона. Осталось здоровья: 30
Юнит Маг получил 30 урона. Осталось здоровья: 20
Юнит Паладин получил 30 урона. Осталось здоровья: 120
Бонус (если будет легко):
Добавить метод GetTotalHealth() в IGameEntity,
который возвращает сумму здоровья всех юнитов в группе (рекурсивно).
Вывести общее здоровье армии до и после атаки.
Важные ограничения:
1. Unit не может содержать другие Unit — только Group может содержать IGameEntity
2. Group должна работать одинаково, содержит ли она Unit или другие Group
3. Метод TakeDamage у группы должен пробегать по всем _entities и вызывать у каждого TakeDamage(damage)