-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCocktailSortTask.txt
More file actions
144 lines (118 loc) · 9.5 KB
/
CocktailSortTask.txt
File metadata and controls
144 lines (118 loc) · 9.5 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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
Название задачи: "Система слоев объектов в 2D игре"
Контекст:
В 2D игре с видом сверху (RPG, стратегии) очень важен правильный порядок отрисовки объектов.
Чем выше Y-координата (чем ниже объект на экране), тем позже он должен отрисовываться,
чтобы перекрывать объекты с меньшим Y.
У нас есть динамический мир: игрок ходит, NPC перемещаются, появляются новые предметы.
Массив объектов постоянно меняется, но остается почти отсортированным,
так как большинство объектов статичны (деревья, дома), а двигаются только 1-2 объекта.
Шейкерная сортировка идеально подходит для такого случая,
так как эффективно работает с почти отсортированными данными.
Техническое задание
Реализовать систему, которая:
1. Создает список игровых объектов с разными Y-координатами.
2. Демонстрирует, как шейкерная сортировка упорядочивает объекты по возрастанию Y.
3. Показывает преимущество шейкерной сортировки над пузырьковой на почти отсортированных данных.
4. Визуализирует процесс сортировки (опционально).
Структура проекта
1. Класс GameObject
Представляет игровой объект на сцене.
Поля/Свойства:
- Id (int) — уникальный идентификатор объекта (генерируется автоматически)
- Name (string) — название объекта (например "Дуб", "Герой", "Зелье")
- Type (string или enum) — тип объекта ("Tree", "Rock", "Player", "NPC", "Item")
- Y (float) — Y-координата (определяет слой отрисовки)
Статическое поле:
- _nextId (static int) — счетчик для генерации уникальных ID
Конструктор:
- Принимает: name, type, y
- Автоматически присваивает Id (использует _nextId++)
Методы:
- ToString() — переопределен, возвращает строку вида [ID:X] Type:Name (Y=Y:F2)
2. Класс SortingStats
Служебный класс для сбора статистики сортировки.
Поля/Свойства:
- Comparisons (int) — количество сравнений элементов
- Swaps (int) — количество обменов элементов
Методы:
- Reset() — обнуляет счетчики
- Display() — выводит статистику в консоль
3. Класс RenderSystem
Основной класс, управляющий списком объектов и сортировкой.
Поля:
- _objects (List<GameObject>) — хранилище игровых объектов
Методы:
- Управление объектами:
- AddObject(GameObject obj) — добавляет объект в список
- GetObjectsCopy() — возвращает копию списка (для экспериментов)
- LoadObjects(List<GameObject> objects) — загружает список из копии
- Сортировка:
- CocktailSort(bool showSteps = false, SortingStats stats = null) — шейкерная сортировка
- Принимает флаг показа шагов и объект статистики
- Сортирует _objects по полю Y (по возрастанию)
- Возвращает количество сравнений и обменов (через stats или напрямую)
- BubbleSort(bool showSteps = false, SortingStats stats = null) — пузырьковая сортировка (для сравнения)
- Аналогичная сигнатура
- Вспомогательные методы:
- IsSorted() — проверяет, отсортирован ли список по Y (возвращает bool)
- Shuffle() — случайно перемешивает список (для тестов)
- DisplayOrder(string title) — выводит текущий порядок объектов с заголовком
- DisplayAsLine() — выводит только значения Y в одну строку (для наглядности процесса сортировки)
- Игровая логика:
- SimulateMovement() — имитирует движение объектов
- Находит объекты с типом "Player" и "NPC"
- Случайно изменяет их Y на небольшую величину (±0.5)
- Выводит информацию о перемещении
4. Класс Program (точка входа)
Содержит метод Main и реализует демонстрацию.
Структура метода Main:
1. Создание объектов
- Создать RenderSystem
- Добавить 10-15 объектов с разными Y (в хаотичном порядке)
- Использовать разные типы: "Tree", "Rock", "Player", "NPC", "Item"
2. Демонстрация 1: Сортировка хаотичного списка
- Показать исходный неотсортированный список
- Применить шейкерную сортировку с выводом статистики
- Показать отсортированный список
3. Демонстрация 2: Сравнение с пузырьковой сортировкой
- Создать копию исходного списка
- Отсортировать копию пузырьковой сортировкой
- Сравнить количество операций (сравнений и обменов)
4. Демонстрация 3: Преимущество на почти отсортированных данных
- Взять отсортированный список
- Применить SimulateMovement() к 2-3 объектам
- Показать состояние "почти отсортированного" списка
- Отсортировать шейкером и пузырьком на копиях
- Сравнить статистику и показать преимущество шейкерной сортировки
5. Бонус (опционально):
- Сравнить эффективность на разных размерах списка (10, 50, 100 элементов)
- Измерить время выполнения через Stopwatch или DateTime
5. Вспомогательные методы (можно вынести в отдельный класс ConsoleHelper) (Если скучно...)
- PressAnyKey() — ожидает нажатия клавиши с сообщением
- WriteColored(string text, ConsoleColor color) — вывод цветного текста
- DrawSeparator() — рисует разделительную линию
Пример потока выполнения в Main (Если не понятно...):
1. Инициализация
- Создание RenderSystem
- Добавление объектов (Tree, Rock, Player, NPC, Item) с разными Y
2. Блок 1: Сортировка хаотичного списка
- DisplayOrder("Исходный список (неотсортированный)")
- CocktailSort(showSteps: true) с выводом статистики
- DisplayOrder("После шейкерной сортировки")
3. Блок 2: Сравнение алгоритмов на хаотичном списке
- Создать копию исходного списка
- BubbleSort() на копии
- Сравнить статистику с шейкером
4. Блок 3: Преимущество на почти отсортированных данных
- Взять отсортированный список
- SimulateMovement() (меняем Y у Player и NPC)
- DisplayOrder("После движения (почти отсортировано)")
- CocktailSort() на одной копии
- BubbleSort() на другой копии
- Вывести сравнение эффективности
5. Завершение
- PressAnyKey()
Важные требования
- НЕ использовать встроенную сортировку C# (только свою реализацию)
- Обязательно выводить количество сравнений и обменов
- Показать, почему шейкерная сортировка эффективнее пузырьковой на почти отсортированных данных