-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathDelegatesAndEventsTask.txt
More file actions
99 lines (79 loc) · 6.5 KB
/
DelegatesAndEventsTask.txt
File metadata and controls
99 lines (79 loc) · 6.5 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
Задача: "Система достижений (Achievement System) для RPG"
Контекст:
Ты получил заказ от инди-студии.
Они делают RPG и хотят добавить в игру систему достижений (как в Steam или Xbox).
Геймдизайнер описал несколько достижений, а твоя задача — реализовать ядро системы,
которое будет отслеживать события в игре и разблокировать достижения, когда условия выполнены.
Ключевое требование:
Игровая логика (персонаж, монстры, инвентарь) не должна знать о существовании системы достижений.
Достижения должны подписываться на события и реагировать автоматически.
Что нужно сделать:
1. Классы игровой логики:
- Player (игрок)
- Свойства: string Name, int Level, int Experience, int Health, int Gold
- Методы:
- void GainExperience(int amount) — увеличивает опыт, вызывает событие
OnExperienceGained, и если опыта достаточно для уровня — OnLeveledUp
- void TakeDamage(int amount) — уменьшает здоровье, вызывает OnDamageTaken
- void Heal(int amount) — лечит
- void AddGold(int amount) — добавляет золото, вызывает OnGoldChanged
- Monster (монстр)
- Свойства: string Name, int Health, int RewardExperience, int RewardGold
- Метод: void TakeDamage(int amount) — если умирает (Health <= 0), вызывает событие OnMonsterDefeated
- Inventory (инвентарь — можешь взять из прошлого задания)
- Метод: void AddItem(Item item) — вызывает событие OnItemAdded
2. Ключевая часть — События и делегаты:
Тебе нужно объявить события в соответствующих классах:
- В классе Player:
- event Action<int> OnExperienceGained — вызывается с количеством полученного опыта
- event Action<int> OnLeveledUp — вызывается с новым уровнем
- event Action<int> OnDamageTaken — с количеством урона
- event Action<int> OnGoldChanged — с новым количеством золота
- В классе Monster:
- event Action<Monster> OnMonsterDefeated — вызывается с ссылкой на побежденного монстра
(чтобы знать, какой монстр умер)
- В классе Inventory:
- event Action<Item> OnItemAdded — вызывается с добавленным предметом
3. Класс AchievementSystem:
Это "наблюдатель", который подписывается на события всех объектов и разблокирует достижения.
Достижения для реализации:
- 1. "Новичок" — достичь 2-го уровня
- 2. "Опытный игрок" — достичь 5-го уровня
- 3. "Богач" — накопить 1000 золота
- 4. "Коллекционер" — собрать 10 разных предметов в инвентаре
- 5. "Охотник" — убить 5 монстров
- 6. "Охотник на драконов" — убить дракона
(подсказка: проверяй monster.Name == "Dragon" или введи свойство MonsterType)
Бонус-достижения (сложнее):
- 7. "Берсерк" — получить 100 единиц урона суммарно (не за раз, а общий накопленный урон)
- 8. "Живучий" — получить урон, но выжить с HP меньше 10%
(нужно отслеживать событие урона и проверять процент HP)
4. Что должен делать AchievementSystem:
- Хранить список разблокированных достижений (чтобы не выдавать повторно)
- Подписываться на события в конструкторе (ему передаются объекты)
- При срабатывании события проверять условия
- Если условие выполнено и достижение еще не выдано — выводить в консоль:
"ДОСТИЖЕНИЕ РАЗБЛОКИРОВАНО: Новичок (Достигните 2-го уровня)"
- Для достижений, требующих накопления (урон, монстры), нужно хранить прогресс
5. Требования к архитектуре:
- Игровые классы (Player, Monster, Inventory) не должны знать о AchievementSystem
- Система достижений должна уметь работать с несколькими игроками и монстрами (подписываться на каждого)
- Используй Action<T> или создай свои делегаты
Подсказки:
1. Для подписки:
player.LeveledUp += (newLevel) => CheckLevelUpAchievements(newLevel);
2. Для хранения прогресса:
private int totalDamageTaken = 0;
private int monstersKilled = 0;
private HashSet<string> unlockedAchievements = new HashSet<string>();
3. Для проверки уникальности:
if (!unlockedAchievements.Contains(achievementName))
{
UnlockAchievement(achievementName);
}
Критерии успеха:
- Игровые классы не знают о достижениях
- Достижения выдаются только один раз
- Система правильно считает прогресс (суммарный урон, количество убийств)
- Код использует события и делегаты (не вызывай методы AchievementSystem напрямую из игровых классов!)
- Легко добавить новое достижение (просто дописать проверку в нужном обработчике)