Как создать правдоподобного врага в 2D‑игре: простой AI без A за 5 функций
В разработке игр, кажущийся «умным» противник — одна из главных задач, формирующих интересный геймплей. Однако многие начинающие разработчики думают, что для этого обязательно нужен сложный алгоритм вроде A* (Astar), графы навигации или даже нейросети. На практике для 2D‑игр вроде Pacman, классических topdown shooters или roguelike достаточно эмулировать интеллект с помощью нескольких простых механик.В этой статье мы разберём, как реализовать врага, который следует за игроком, обходит простые препятствия и выглядит «разумным» — с помощью всего 5 небольших функций на Python + Pygame. Мы избежим сложных алгоритмов поиска пути и покажем, как лучевая проверка и перебор соседей создают иллюзию целенаправленного поведения. Архитектура простого AI
Наш враг не будет знать всю карту.
Вместо этого каждый кадр он:
1. Определяет направление к игроку (вектор).
2. Проверяет, есть ли прямое препятствие на пути.
3. Если препятствие есть — ищет обходной шаг (перебор соседних клеток).
4. Делает шаг.
5. Рисует отладочную линию «намерения».
Все это реализуется с помощью Pygame.math.Vector2 — удобного инструмента для работы с векторами.
Что означают «5 функций для чувства интеллекта»?
Вот минимальный набор функций, который создаёт полную иллюзию работы AI:
1. get_direction_to_player() — вектор направления.
2. is_obstacle_ahead() — лучевая проверка перед врагом.
3. try_alternative_directions() — перебор соседних клеток.
4. move_towards_player() — основной шаг.
5. draw_debug_line() — визуализация пути для отладки.
Никакого A* — только локальные решения на каждом кадре.
Принцип работы: желание следовать за игроком
Враг постоянно пересчитывает своё желаемое направление. Это называется поведением преследования (pursue). В отличие от сложного поиска пути, враг не строит маршрут до цели, а просто двигается в её сторону, корректируя направление каждый кадр.
Векторы в Pygame
.normalize() делает вектор единичной длины — так мы получаем только направление. Учёт препятствий: простой лучевой поиск
Перед движением враг прощупывает пространство перед собой:
Здесь obstacles — список точек или прямоугольников стен / врагов. Обход препятствий: перебор соседей
Если прямо идти нельзя, враг проверяет 8 соседних направлений (или 4, если нужна сетка):
Эта функция не просчитывает весь путь, а просто выбирает лучшее локальное направление. Главный цикл движения врага:
Обратите внимание: если альтернатив нет, враг стоит на месте — это тоже выглядит естественно, будто он «задумался».
Пример 1. Полный код врага в topdown shooter:
Пример 2. Как это выглядит в Pacmanподобной игре
В Pacman враги обычно движутся по лабиринту. Наш подход тоже работает: если препятствием считаются стены, то is_obstacle_ahead проверяет коллизию с тайлами. Благодаря try_alternatives, враг будет «тыкаться» в стены, но в итоге пойдёт вдоль них — это очень напоминает поведение призраков в оригинале.
Пример 3. Визуализация для отладки
Включив отрисовку линии draw_debug_line, вы увидите зелёную линию от врага к игроку — куда AI хочет пойти. Это бесценно при настройке:![Пример отладки: зелёная линия показывает желаемое направление]Если линия проходит сквозь стену, значит, проверка препятствий не сработала — и вы быстро найдёте ошибку.
Заключение
Для 2D игр не нужен сложный поиск пути — достаточно локного принятия решений. Векторы из pygame.math делают код чистым и понятным.
Пять простых функций создают полную иллюзию «интеллектуального» преследования.
Отладка через визуализацию линий ускоряет разработку в разы.
Где применяется технология
Кэжуалигры (Pacman, Snake, Bomberman)
Topdown shooter (Zombie Survival, Hotline Miami‑подобные)
Roguelike и tower defense
Прототипы любых игр с преследованием
Преимущества описанного подхода
Простота реализации: 50-100 строк кода вместо сотен
Производительность: Нет сложных вычислений на кадр
Предсказуемость: Легко балансировать сложность
Прозрачность: Легко отлаживать визуально
Убедительность: Игроку кажется, что враг «думает»
Используйте этот подход в своих проектах — и ваши враги будут выглядеть достаточно умными, чтобы доставлять удовольствие, и достаточно простыми, чтобы вы не увязли в алгоритмах. А когда придёт время — всегда сможете заменить локальный поиск на A* или навигационную сетку, но начинайте с малого.