-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathGnomeSortTask.txt
More file actions
139 lines (106 loc) · 7.7 KB
/
Copy pathGnomeSortTask.txt
File metadata and controls
139 lines (106 loc) · 7.7 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
Система порядка хода в пошаговой RPG
Контекст:
Ты разрабатываешь пошаговую RPG. В бою порядок хода определяется инициативой персонажей.
Чем выше инициатива, тем раньше персонаж ходит. Но в процессе боя инициатива может меняться:
- Персонаж применил ускоряющее заклинание → инициатива повысилась
- Персонаж получил замедляющий эффект → инициатива понизилась
- Персонаж был оглушен → временно теряет ход
Каждый раз, когда инициатива меняется, список очередности хода должен быть пересортирован.
Но полная пересортировка сложными алгоритмами (QuickSort) — это избыточно, ведь изменения обычно небольшие.
Гномья сортировка идеально подходит для этого сценария, так как она эффективна для почти отсортированных списков.
Что нужно сделать:
1. Создай класс Combatant (участник боя)
У него должны быть:
- string Name - имя персонажа
- int Initiative - инициатива (определяет порядок хода, чем выше, тем раньше ходит)
- bool IsStunned - оглушен ли (если true, то пропускает ход)
- int Health - здоровье (для реализации эффектов)
- Метод ApplyEffect(EffectType effect, int value) - применяет эффект, меняющий инициативу
2. Создай перечисление EffectType
- Haste - ускорение (+инициатива)
- Slow - замедление (-инициатива)
- Stun - оглушение (IsStunned = true на N ходов)
3. Создай класс TurnOrder
Это главный класс, который управляет порядком хода. В нем должно быть:
- List<Combatant> combatants - список всех участников боя
- Метод SortByInitiative() - использует гномью сортировку для упорядочивания списка по убыванию инициативы
(от большего к меньшему)
- Метод UpdateInitiative(Combatant target, EffectType effect, int value) - изменяет инициативу цели,
применяет эффект, а затем вызывает сортировку для обновления порядка
- Метод GetNextTurn() - возвращает следующего участника, который может ходить (не оглушенного)
- Метод DisplayOrder() - выводит текущий порядок хода в консоль с красивым форматированием
4. Реализуй гномью сортировку
Алгоритм должен быть написан вручную, без использования List.Sort() или LINQ для сортировки
(LINQ можно использовать для вывода/поиска, но не для самой сортировки).
Как работает гномья сортировка:
index = 0
while index < list.Count:
if index == 0 or list[index] <= list[index - 1]:
index++
else:
swap(list[index], list[index - 1])
index--
Для сортировки по убыванию инициативы условие будет:
if index == 0 or list[index].Initiative <= list[index - 1].Initiative
5. Создай симуляцию боя в Main
1. Создай 5-7 участников с разной инициативой.
2. Выведи начальный порядок хода (после сортировки).
3. Сымитируй 10 ходов боя:
- Покажи, кто сейчас ходит.
- Случайным образом выбери эффект (ускорение, замедление, оглушение)
и примени к случайному участнику (или к текущему).
- Обнови порядок хода.
- Выведи новый порядок.
4. Обработай исключения (например, попытка применить эффект к мертвому участнику).
Пример вывода (как это должно выглядеть):
=== НАЧАЛО БОЯ ===
Порядок хода (инициатива):
1. Паладин (120)
2. Маг (115)
3. Лучник (100)
4. Гоблин (80)
5. Скелет (75)
--- ХОД 1 ---
Ходит: Паладин (инициатива 120)
Применен эффект: Ускорение на Паладина (+15 инициативы)
Инициатива Паладина: 120 -> 135
Обновленный порядок хода:
1. Паладин (135)
2. Маг (115)
3. Лучник (100)
4. Гоблин (80)
5. Скелет (75)
--- ХОД 2 ---
Ходит: Паладин (инициатива 135)
Применен эффект: Замедление на Гоблина (-20 инициативы)
Инициатива Гоблина: 80 -> 60
Обновленный порядок хода:
1. Паладин (135)
2. Маг (115)
3. Лучник (100)
4. Скелет (75)
5. Гоблин (60)
--- ХОД 3 ---
Ходит: Паладин (инициатива 135)
Применен эффект: Оглушение на Паладина
Паладин оглушен на 2 хода!
--- ХОД 4 ---
Ходит: Маг (инициатива 115)
...
Бонусные задания (по желанию):
1. Сохранение состояния боя:
Добавь возможность сохранить текущее состояние боя (порядок хода, здоровье, эффекты)
в JSON файл и загрузить его при старте программы. Используй сериализацию.
2. Таймер хода:
Добавь асинхронную задержку между ходами с помощью await Task.Delay(), чтобы бой шел не мгновенно, а с паузой.
3. События:
Создай событие OnInitiativeChanged, которое срабатывает при изменении инициативы.
Подпиши на него метод вывода в консоль.
4. Анимация сортировки:
Выводи в консоль процесс перестановок при гномьей сортировке,
чтобы было видно, как элементы "двигаются" к своим местам.
Требования к коду:
- Используй обработку ошибок (try-catch) для потенциальных проблем (null-ссылки, выход за границы списка).
- Реализуй интерфейс IEffectApplier с методом Apply(Combatant target) для разных типов эффектов
(не обязательно, но будет плюсом).
- Используй обобщения если создаешь вспомогательные классы.