-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathInterfacesTask.txt
More file actions
60 lines (52 loc) · 5.12 KB
/
InterfacesTask.txt
File metadata and controls
60 lines (52 loc) · 5.12 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
Задача: Система взаимодействия с объектами в игре "Космическая база"
Контекст (Как будто ты получил ТЗ от геймдизайнера):
Мы делаем прототип игры, где игрок управляет роботом-инженером на космической базе.
На базе есть разные объекты: топливные цистерны, ящики с припасами и вражеские дроны.
Игрок может подойти к объекту и нажать кнопку "E" (взаимодействовать).
Но реакция объекта зависит от его типа:
1. Топливная цистерна должна взорваться, нанеся урон игроку.
2. Ящик с припасами должен дать игроку опыт (XP) и исчезнуть.
3. Враждебный дрон должен атаковать игрока в ответ.
Также у нас есть требование:
в будущем мы добавим еще 100 видов объектов, с которыми можно взаимодействовать.
Код должен быть легким для расширения.
Механика, которая отличается от предыдущих:
В предыдущих практиках у тебя были бои с фиксированными правилами.
Здесь мы вводим интерфейс IInteractable. Мы не знаем как объект реагирует, мы просто говорим:
"Ты, объект, должен уметь реагировать на взаимодействие".
Техническое задание
1. Создай интерфейс IInteractable:
- Он должен содержать только объявление метода void Interact(Player player).
- (Здесь проявляется суть интерфейса — просто контракт).
2. Создай класс Player (Игрок):
- Свойства: string Name, int Health, int XP.
- Метод void TakeDamage(int damage) (уменьшает здоровье и выводит сообщение).
- Метод void AddXP(int amount) (увеличивает XP и выводит сообщение).
- Метод void ShowStats() (выводит текущее здоровье и опыт).
3. Создай несколько классов, реализующих интерфейс IInteractable:
- Класс FuelTank (Топливная цистерна):
- Свойство int Damage (например, 20).
- В методе Interact(Player player) цистерна "взрывается":
игрок получает урон (player.TakeDamage(Damage)), а в консоль выводится сообщение:
"Бздыщ! Цистерна взорвалась!".
- Класс SupplyCrate (Ящик с припасами):
- Свойство int XPReward (например, 50).
- В методе Interact(Player player) ящик открывается:
игрок получает опыт (player.AddXP(XPReward)), а в консоль выводится сообщение:
"*Вы нашли припасы! +50 XP*".
- Класс EnemyDrone (Враждебный дрон):
- Свойства: int Health (например, 30), int Damage (например, 10).
- В методе Interact(Player player) дрон атакует игрока в ответ:
игрок получает урон (player.TakeDamage(Damage)), дрон получает урон от ответной атаки игрока
(уменьши свое здоровье Health на 5, например), если здоровье дрона становится <= 0, вывести сообщение
"Дрон уничтожен", иначе вывести сообщение "Дрон контратакует!".
4. Логика игры (метод Main или отдельный метод GameLoop):
- Создай объект Player (например, с именем "R2D2", здоровьем 100, опытом 0).
- Создай список (List<IInteractable>) или массив объектов на базе.
Помести туда по одному экземпляру каждого класса: new FuelTank(), new SupplyCrate(), new EnemyDrone().
- (Используй полиморфизм — мы работаем с объектами через интерфейс).
- Запусти цикл прохода по этому списку.
Для каждого объекта вызови его метод Interact,
передавая ему ссылку на нашего игрока.
- После окончания взаимодействия со всеми объектами вызови player.ShowStats(),
чтобы увидеть финальное состояние игрока.