-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStateTask.txt
More file actions
124 lines (91 loc) · 6.21 KB
/
StateTask.txt
File metadata and controls
124 lines (91 loc) · 6.21 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
Система поведения врага с конечным автоматом
Контекст
Ты получил задание от геймдизайнера:
"Нам нужно реализовать базовое поведение для врага в нашей RPG.
Враг должен уметь менять свое состояние в зависимости от ситуации.
Пока сделай простую версию: он может быть в состоянии покоя, преследования и атаки.
В будущем добавим больше состояний, поэтому система должна легко расширяться."
Техническое задание
Создай конечный автомат (FSM - Finite State Machine) для врага, используя паттерн Состояние (State).
Что нужно реализовать:
1. Базовые классы:
- Абстрактный класс EnemyState (или интерфейс IEnemyState)
- Класс Enemy (враг), который хранит текущее состояние и управляет им
2. Три конкретных состояния:
- IdleState (состояние покоя)
- ChaseState (преследование игрока)
- AttackState (атака)
3. У каждого состояния должны быть методы:
- Enter() — вызывается при входе в состояние
- Update() — вызывается каждый "тик" (в нашем случае — каждый вызов в цикле)
- Exit() — вызывается при выходе из состояния
Логика переходов между состояниями:
IdleState -> ChaseState
Условие: расстояние до игрока < 5 единиц
ChaseState -> AttackState
Условие: расстояние до игрока < 2 единиц
AttackState -> ChaseState
Условие: расстояние до игрока >= 2 единиц (игрок убежал)
AttackState -> IdleState (опционально)
Условие: игрок умер (можно добавить флаг IsAlive у игрока)
Структура классов:
1. Абстрактный класс EnemyState:
- protected Enemy enemy;
- public EnemyState(Enemy enemy)
- public abstract void Enter();
- public abstract void Update();
- public abstract void Exit();
2. Класс Enemy:
Поля:
- Name, Health, DetectionRange, AttackRange, MoveSpeed, X, Y, currentState
- IdleState, ChaseState, AttackState
Методы:
- ChangeState(EnemyState newState) - выход из старого состояния, вход в новое
- Update(Player player) - обновление текущего состояния
- MoveTowardsPlayer() - логика движения к игроку
- AttackPlayer() - логика атаки игрока
3. Класс Player:
Поля:
- Name, Health, X, Y, IsAlive
Методы:
- TakeDamage(float damage) - получение урона
- MoveTo(float x, float y) - перемещение игрока
- float GetDistanceTo(Enemy enemy) - расчет расстояния между игроком и врагом
Демонстрация в Main():
- Создать врага (например, "Гоблин") с параметрами
- Создать игрока с начальными координатами
- Смоделировать 10-15 шагов (итераций) игрового цикла
- В каждой итерации:
- Выводить текущее состояние врага
- Показывать расстояние до игрока
- Имитировать движение игрока
- Обновлять состояние врага
Визуализация: Каждое состояние должно выводить в консоль свои действия:
- IdleState: "Враг стоит на месте и осматривается..."
- ChaseState: "Враг бежит к игроку!" + движение
- AttackState: "Враг атакует игрока!" + нанесение урона
Проверка условий:
- При переходе в ChaseState вывести: "Враг заметил игрока!"
- При переходе в AttackState вывести: "Враг атакует!"
- При выходе из AttackState вывести: "Игрок убежал, враг продолжает преследование"
Бонус-задание (если сделаешь основное):
Добавь состояние DeadState (смерть врага), которое активируется, если здоровье врага <= 0.
Добавь возможность игроку атаковать врага (по нажатию клавиши, например, "A").
В состоянии смерти враг не двигается и не атакует.
Пример вывода программы:
[Итерация 1] Позиция игрока: (0, 0), врага: (10, 10)
Враг [Гоблин] в состоянии: Покой
Расстояние до игрока: 14.14
[Итерация 2] Игрок переместился к (6, 6)
Враг [Гоблин] в состоянии: Покой
Расстояние до игрока: 5.66
Враг заметил игрока!
[Итерация 3] Враг [Гоблин] в состоянии: Преследование
Враг бежит к игроку! Новая позиция: (8, 8)
Расстояние до игрока: 2.83
[Итерация 4] Враг [Гоблин] в состоянии: Преследование
Враг бежит к игроку! Новая позиция: (7, 7)
Расстояние до игрока: 1.41
Враг атакует!
[Итерация 5] Враг [Гоблин] в состоянии: Атака
Враг атакует игрока! Нанесено 10 урона. Здоровье игрока: 90