Программирование

Скрипт Python для Аватария: автоматизация хоккея

Реализуйте скрипт на Python для бота в мини-игре Аватария (хоккей). OpenCV для распознавания защитников, решение проблем bounding boxes, расчет траектории шайбы с отскоками. Полный код и архитектура.

Как реализовать скрипт на Python для автоматизации мини-игры в ‘Аватария’? Игра состоит из 10 этапов с 2–6 защитниками (статичными или движущимися медленно/быстро с постоянным поведением на этапе). Шайба летит с фиксированной силой, выбирается только траектория. Основная проблема — точное распознавание позиций защитников: bounding boxes ‘дропаются’, багаются или прилипают не туда. Как лучше всего реализовать скрипт? Какую математику для расчета траектории удара использовать?

Для автоматизации мини-игры в “Аватария” (хоккейная тренировка) на Python используйте OpenCV для распознавания позиций защитников через HSV-маски и контуры, чтобы стабилизировать bounding boxes, которые дропаются или прилипают. PyAutoGUI или pynput подойдут для кликов по траектории, а MSS — для быстрых скриншотов. Расчет траектории шайбы опирайтесь на простую баллистику: предсказывайте скорость vx,vyv_x, v_y из кадров, учитывайте отскоки от стен по формуле ypred=y+vyvx(xtargetx)y_{pred} = y + \frac{v_y}{v_x} (x_{target} - x), с корректировкой на bounces.


Содержание


Общая архитектура скрипта для Аватария

Представьте: вы запускаете игру в браузере или приложении 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.

Код базовый:

python
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:

  1. Гауссово размытие + minNeighbors: blur = cv2.GaussianBlur(mask, (5,5), 0); rects = cascade.detectMultiScale(blur, scaleFactor=1.1, minNeighbors=3). Обучите custom Haar cascade на 100+ скринах защитников.
  2. Kalman Filter для трекинга: Предсказывайте позицию на следующем кадре. OpenCV имеет cv2.KalmanFilter(4,2).
python
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 проекта:

  1. Скорость: vx=(x2x1)×fpsv_x = (x_2 - x_1) \times fps, vy=(y2y1)×fpsv_y = (y_2 - y_1) \times fps. Но сила фиксирована, так что калибруйте |v| = const.
  2. Прямой удар: Цель — ворота (x_target, y_gate_center). Угол: θ=\atan2(ytargetypuck,xtargetxpuck)\theta = \atan2(y_{target} - y_puck, x_{target} - x_puck).
  3. Отскоки: Кол-во bounces b=dist/width+1b = \lfloor dist / width \rfloor + 1, финальная y: yfinal=(distmodwidth)y_{final} = (dist \mod width).

Полная формула для предсказания пересечения с линией ворот:

ypred=ypuck+vyvx(xgatexpuck)y_{pred} = y_{puck} + \frac{v_y}{v_x} (x_{gate} - x_{puck})

Учитывая bounces: зеркальте поле виртуально.

Для защитников: симулируйте траекторию на 100 шагов, проверяйте коллизии (расстояние < radius). Выберите min clearance.

Простой цикл:

python
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).

Полный цикл:

  1. Детект “Старт” шаблоном cv2.matchTemplate.
  2. Ждите защитников стабилизироваться (3 сек).
  3. Рассчитайте угол, кликните от центра шайбы.
  4. Детект гола по исчезновению шайбы.

Для 10 этапов: if score ==10 → restart. Как в FL.ru проектах.

Обход антибота? Медленные клики, рандом delay 0.1-0.3с.


Многопоточность для стабильности

Без потоков — лаги, boxes дергаются. Thread для vision: 60 FPS скрины.

python
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.


Полный пример кода бота

Вот скелет (адаптируйте под скрины):

python
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. Тестируйте на видео этапов.


Источники

  1. Stack Overflow: Bot for games in Python
  2. LearnCodeByGaming: Build a Bot with OpenCV
  3. Tautvidas: Automating games with OpenCV
  4. Cornell Air Hockey Robot
  5. Ritika Ghosh Air Hockey Bot
  6. Habr: Обнаружение движущихся объектов OpenCV
  7. FL.ru: Скрипт для Аватария хоккей
  8. RuSO: Скрипт для детской игры Аватария
  9. 101 Computing: Projectile Motion

Заключение

Скрипт Python для “Аватария” соберется за вечер: OpenCV + HSV + Kalman фиксят распознавание, баллистика с отскоками — траекторию. Тестируйте на реальных скринах, добавьте паузы — и бот забьет 10/10 на всех этапах. Главное — эксперименты, без них boxes не стабилизируются. Удачи, и сестра скажет спасибо!

Авторы
Проверено модерацией
Модерация
Скрипт Python для Аватария: автоматизация хоккея