Mail.ruПочтаМой МирОдноклассникиВКонтактеИгрыЗнакомстваНовостиКалендарьОблакоЗаметкиВсе проекты

Питон. Как сделать преследование врага за целью если она зашла в его радиус

- Ученик (248), на голосовании 1 месяц назад
Как сделать врага который стоит на месте, но когда персонаж заходит в радиус врага то враг все время бежит за ним. Буду очень благодарен.
Голосование за лучший ответ
FreezeXlll Знаток (474) 2 месяца назад
Для реализации поведения врага, который стоит на месте и начинает преследовать персонажа только когда тот попадает в его радиус видимости, можно использовать библиотеку `pygame`. Вот пример, как это можно сделать:

1. Установите библиотеку `pygame`, если она еще не установлена:

```bash
pip install pygame
```

2. Создайте скрипт с демонстрацией поведения врага:

```python
import pygame
import math

# Инициализация Pygame
pygame.init()

# Цвета
WHITE = (255, 255, 255)
RED = (255, 0, 0)
GREEN = (0, 255, 0)

# Размеры экрана
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Преследование врага")

# Параметры персонажа
player_pos = [100, 100]
player_speed = 5

# Параметры врага
enemy_pos = [400, 300]
enemy_speed = 3
detect_radius = 150 # Радиус, в котором враг начинает преследование

# Основной игровой цикл
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False

# Получение нажатий клавиш
keys = pygame.key.get_pressed()
if keys[pygame.K_LEFT]:
player_pos[0] -= player_speed
if keys[pygame.K_RIGHT]:
player_pos[0] += player_speed
if keys[pygame.K_UP]:
player_pos[1] -= player_speed
if keys[pygame.K_DOWN]:
player_pos[1] += player_speed

# Вычисление расстояния между игроком и врагом
distance = math.sqrt((enemy_pos[0] - player_pos[0])**2 + (enemy_pos[1] - player_pos[1])**2)

# Если игрок внутри радиуса видимости, начать преследование
if distance < detect_radius:
# Рассчитать направление к игроку
direction = [player_pos[0] - enemy_pos[0], player_pos[1] - enemy_pos[1]]
norm = math.sqrt(direction[0]**2 + direction[1]**2)
if norm != 0: # Избежание деления на ноль
direction[0] /= norm # Нормализуем вектор
direction[1] /= norm

# Обновляем позицию врага
enemy_pos[0] += direction[0] * enemy_speed
enemy_pos[1] += direction[1] * enemy_speed

# Отрисовка
screen.fill(WHITE)
pygame.draw.circle(screen, GREEN, (int(player_pos[0]), int(player_pos[1])), 15) # Игрок
pygame.draw.circle(screen, RED, (int(enemy_pos[0]), int(enemy_pos[1])), 15) # Враг
pygame.draw.circle(screen, (0, 0, 0), (int(enemy_pos[0]), int(enemy_pos[1])), detect_radius, 1) # Радиус видимости

pygame.display.flip()

# Ограничение FPS
pygame.time.Clock().tick(60)

pygame.quit()
```

### Объяснение кода:
- **Инициализация Pygame**: Настройка окна игры и основных параметров.
- **Игрок**: Управляется с помощью стрелок, его позиция обновляется в зависимости от нажатых клавиш.
- **Враг**: Он начинает двигаться в сторону игрока, как только игрок входит в радиус, заданный переменной `detect_radius`. Расстояние рассчитывается с помощью теоремы Пифагора.
- **Отрисовка**: Игрок и враг рисуются на экране. Радиус видимости врага отображается в виде круга.

Этот код демонстрирует базовую механику преследования врага. Вы можете улучшить его
-Ученик (248) 2 месяца назад
с нейронкой наверное тяжело ответ давать
Александр Загуляев Мыслитель (8103) 2 месяца назад
Недавно вышедшая модель o1 дает вполне рабочий код
 import pygame 
import sys

pygame.init()

# Настройки экрана
WIDTH, HEIGHT = 800, 600
WIN = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Преследование врагом")

# Цвета
WHITE = (255, 255, 255)
RED = (255, 0, 0)
BLUE = (0, 0, 255)

# Настройки персонажа
player_pos = pygame.Vector2(WIDTH // 2, HEIGHT // 2)
player_speed = 5
player_radius = 15

# Настройки врага
enemy_pos = pygame.Vector2(100, 100)
enemy_speed = 3
enemy_radius = 15
enemy_detection_radius = 200 # Радиус обнаружения врага

clock = pygame.time.Clock()

while True:
clock.tick(60) # Ограничение FPS до 60
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()

# Движение персонажа
keys = pygame.key.get_pressed()
movement = pygame.Vector2(0, 0)
if keys[pygame.K_w]:
movement.y -= player_speed
if keys[pygame.K_s]:
movement.y += player_speed
if keys[pygame.K_a]:
movement.x -= player_speed
if keys[pygame.K_d]:
movement.x += player_speed
if movement.length() > 0:
movement = movement.normalize() * player_speed
player_pos += movement

# Расчет расстояния между персонажем и врагом
distance = player_pos.distance_to(enemy_pos)
if distance < enemy_detection_radius:
# Враг преследует персонажа
direction = (player_pos - enemy_pos).normalize()
enemy_pos += direction * enemy_speed

# Отрисовка
WIN.fill(WHITE)
# Радиус обнаружения
pygame.draw.circle(WIN, (200, 200, 200), (int(enemy_pos.x), int(enemy_pos.y)), enemy_detection_radius, 1)
# Враг
pygame.draw.circle(WIN, RED, (int(enemy_pos.x), int(enemy_pos.y)), enemy_radius)
# Персонаж
pygame.draw.circle(WIN, BLUE, (int(player_pos.x), int(player_pos.y)), player_radius)

pygame.display.flip()
Похожие вопросы