-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathRefAndOutTask.txt
More file actions
94 lines (81 loc) · 7.51 KB
/
RefAndOutTask.txt
File metadata and controls
94 lines (81 loc) · 7.51 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
Техническое задание (ТЗ): "Система модификации статистики персонажа"
Контекст:
В игре есть система временных усилений (баффов) и ослаблений (дебаффов),
которые применяются к персонажу игрока. Например,
"Зелье ярости" увеличивает силу на 15 единиц, а проклятие "Слабость" уменьшает ловкость на 10 единиц.
Мы не хотим создавать новые объекты статистики каждый раз,
а хотим модифицировать существующие напрямую для производительности.
Задача:
Реализовать ядро системы модификации характеристик.
У нас есть базовая структура CharacterStats (сильно упрощенная версия),
которую нельзя превращать в класс по соображениям производительности
(она часто копируется в большие массивы для вычислений ИИ).
Вам нужно написать набор методов для работы с этой структурой.
Требования:
1. Структура CharacterStats (данная):
- int Health (Здоровье)
- int Mana (Мана)
- int Strength (Сила)
- int Agility (Ловкость)
- int Intelligence (Интеллект)
- Реализовать метод PrintStats(), который красиво выводит все stats в консоль.
2. Метод ApplyPotion (модификация через ref):
- Назначение: Применяет эффект зелья, которое гарантированно усиливает характеристику.
- Сигнатура:
void ApplyPotion(ref CharacterStats stats, string statName, int power)
- Логика: Метод принимает ссылку на структуру stats,
название модифицируемой характеристики (например, "Strength") и силу эффекта (power).
Метод находит нужную характеристику по имени и увеличивает её на значение power.
Если statName не найден, выводит предупреждение в консоль.
- Особенность (ref):
Мы гарантируем, что структура уже инициализирована и мы её только меняем.
Ключевое слово ref используется для явного указания,
что метод работает с оригинальной структурой, а не с её копией.
3. Метод TryApplyCurse (модификация и проверка через out):
- Назначение:
Пытается применить проклятие, которое ослабляет характеристику.
Проклятие может "не сработать" (например, если цель имеет иммунитет).
- Сигнатура:
bool TryApplyCurse(CharacterStats baseStats, string statName, int power, out CharacterStats cursedStats)
- Логика:
Метод принимает копию исходных stats, название характеристики и силу проклятия.
Он создаёт модифицированную копию, где нужная характеристика уменьшена на power.
- Возвращаемое значение (bool):
true, если проклятие успешно applied,
false — если цель неуязвима
(для простоты: с шансом 50% или если Health < 20).
- Выходной параметр (out CharacterStats cursedStats):
В этом параметре метод обязан присвоить значение — либо модифицированную копию,
либо неизменённую (если проклятие не сработало).
Вызывающий код получает через этот параметр результат операции.
- Особенность (out):
Параметр cursedStats используется для возврата дополнительного результата (нового состояния),
в то время как основной результат (успех/неудача) возвращается классическим return.
4. Метод SwapStats (обмен через ref):
- Назначение:
Реализовать магический навык "Перераспределение",
который меняет местами значения двух характеристик у цели.
- Сигнатура:
void SwapStats(ref CharacterStats stats, string firstStatName, string secondStatName)
- Логика:
Метод находит две характеристики по именам и меняет их значения местами.
Используйте локальную временную переменную. Если какой-либо statName не найден, операция не выполняется.
Критерии приемки (Acceptance Criteria):
- Код компилируется без ошибок.
- Создан экземпляр структуры CharacterStats для тестового героя
(задайте начальные значения, например: Health=100, Strength=15, Agility=10, etc.).
- Написана наглядная демонстрация (Main метод):
1. Вывод исходных характеристик.
2. Применение ApplyPotion к "Strength" и вывод результата (должно измениться).
3. Попытка применить TryApplyCurse к "Agility".
Вывод в консоль: "Проклятие сработало: [ДА/НЕТ]" и новых характеристик (через out параметр).
4. Применение SwapStats между, например, "Strength" и "Intelligence". Вывод результата.
- Демонстрируется понимание разницы:
ref модифицирует переданную переменную,
а out позволяет вернуть новое значение в переменную, объявленную в вызывающем коде.
Советы по реализации:
- Используйте switch выражение или if-else для выбора характеристики по statName.
- В TryApplyCurse для "шанса 50%" используйте класс Random.
- В SwapStats используйте картежи (x, y) = (y, x)
- Убедитесь, что в методе с out параметром вы присваиваете значение cursedStats
во всех возможных путях выполнения метода (в ветках if и else).