Разбей задачу на подзадачи.
0. Выбери инструмент. Если ты используешь opencv, там есть несколько инструментов, начиная с match template. Ключевые вопросы:
- Меняется ли размер?
- Меняется ли ориентация?
- Меняется ли внешний вид объекта?
Возможно, стоит искать только головы - это облегчит задачу, если судить по скриншоту.
1. Выбрав подход, тебе нужно будет подобрать параметры алгоритма, чтобы цели искались увереннее. Добейся того, чтобы на подавляющем большинстве скриншотов объекты детектились корректно.
2. Когда найдешь цели на статичном кадре, решай динамику. Зная позицию объектов на предыдущем и на текущем кадре, сопоставь их, определи скорость и направление движения. Добейся, чтобы программа корректно отслеживала траекторию каждого персонажа.
После первых N кадров можешь попробовать делать предсказания вроде "объект №1 движется справа налево, со скоростью X пикселей в секунду". Это позволит тебе "угадывать" позиции объектов при кратковременных пропусках распознавания, а заодно облегчит сопоставление двух кадров.
3. Дальше уже основная задача: зная позиции и скорости объектов, выбрать наилучший момент и направление шайбы. Тут дело пахнет многомерной оптимизацией, но в принципе можно решить дело перебором.
4. Управление: имитируешь действия мышью/клавиатурой (для питона есть нужные модули). Скорее всего, будет иметь смысл сначала встать на позицию, а потом ждать момента удара.
Тут многое зависит от того, потребуется ли тебе определять позицию своего персонажа. Если он всегда начинает в одной и той же позиции, и его характер движения предсказуемый (постоянная скорость, или известное ускорение/замедление), то можно попробовать обойтись более тупым подходом: "зажать" клавишу, подождать нужное время, отпустить.