-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPatternBehaviorTreeTask.txt
More file actions
86 lines (70 loc) · 5.66 KB
/
PatternBehaviorTreeTask.txt
File metadata and controls
86 lines (70 loc) · 5.66 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
Система ИИ для патрулирующего охранника
Контекст:
Ты разрабатываешь стелс-игру. Нужно реализовать ИИ для охранника, который патрулирует территорию.
Геймдизайнер хочет, чтобы поведение было гибким и легко расширяемым.
Поведенческое дерево идеально подходит для этой задачи.
Что нужно сделать:
Реализовать базовую структуру Behavior Tree и создать ИИ охранника, который:
1. Патрулирует между точками (двигается от одной точки к другой).
2. Если видит игрока - переходит в режим "тревога" (выводит сообщение "Враг обнаружен!" и начинает преследование).
3. Если игрок скрылся — возвращается к патрулированию через некоторое время.
Техническое задание:
1. Создай базовые классы для Behavior Tree:
- abstract class BTNode
- enum NodeState
- Running - Узел еще выполняется
- Success - Узел выполнен успешно
- Failure - Узел выполнен с ошибкой
- abstract NodeState Evaluate()
- Композитные узлы (Sequence, Selector) - выполняют дочерние узлы
- Sequence : BTNode - "И": все дети должны вернуть Success
- Selector : BTNode - "ИЛИ": первый успешный ребенок
- Декоратор (Inverter) - инвертирует результат
- Inverter : BTNode - Меняет Success на Failure и наоборот
- Условие (Condition) - проверяет какое-то условие
- Condition : BTNode
- Действие (Action) — выполняет какое-то действие
- ActionNode : BTNode
2. Создай класс GuardAI, который будет содержать:
- Список точек патрулирования (List<Vector2> или просто координаты).
- Текущую цель (игрока).
- Состояние "видит ли игрока".
- Состояние "в тревоге".
3. Реализуй следующие узлы поведения:
- PatrolAction — перемещает охранника к следующей точке патрулирования.
Если дошел — переключается на следующую точку.
- CheckPlayerInSight — проверяет, видит ли охранник игрока
(используй простое условие: расстояние до игрока < 5).
- ChasePlayerAction — "преследует" игрока (выводит сообщение "Преследую игрока в {x}, {y}").
- WaitAction — ожидание (можно просто выводить "Жду...").
- IsPlayerLost — проверяет, потерял ли охранник игрока (прошло N тиков после того, как игрок исчез из виду).
4. Построй дерево поведения:
Selector (главный)
├── Sequence (режим тревоги)
│ ├── CheckPlayerInSight (условие: вижу игрока?)
│ └── ChasePlayerAction (действие: преследовать)
├── Sequence (потерял игрока)
│ ├── IsPlayerLost (условие: потерял?)
│ └── WaitAction (действие: подождать 3 секунды)
└── PatrolAction (патрулирование по умолчанию)
5. В Main создай цикл игры:
- Создай охранника с 3-4 точками патрулирования.
- Создай игрока с возможностью менять позицию (например, через ввод с клавиатуры: W/A/S/D для перемещения).
- В каждом "тике" (итерации цикла) запускай обновление дерева поведения охранника.
- Выводи текущее состояние охранника и его позицию.
Пример ожидаемого вывода:
Тик 1: Охранник [2, 0] - Патрулирую к точке [3, 0]
Тик 2: Охранник [3, 0] - Патрулирую к точке [3, 3]
Тик 3: Охранник [3, 3] - Патрулирую к точке [0, 3]
Игрок переместился к [4, 3]
Тик 4: Охранник [3, 3] - ВРАГ ОБНАРУЖЕН! Преследую игрока в [4, 3]
Тик 5: Охранник [4, 3] - Преследую игрока в [4, 3]
Игрок переместился к [0, 0]
Тик 6: Охранник [4, 3] - Потерял игрока. Жду...
Тик 7: Охранник [4, 3] - Жду...
Тик 8: Охранник [4, 3] - Возвращаюсь к патрулированию
---
- Векторы можно реализовать как простую структуру с X и Y
(или использовать System.Drawing.Point, если хочешь).
- Задержки для WaitAction можно реализовать через счетчик тиков
(не через Thread.Sleep, чтобы не блокировать весь цикл).