-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInsertionSortTask.txt
More file actions
71 lines (60 loc) · 4.91 KB
/
InsertionSortTask.txt
File metadata and controls
71 lines (60 loc) · 4.91 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
Система рейтинга игроков (Leaderboard)
Контекст:
Ты разрабатываешь консольную онлайн-игру (например, RPG или аркаду).
Игроки после прохождения уровня получают очки опыта (XP).
Тебе нужно реализовать систему таблицы рекордов (лидерборд),
которая поддерживает динамическое обновление — когда игрок получает новые очки,
его позиция пересчитывается в реальном времени.
Ключевая механика:
Каждый раз, когда игроку начисляются очки (или он заходит в игру), таблица сортируется заново.
Но не любым способом, а именно сортировкой вставками, потому что:
- Данные почти отсортированы (новый результат вставляется в уже отсортированный список)
- Сортировка вставками оптимальна для таких сценариев (O(n) в лучшем случае)
Что нужно сделать:
1. Создай класс Player
У него должны быть:
- int Id (уникальный идентификатор)
- string Name (имя игрока)
- int TotalXP (общее количество очков опыта)
- DateTime LastPlayed (дата последней игры)
2. Создай класс Leaderboard
Который управляет коллекцией игроков и поддерживает их в отсортированном по убыванию XP состоянии.
Методы:
1. AddPlayer(Player player)
- Добавляет нового игрока и сортирует список сортировкой вставками (используя его XP)
- Сложность: список должен оставаться отсортированным ПОСЛЕ добавления
- Важно: нельзя использовать List.Sort() или LINQ OrderBy
2. UpdatePlayerXP(int playerId, int additionalXP)
- Находит игрока по ID (используй Find или цикл)
- Увеличивает его XP
- Затем перемещает игрока в правильную позицию используя сортировку вставками
(но только для этого одного элемента!)
- Подсказка: удали элемент из списка, измени XP, затем вставь его в правильное место
3. GetTopPlayers(int count)
- Возвращает первых count игроков (топ по XP)
- Используй yield return для итерации
4. PrintLeaderboard()
- Выводит таблицу с местами, именами и XP
- Используй форматирование (столбцы)
3. Дополнительные требования:
- Обработка ошибок (Exceptions):
- При попытке добавить игрока с уже существующим ID выбрасывай ArgumentException
- При попытке обновить несуществующего игрока выбрасывай KeyNotFoundException
- Управление ресурсами (IDisposable):
- Сделай класс Leaderboard реализующим IDisposable
- В методе Dispose() очищай коллекцию и выводи сообщение в консоль
- Используй using в Main
- Делегаты и события:
- Создай событие OnLeaderboardChanged
- Оно должно срабатывать при добавлении игрока и обновлении XP
- Подпишись в Main и выводи сообщение "Таблица обновлена!"
- Async/await (базово):
- Сделай метод SimulatePlayerActivityAsync() который имитирует активность игроков:
- Каждые 2 секунды выбирает случайного игрока и добавляет ему XP (используя UpdatePlayerXP)
- Используй Task.Delay и CancellationToken для возможности остановки
4. В Main реализуй:
1. Добавь начальных игроков
2. Покажи таблицу PrintLeaderboard()
3. Симулируй активность игроков SimulatePlayerActivityAsync()
4. Покажи финальную таблицу
5. Выведи топ-3 игрока