-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMergeSortTask.txt
More file actions
95 lines (75 loc) · 6.16 KB
/
MergeSortTask.txt
File metadata and controls
95 lines (75 loc) · 6.16 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
Система сортировки реплеев
Контекст
Ты разрабатываешь консольную игру-файтинг (или шутер, или RPG — не важно).
В игре есть система записи реплеев — боев, которые сохраняются на диск.
Продвинутые игроки хотят просматривать свои реплеи, отсортированные по разным критериям:
дата, продолжительность, нанесенный урон, количество комбо.
Геймдизайнер дал задание: реализовать систему сортировки реплеев,
используя сортировку слиянием (не LINQ OrderBy!) для демонстрации понимания алгоритмов.
При этом система должна быть гибкой, чтобы можно было добавлять новые критерии сортировки.
Что нужно сделать
1. Создай класс Replay
У реплея должны быть следующие поля/свойства:
- string Id - уникальный идентификатор (GUID)
- DateTime Date - дата и время боя
- string OpponentName - имя противника (или "Bot" для бота)
- float DurationSeconds - длительность боя в секундах
- int DamageDealt - нанесенный урон
- int MaxCombo - максимальное комбо
- bool IsVictory - победа или поражение
- string FilePath - путь к файлу реплея на диске
2. Создай класс ReplayManager
Это основной класс для работы с реплеями.
Требования:
- Используй List<Replay> или массив для хранения реплеев.
- Реализуй метод LoadReplays(string folderPath) - загружает реплеи из папки (сериализация JSON).
Каждый реплей - отдельный JSON-файл.
- Реализуй метод SaveReplay(Replay replay, string folderPath) - сохраняет реплей в JSON.
- Реализуй метод SortReplays(IComparer<Replay> comparer) - сортирует реплеи алгоритмом сортировки слиянием,
используя переданный компаратор.
3. Реализуй MergeSort
Твоя задача - написать свою реализацию сортировки слиянием, а не использовать List.Sort или LINQ.
- public static void MergeSort<T>(List<T> list, IComparer<T> comparer) { }
Это должен быть обобщенный метод, работающий с любым типом и любым компаратором.
4. Создай компараторы (IComparer<Replay>)
Реализуй несколько компараторов для сортировки:
- DateComparer - по дате (новые сверху или старые сверху — выбор)
- DurationComparer - по длительности (короткие сверху)
- DamageComparer - по урону (больше урона сверху)
- VictoryFirstComparer - сначала победы, потом поражения
- CompositeComparer - комбинированный (например, сначала победы, потом по урону)
5. Работа с файлами и сериализация
- Используй System.Text.Json или Newtonsoft.Json для сериализации реплеев.
- При загрузке из папки обрабатывай ошибки (отсутствие папки, поврежденный JSON) через try-catch.
- Используй IDisposable для работы с файловыми потоками (или using).
6. Демонстрация в Main
Создай:
- 10-15 тестовых реплеев (можно сгенерировать случайно с помощью Random)
- Сохрани их в папку Replays/
- Загрузи их обратно через ReplayManager
- Покажи сортировку каждым компаратором
- Выведи результаты в красивой таблице (можно с помощью форматирования строк)
Бонус-задание (если будет легко)
1. Стабильность сортировки:
Добавь в MergeSort поддержку стабильности (stable sort)
если два элемента равны по критерию, они должны сохранять исходный порядок.
2. Прогресс-бар:
При сортировке большого количества реплеев выводи прогресс в консоль (используй \r для обновления строки).
3. Фильтрация:
Добавь метод GetReplaysByPredicate(Func<Replay, bool> predicate)
возвращает отфильтрованную коллекцию (без LINQ, используй итераторы).
Ожидаемый пример вывода
Загружено 15 реплеев из папки Replays/
=== Сортировка по дате (новые сверху) ===
[2025-03-25 18:30] DragonSlayer (Victory) - 45 сек, 2350 урона, комбо 12
[2025-03-24 22:15] Bot (Defeat) - 23 сек, 890 урона, комбо 5
...
=== Сортировка по урону (больше сверху) ===
[2025-03-20 14:00] TheDestroyer (Victory) - 127 сек, 8470 урона, комбо 28
[2025-03-25 18:30] DragonSlayer (Victory) - 45 сек, 2350 урона, комбо 12
...
=== Сортировка: сначала победы, потом по урону ===
1. [Victory] TheDestroyer - 8470 урона
2. [Victory] DragonSlayer - 2350 урона
3. [Defeat] Bot - 890 урона
...