-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPatternObserverTask.txt
More file actions
77 lines (62 loc) · 5.1 KB
/
PatternObserverTask.txt
File metadata and controls
77 lines (62 loc) · 5.1 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
Система Достижений (Achievements) для RPG
Контекст:
Ты разрабатываешь RPG игру. Геймдизайнер просит реализовать систему достижений.
Достижения должны автоматически отслеживать действия игрока
(убийство монстров, сбор предметов, прохождение уровней) и оповещать игрока, когда достижение получено.
Самое главное - система должна быть расширяемой.
Сегодня у нас 3 достижения, завтра их может стать 50, и мы не хотим переписывать код каждого действия игрока.
Для этого используем паттерн Наблюдатель.
Что нужно сделать:
1. Создай класс GameEvent (enum) - события, которые происходят в игре:
- MonsterKilled, ItemCollected, LevelCompleted
2. Создай класс GameEventData - содержит информацию о событии:
- GameEventType Type
- string TargetName - Кто/что убито/собрано
- int Value - Количество (для прогресса)
3. Реализуй паттерн Наблюдатель через интерфейсы:
- Интерфейс IObserver - подписчик на события.
Содержит метод void OnNotify(GameEventData eventData).
- Класс EventManager - центральный диспетчер событий (издатель).
Содержит:
- Dictionary<GameEventType, List<IObserver>> _subscribers
- Метод Subscribe(GameEventType eventType, IObserver observer) - подписка на событие.
- Метод Unsubscribe(GameEventType eventType, IObserver observer) - отписка.
- Метод Notify(GameEventData eventData) - уведомление всех подписчиков на данный тип события.
4. Создай три класса-достижения (подписчики), каждый реализует IObserver:
1. Kill10MonstersAchievement
Условие: Получить 10 событий MonsterKilled (суммарно)
Сообщение при получении: "Достижение получено: Истребитель (убито 10 монстров)"
2. Collect3ItemsAchievement
Условие: Получить 3 события ItemCollected
Сообщение при получении: "Достижение получено: Коллекционер (собрано 3 предмета)"
3. FirstBloodAchievement
Условие: Получить одно событие MonsterKilled
Сообщение при получении: "Достижение получено: Первая кровь"
- Каждый класс должен вести внутренний счетчик (для первых двух).
- Достижение считается полученным только один раз.
После получения оно перестает реагировать на события
(не увеличивает счетчик, не выводит сообщение повторно).
5. В методе Main продемонстрируй работу:
- Создай EventManager.
- Создай экземпляры всех трех достижений.
- Подпиши их на нужные типы событий.
- Сымитируй игровые события:
- manager.Notify(new GameEventData { Type = GameEventType.MonsterKilled, TargetName = "Гоблин", Value = 1 });
- После получения каждого достижения должно выводиться сообщение в консоль.
Бонус (по желанию):
Добавь класс UIPopupObserver, который подписывается на все типы событий и просто выводит в консоль:
[UI] Событие: MonsterKilled | Гоблин
[UI] Событие: ItemCollected | Зелье
[UI] Событие: LevelCompleted | Подземелье
Это покажет, что один подписчик может слушать несколько типов событий.
Пример ожидаемого вывода:
[UI] Событие: MonsterKilled | Гоблин
[UI] Событие: MonsterKilled | Орк
[UI] Событие: MonsterKilled | Тролль
Достижение получено: Первая кровь
[UI] Событие: ItemCollected | Зелье
[UI] Событие: ItemCollected | Меч
[UI] Событие: ItemCollected | Щит
Достижение получено: Коллекционер (собрано 3 предмета)
[UI] Событие: MonsterKilled | Дракон
Достижение получено: Истребитель (убито 10 монстров)