-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStructuresTask.txt
More file actions
63 lines (54 loc) · 4.83 KB
/
StructuresTask.txt
File metadata and controls
63 lines (54 loc) · 4.83 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
Задача: "Звездный Курьер: Оптимизация данных корабля"
Контекст (Легенда заказа):
Ты устроился на работу в небольшую студию, которая делает космический симулятор "Star Courier".
Игрок управляет кораблем, летает между станциями и перевозит грузы.
Сеньор-разработчик изучил профилировщик и обнаружил проблему:
в игре создается огромное количество временных объектов, когда система рассчитывает полет пуль,
столкновения или позиции дронов. Это вызывает микро-фризы из-за сборщика мусора.
Он дал тебе задание: переделать хранение ключевых игровых данных с классов на структуры,
чтобы снизить нагрузку на кучу (heap). Но нужно сделать это правильно, не сломав логику.
Техническое задание:
1. Создай структуру Spaceship (вместо класса).
Она должна хранить минимальные данные о корабле игрока:
- string ShipName (название корабля).
- int Health (текущее здоровье).
- int MaxHealth (максимальное здоровье).
- float Speed (скорость).
2. Создай структуру CargoItem (тип груза). Это значение должно быть легковесным:
- string ItemName (название, например: "Золото", "Руда", "Контрабанда").
- int Quantity (количество).
- float PricePerUnit (цена за единицу).
3. Создай класс Player. Почему класс?
Потому что игрок в игре один, и мы спокойно можем хранить ссылку на него.
У класса Player должны быть:
- Ссылка на структуру Spaceship (композиция: Has-A).
- Коллекция List<CargoItem> для хранения груза в трюме.
- Метод TakeDamage(int damage), который уменьшает Health корабля.
- Метод AddCargo(CargoItem newCargo), который добавляет груз в список
(или увеличивает количество, если такой груз уже есть).
4. Создай структуру DamageReport. Это будет результат вычислений, который возвращает метод атаки.
Она должна быть структурой, чтобы не создавать временные объекты в куче.
- int DamageDealt (сколько урона нанесено).
- bool IsCriticalHit (был ли крит).
- Метод void PrintReport(), который выводит в консоль цветное сообщение
(зеленым, если крит, красным, если нет).
5. Создай статический класс CombatCalculator
- Создай метод DamageReport CalculateDamage(float shipSpeed, Random rnd).
Логика:
- Базовый урон = 10 + (int)shipSpeed.
- Шанс крита 30% (используй rnd.NextDouble()).
- Если крит, урон умножается на 2.
- Метод должен возвращать экземпляр структуры DamageReport, а не void.
6. Главный метод Main (или тестовый код):
- Создай экземпляр структуры Spaceship через конструктор (название, хп, скорость).
- Создай экземпляр класса Player, передай ему корабль.
- Добавь пару предметов в инвентарь игрока (AddCargo).
- Покажи информацию о корабле и грузе.
- Создай объект Random.
- В цикле (например, 3 раза) симулируй получение урона:
- Вызови CombatCalculator.CalculateDamage(player.MyShip.Speed, rnd).
Ты получишь структуру DamageReport.
- Вызови report.PrintReport().
- Если урон был нанесен (DamageDealt > 0), вызови player.TakeDamage(report.DamageDealt).
- Выведи текущее здоровье корабля игрока.
- Если здоровье корабля стало <= 0, прерви цикл.