-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPatternDecoratorTask.txt
More file actions
132 lines (93 loc) · 5.79 KB
/
PatternDecoratorTask.txt
File metadata and controls
132 lines (93 loc) · 5.79 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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
Система временных баффов и усилений
Контекст
Ты разрабатываешь RPG. У игрока есть базовые характеристики:
- Урон (Damage) — например, 10 единиц
- Скорость атаки (AttackSpeed) — например, 1.0 (ударов в секунду)
- Сопротивление магии (MagicResist) — например, 5
Геймдизайнер хочет добавить систему временных баффов (эффектов), которые:
- Накладываются на персонажа (например, от зелий, заклинаний или вражеских дебаффов)
- Модифицируют базовые характеристики
- Могут комбинироваться (несколько эффектов одновременно)
- Влияют последовательно друг на друга
Техническое задание
Реализуй систему, где базовый персонаж и каждый бафф — это отдельные "декораторы",
которые оборачивают друг друга и модифицируют характеристики.
Требования к реализации:
1. Создай интерфейс ICharacterStats с методами/свойствами:
- float GetDamage()
- float GetAttackSpeed()
- float GetMagicResist()
2. Создай класс BaseCharacter (базовый персонаж без баффов):
- Принимает базовые значения через конструктор
- Реализует ICharacterStats
3. Создай абстрактный класс BuffDecorator (наследник ICharacterStats):
- Хранит ссылку на "обернутого" персонажа (protected ICharacterStats _stats)
- Реализует интерфейс через делегирование к _stats (базовые методы просто вызывают _stats.GetDamage() и т.д.)
- Это позволит конкретным баффам переопределять только нужные методы
4. Реализуй 3 конкретных баффа:
- BerserkBuff (бафф берсерка):
- Увеличивает урон на 50% (множитель 1.5)
- Снижает сопротивление магии на 50% (множитель 0.5)
- HasteBuff (бафф скорости):
- Увеличивает скорость атаки на 30% (множитель 1.3)
- Характеристики урона и сопротивления не трогает
- MagicShieldBuff (магический щит):
- Увеличивает сопротивление магии на 20 (абсолютное значение, НЕ множитель)
- Урон и скорость атаки не меняются
5. В методе Main() создай сценарий:
- Создай базового персонажа (урон 10, скорость 1.0, сопротивление 5)
- Покажи его характеристики
- Последовательно накладывай баффы:
Базовый персонаж
↓ + BerserkBuff
Берсерк
↓ + HasteBuff
Берсерк + Скорость
↓ + MagicShieldBuff
Берсерк + Скорость + МагЩит
- После каждого наложения выводи все три характеристики (Damage, AttackSpeed, MagicResist)
Пример вывода программы:
=== Базовый персонаж ===
Урон: 10
Скорость атаки: 1
Сопротивление магии: 5
=== После баффа Берсерка ===
Урон: 15
Скорость атаки: 1
Сопротивление магии: 2.5
=== После баффа Скорости ===
Урон: 15
Скорость атаки: 1.3
Сопротивление магии: 2.5
=== После Магического Щита ===
Урон: 15
Скорость атаки: 1.3
Сопротивление магии: 22.5
Бонус (если сделаешь быстро):
Добавь бафф DoubleDamageBuff, который:
- Удваивает урон (множитель 2.0)
- НО только если текущий урон (после всех предыдущих баффов) меньше 30
Это проверит, умеешь ли ты внутри декоратора обращаться к уже обернутым характеристикам.
Подсказки (если застрянешь):
1. Структура декоратора:
public abstract class BuffDecorator : ICharacterStats
{
protected ICharacterStats _stats;
public BuffDecorator(ICharacterStats stats)
{
_stats = stats;
}
public virtual float GetDamage() => _stats.GetDamage();
public virtual float GetAttackSpeed() => _stats.GetAttackSpeed();
public virtual float GetMagicResist() => _stats.GetMagicResist();
}
2. Конкретный бафф (например, BerserkBuff):
public class BerserkBuff : BuffDecorator
{
public BerserkBuff(ICharacterStats stats) : base(stats) { }
public override float GetDamage() => _stats.GetDamage() * 1.5f;
public override float GetMagicResist() => _stats.GetMagicResist() * 0.5f;
// GetAttackSpeed не переопределяем — берется из базового
}
3. MagicShieldBuff (абсолютное прибавление, а не множитель):
public override float GetMagicResist() => _stats.GetMagicResist() + 20;