-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathQuickSortTask.txt
More file actions
87 lines (70 loc) · 5.56 KB
/
QuickSortTask.txt
File metadata and controls
87 lines (70 loc) · 5.56 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
Система рендеринга 2D-объектов по глубине (Painter's Algorithm)
Контекст:
Ты разрабатываешь 2D-игру в консоли (или любой другой рендеринг с 2D-спрайтами).
Игровой мир состоит из множества объектов, которые находятся на разных расстояниях от камеры.
Чтобы отрисовать сцену корректно, объекты, которые находятся дальше от камеры,
должны быть нарисованы перед теми, что ближе? Нет! На самом деле нужно сначала рисовать дальние объекты,
а затем ближние, чтобы ближние перекрывали дальние. Это называется алгоритм художника (Painter's Algorithm).
Визуализация:
Камера -> [Дальний объект] -> [Средний объект] -> [Ближний объект]
Порядок рендеринга: Сначала дальний, потом средний, потом ближний.
Твоя задача - создать систему, которая:
1. Хранит список рендеринг-объектов с их "глубиной" (Z-координата или расстояние до камеры).
2. Использует быструю сортировку (quicksort) для сортировки объектов по глубине от дальних к ближним
(по возрастанию глубины, если глубина = расстояние от камеры).
3. Выводит порядок отрисовки в консоль.
Что нужно сделать:
1. Создай класс RenderObject
У объекта должны быть:
- string Name - название объекта (например, "Tree", "Mountain", "Player", "Enemy").
- float Depth - глубина (расстояние от камеры). Чем больше значение, тем дальше объект.
2. Создай класс RenderQueue
Этот класс управляет сортировкой объектов:
- Хранит List<RenderObject>.
- Метод AddObject(RenderObject obj) для добавления.
- Метод SortByDepth() - выполняет быструю сортировку массива объектов по полю Depth в порядке возрастания
(дальние сначала, ближние потом).
- Метод Render() - выводит порядок отрисовки.
3. Реализуй быструю сортировку
Ты должен написать свой метод QuickSort (или QuickSortRecursive),
который сортирует массив (или список) объектов по Depth.
Не используй Array.Sort или List.Sort - задача именно в реализации алгоритма.
Требования:
- Используй рекурсию.
- Выбери опорный элемент (pivot) - например, средний элемент или последний.
- Раздели массив на элементы меньше опорного и больше/равные опорному.
- Рекурсивно отсортируй обе части.
4. Добавь обработку ошибок
- Проверка на null объекты в списке.
- Защита от пустого списка.
- Использование try-catch для потенциальных ошибок (например, если при сортировке что-то пошло не так).
5. Используй обобщения (Generics)
Сделай метод сортировки обобщенным, чтобы в будущем можно было сортировать не только RenderObject,
но и другие типы. Например:
public static void QuickSort<T>(List<T> list, int left, int right, IComparer<T> comparer)
6. Создай тестовую сцену в Main
Создай 8-10 объектов с разной глубиной (например, от 1 до 100). Выведи:
- Список объектов до сортировки (в порядке добавления).
- Список объектов после сортировки (порядок отрисовки).
Пример вывода:
=== ДО СОРТИРОВКИ (порядок добавления) ===
1. Mountain (Depth: 100)
2. Tree (Depth: 50)
3. Player (Depth: 10)
4. Enemy (Depth: 20)
5. Cloud (Depth: 80)
=== ПОСЛЕ СОРТИРОВКИ (порядок отрисовки: от дальних к ближним) ===
1. Mountain (Depth: 100) // рисуем первым
2. Cloud (Depth: 80)
3. Tree (Depth: 50)
4. Enemy (Depth: 20)
5. Player (Depth: 10) // рисуем последним, поверх всех
Важные ограничения:
- Обязательно использовать быструю сортировку, написанную вручную.
- Можно использовать:
- Обработка ошибок (Exceptions)
- Обобщения (Generics)
- Коллекции (List, массивы)
- Перечисления (enum для типов объектов)
- Делегаты
- Компараторы