Скрипт Python для Аватария: автоматизация хоккея
Реализуйте скрипт на Python для бота в мини-игре Аватария (хоккей). OpenCV для распознавания защитников, решение проблем bounding boxes, расчет траектории шайбы с отскоками. Полный код и архитектура.
Как реализовать скрипт на Python для автоматизации мини-игры в ‘Аватария’? Игра состоит из 10 этапов с 2–6 защитниками (статичными или движущимися медленно/быстро с постоянным поведением на этапе). Шайба летит с фиксированной силой, выбирается только траектория. Основная проблема — точное распознавание позиций защитников: bounding boxes ‘дропаются’, багаются или прилипают не туда. Как лучше всего реализовать скрипт? Какую математику для расчета траектории удара использовать?
Для автоматизации мини-игры в “Аватария” (хоккейная тренировка) на Python используйте OpenCV для распознавания позиций защитников через HSV-маски и контуры, чтобы стабилизировать bounding boxes, которые дропаются или прилипают. PyAutoGUI или pynput подойдут для кликов по траектории, а MSS — для быстрых скриншотов. Расчет траектории шайбы опирайтесь на простую баллистику: предсказывайте скорость из кадров, учитывайте отскоки от стен по формуле , с корректировкой на bounces.
Содержание
- Общая архитектура скрипта для Аватария
- Распознавание объектов в мини-игре
- Решение проблем с bounding boxes
- Математика расчета траектории шайбы
- Реализация удара и цикла игры
- Многопоточность для стабильности
- Полный пример кода бота
- Источники
- Заключение
Общая архитектура скрипта для Аватария
Представьте: вы запускаете игру в браузере или приложении VK, бот делает скриншот, находит защитников, просчитывает безопасную траекторию мимо них и кликает. Просто? Не совсем — особенно с 10 этапами, где защитники от статичных до быстро двигающихся с предсказуемым паттерном.
Ключевые библиотеки: OpenCV для зрения, MSS для скриншотов (быстрее PIL), PyAutoGUI для мыши/клавиатуры, threading для параллелизма. Почему не Selenium? Игра динамичная, клики по пикселям точнее.
Архитектура в 4 потока, как в проекте Cornell Air Hockey: один для UI (запуск этапа), второй — vision (детекция), третий — strategy (траектория), четвертый — actions (клики). Это решает race conditions, когда скриншот устаревает.
Сначала калибруйте: сделайте тестовые скрины этапов, отметьте ROI (region of interest) — поле хоккея, ворота. Шайба фиксированной силы, так что угловой клик решает всё.
Распознавание объектов в мини-игре
Защитники в “Аватария” — цветные спрайты? Используйте HSV для маскировки. Конвертируйте скрин в HSV, задайте диапазоны (желтый: H 20-30), найдите контуры с cv2.findContours.
Код базовый:
import cv2
import numpy as np
import mss
sct = mss.mss()
while True:
img = np.array(sct.grab(monitor)) # ROI поля
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv, lower_yellow, upper_yellow)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
for cnt in contours:
x, y, w, h = cv2.boundingRect(cnt)
# Фильтр по размеру: игнор шум
if 20 < w*h < 500:
defenders.append((x+w//2, y+h//2)) # Центр
Это работает для статичных. Движущиеся? Сохраняйте кадры, фильтруйте по размеру/позиции. Как в туториале Tautvidas, тесты на проблемных скринах спасут.
А шайбу? Она стартует из фиксированной точки, но для точности детектите её центр перед ударом.
Что насчет этапов? Паттерны постоянны — на 1-м 2 статичных, на поздних 6 быстрых. Хардкодьте или обучайте state machine: if len(defenders)==4 and moving_fast — этап X.
Решение проблем с bounding boxes
Главная боль: boxes дропаются при поворотах, багаются на фоне или прилипают к соседям. Точная детекция — 80% успеха бота.
Фиксы из LearnCodeByGaming:
- Гауссово размытие + minNeighbors:
blur = cv2.GaussianBlur(mask, (5,5), 0); rects = cascade.detectMultiScale(blur, scaleFactor=1.1, minNeighbors=3). Обучите custom Haar cascade на 100+ скринах защитников. - Kalman Filter для трекинга: Предсказывайте позицию на следующем кадре. OpenCV имеет
cv2.KalmanFilter(4,2).
kf = cv2.KalmanFilter(4,2) # state: x,y,vx,vy
prediction = kf.predict()
corrected = kf.correct(measurement)
Это сглаживает дропы — если box пропал, используйте предсказание.
3. Многокадровый фильтр: Берите 3-5 скринов, усредняйте позиции. Lock в thread: with lock: update screenshot.
4. Контуры + moments: Центр масс надежнее rect. Из Habr статьи по движущимся объектам: background subtraction для движения.
Тестируйте: сохраняйте проблемные PNG, пишите unit-тесты. В air hockey проекте Ritika так и делали — стабильность выросла на 90%.
А если фон меняется? ROI на поле, crop’те.
Математика расчета траектории шайбы
Шайба — баллистика без гравитации (2D стол). Фиксированная скорость, отскоки эластичные.
Из Cornell проекта:
- Скорость: , . Но сила фиксирована, так что калибруйте |v| = const.
- Прямой удар: Цель — ворота (x_target, y_gate_center). Угол: .
- Отскоки: Кол-во bounces , финальная y: .
Полная формула для предсказания пересечения с линией ворот:
Учитывая bounces: зеркальте поле виртуально.
Для защитников: симулируйте траекторию на 100 шагов, проверяйте коллизии (расстояние < radius). Выберите min clearance.
Простой цикл:
def safe_trajectory(puck_pos, defenders, gate):
best_angle = None
max_clear = 0
for angle in np.linspace(-np.pi/2, np.pi/2, 100):
vx, vy = speed * np.cos(angle), speed * np.sin(angle)
pos = puck_pos
clear = simulate_path(pos, vx, vy, defenders, steps=200)
if clear > max_clear:
max_clear = clear
best_angle = angle
return best_angle # Клик по углу
Это из 101 Computing projectile, адаптировано под хоккей. Для движущихся: предскажите их позиции на t = dist / speed.
Реализация удара и цикла игры
Бот: логин → хоккей → цикл(старт → детект → удар → 10 шайб → следующий этап).
PyAutoGUI: pyautogui.click(screen_x, screen_y). Калибруйте пиксели: ворота ~ (900, 500).
Полный цикл:
- Детект “Старт” шаблоном
cv2.matchTemplate. - Ждите защитников стабилизироваться (3 сек).
- Рассчитайте угол, кликните от центра шайбы.
- Детект гола по исчезновению шайбы.
Для 10 этапов: if score ==10 → restart. Как в FL.ru проектах.
Обход антибота? Медленные клики, рандом delay 0.1-0.3с.
Многопоточность для стабильности
Без потоков — лаги, boxes дергаются. Thread для vision: 60 FPS скрины.
import threading
lock = threading.Lock()
screenshot = None
def capture_loop():
global screenshot
while running:
with lock:
screenshot = sct.grab(roi)
time.sleep(1/60)
threading.Thread(target=capture_loop).start()
В main: lock → process → unlock. Как в YouTube туториале по bot.
Полный пример кода бота
Вот скелет (адаптируйте под скрины):
import cv2, numpy as np, mss, pyautogui, threading, time
# ... калибровки lower_yellow и т.д.
def detect_defenders(img):
# HSV, contours как выше
return centers
def predict_trajectory(defenders):
# simulate_path как выше
return click_pos
running = True
lock = threading.Lock()
screenshot = None
def vision_thread():
global screenshot
sct = mss.mss()
while running:
with lock:
screenshot = np.array(sct.grab({'top':100,'left':100,'width':800,'height':600}))
time.sleep(0.016)
threading.Thread(target=vision_thread, daemon=True).start()
while running:
with lock:
if screenshot is None: continue
img = screenshot.copy()
defenders = detect_defenders(img)
if len(defenders) > 0:
pos = predict_trajectory(defenders)
pyautogui.click(pos[0], pos[1])
time.sleep(0.1)
Расширьте Kalman, state machine. Тестируйте на видео этапов.
Источники
- Stack Overflow: Bot for games in Python
- LearnCodeByGaming: Build a Bot with OpenCV
- Tautvidas: Automating games with OpenCV
- Cornell Air Hockey Robot
- Ritika Ghosh Air Hockey Bot
- Habr: Обнаружение движущихся объектов OpenCV
- FL.ru: Скрипт для Аватария хоккей
- RuSO: Скрипт для детской игры Аватария
- 101 Computing: Projectile Motion
Заключение
Скрипт Python для “Аватария” соберется за вечер: OpenCV + HSV + Kalman фиксят распознавание, баллистика с отскоками — траекторию. Тестируйте на реальных скринах, добавьте паузы — и бот забьет 10/10 на всех этапах. Главное — эксперименты, без них boxes не стабилизируются. Удачи, и сестра скажет спасибо!