-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTreeSortTask.txt
More file actions
75 lines (58 loc) · 5.82 KB
/
TreeSortTask.txt
File metadata and controls
75 lines (58 loc) · 5.82 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
Система квестов с приоритетами
Контекст:
В RPG-игре у игрока есть журнал квестов. Квесты могут быть активными, выполненными или проваленными.
Геймдизайнер хочет, чтобы квесты отображались в определенном порядке, но не просто по дате получения,
а по приоритету выполнения.
Приоритет вычисляется динамически на основе:
- Срочности (дедлайн: чем меньше осталось времени, тем выше приоритет)
- Важности (награда: золото/опыт)
- Статуса (активные квесты важнее проваленных, но выполненные должны быть в конце списка)
Игрок должен видеть отсортированный список квестов в реальном времени при изменении любого параметра
(например, прошел день — срочность изменилась).
Что нужно сделать:
1. Создай класс Quest
- int Id (уникальный идентификатор)
- string Title (название квеста)
- QuestStatus Status (enum: Active, Completed, Failed)
- int BasePriority (базовый приоритет от 1 до 10, задается геймдизайнером)
- int Urgency (срочность: сколько дней осталось до дедлайна; чем меньше число, тем выше срочность)
- int Reward (награда в золоте)
2. Создай класс QuestJournal
- Хранит список квестов (List<Quest>)
- Реализует сортировку с помощью Tree sort
- Важно: Реализуй дерево самостоятельно — не используй SortedSet или SortedDictionary из C#.
Создай класс QuestTree или внутреннюю структуру узла.
3. Логика сравнения квестов
- Сортировка должна быть по динамическому приоритету, который вычисляется по формуле:
DynamicPriority = BasePriority + (100 / Urgency) + (Reward / 100)
(Или придумай свою формулу, главное — чтобы приоритет менялся при изменении срочности)
- Чем выше DynamicPriority — тем выше в списке должен быть квест
- Если приоритеты равны — сортировать по Id (кто раньше получен).
4. Методы в QuestJournal
- AddQuest(Quest quest) — добавить квест в журнал (использует Tree sort для вставки).
- RemoveQuest(int id) — удалить квест по Id.
- UpdateQuestUrgency(int id, int newUrgency) — обновить срочность
(например, прошел игровой день) и пересортировать список (перестроить дерево или перевставить элемент).
- GetSortedQuests() — вернуть отсортированный список квестов.
- DisplayQuests() — вывести квесты в отсортированном порядке с их динамическим приоритетом.
5. Реализация Tree sort
- Создай класс QuestNode с полями: Quest Data, QuestNode Left, QuestNode Right.
- Реализуй вставку в бинарное дерево поиска (BST) на основе DynamicPriority (и Id как вторичный ключ).
- Реализуй симметричный обход (in-order traversal) для получения отсортированного списка.
- Важно: При изменении приоритета квеста (например, из-за обновления срочности)
узел может оказаться не на своем месте. Реализуй удаление узла и повторную вставку
(или полное перестроение дерева).
Бонусные задания (если будет легко):
1. Сериализация (JSON) — сохраняй журнал квестов в файл quests.json и загружай из него при старте.
Используй System.Text.Json или Newtonsoft.Json.
2. Обработка ошибок — добавь обработку ситуаций:
- Попытка добавить квест с уже существующим Id
- Попытка обновить несуществующий квест
- Пустое дерево при DisplayQuests()
3. Делегаты и события — добавь событие OnQuestUpdated, которое срабатывает при изменении любого квеста.
Пусть в консоль выводится сообщение: "Квест 'X' изменил приоритет с Y на Z".
Важные ограничения:
- Не использовать SortedSet, SortedDictionary или List.Sort() для основной логики.
Только твоя реализация Tree sort.
- Можно использовать LINQ только для вывода или необязательных операций
(например, для поиска при удалении, если не хочешь делать удаление через дерево).