Вы серьёзно? Claude Code будет кликать кружочки?
Да, я тоже сперва подумал: "Ну, очередная игрушка для AI-евангелистов". Но когда я увидел, как Claude Code (на тот момент ещё Claude 3.5 Sonnet с поддержкой computer use) пытается попасть по первому кружку OSU! и проваливается — я понял, что это идеальный полигон. Не для того, чтобы хайпануть, а чтобы проверить фундаментальные ограничения AI UI-взаимодействия под давлением времени. OSU! — это не просто кликер. Это ритм-игра с суб-100ms окнами для реакции. Если AI может сыграть хотя бы простую карту, значит он способен управлять любым интерфейсом в реальном времени. Спойлер: может, но не сразу.
Предупреждение: Автоматизация OSU! нарушает правила игры. Не используйте этот гайд для читерства в рейтинговых матчах. Это исследование, а не способ набить pp. Вы предупреждены.
Почему OSU! — идеальный тест для AI-автоматизации
Давайте разберёмся, с чем мы имеем дело. OSU! требует от игрока:
- Распознавания объектов — на экране появляются круги, слайдеры, спиннеры. AI должен понять, где они и когда.
- Точного тайминга — клик по кругу раньше или позже на 30ms — miss. Для LLM с latency >500ms это вызов.
- Симуляции ввода — нужно эмулировать мышь и клавиатуру с минимальной задержкой.
- Адаптивности — карты меняются, скорость разная. AI не может заучить последовательность.
Звучит как треш для LLM, правда? Но именно тут появляется Claude Code с возможностью computer use (начиная с версии 0.4.7, но на май 2026 уже 0.6.3 с улучшенным vision и контролем задержек). Я построил пайплайн, который превращает Claude Code из кодера в геймера. И нет, это не скрипт, тупо кликающий по пикселям — это именно AI-агент, который "смотрит" на экран и решает, что делать.
Архитектура: как AI вообще может видеть и кликать
Весь фокус в том, что Claude Code (через Claude API) получает скриншоты экрана и может возвращать команды для мыши/клавиатуры. Но в реальном времени так не работает — слишком долго. Поэтому мы строим гибридную систему:
- Claude Code управляет высокоуровневой логикой: "какую карту выбрать", "начать игру", "остановиться если проигрываешь".
- Локальный агент (на Python) захватывает скриншоты, быстро находит объекты (через opencv или ml), и передаёт временные метки Claude для принятия решений.
- На основе ответа Claude — симуляция кликов через PyAutoGUI или direct input.
Почему так? Чистый end-to-end computer use с Claude слишком медленный (latency ~1-2 секунды). Чтобы играть в OSU!, нужно решение с предсказанием. Claude Code выступает как "мозг", который планирует действия, а локальный рантайм выполняет быстрое распознавание.
Кстати, если вы ещё не знакомы с основами использования Claude Code, рекомендую сначала прочитать полный гайд по горячим клавишам Claude Code — без них вы будете тратить кучу времени на повторяющиеся действия.
Пошаговый план: от установки до первого клика
1 Настройка окружения для Claude Code
У вас уже должен быть установлен Claude Code. Если нет — npm install -g @anthropic-ai/claude-code. Версия на май 2026 — 0.6.3, обязательно обновитесь: claude update.
Дополнительно устанавливаем Python 3.11+, opencv-python, mss (для быстрых скриншотов), pyautogui и pydirectinput (для симуляции ввода в играх).
pip install opencv-python mss pyautogui pydirectinput
claude init my-osu-bot
cd my-osu-bot
2 Создаём агента захвата экрана
Мы не можем передавать каждый скриншот Claude — будет дорого и медленно. Поэтому локальный агент делает скриншоты каждые 16ms (60 FPS), находит круги через цветовую сегментацию (синие круги на чёрном фоне — easy), и собирает их координаты + временные метки.
import mss
import cv2
import numpy as np
sct = mss.mss()
monitor = sct.monitors[1] # главный монитор
def capture_and_detect():
img = sct.grab(monitor)
frame = np.array(img)
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
# Синий цвет кругов OSU!
lower_blue = np.array([100, 150, 0], dtype=np.uint8)
upper_blue = np.array([140, 255, 255], dtype=np.uint8)
mask = cv2.inRange(hsv, lower_blue, upper_blue)
contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
circles = []
for cnt in contours:
(x, y), radius = cv2.minEnclosingCircle(cnt)
if radius > 10:
circles.append((int(x), int(y), int(radius), time.time()))
return circles
Этот код бежит в бесконечном цикле, складывает найденные круги в очередь с временем появления. Claude Code будет получать не все скриншоты, а только агрегированные данные за последние 100ms.
3 Интеграция с Claude Vision через промпт
Теперь самое интересное. Мы даём Claude Code задание: "Ты играешь в OSU!. Вот координаты кругов, которые появились за последние 100ms. Определи, в какой кружок нужно кликнуть сейчас, и какую клавишу нажать (левый клик или клавиша Z/X). Время появления круга — round_start_time. Текущее время — now. Если разница больше 200ms, значит круг просрочен, пропусти его." В Claude Code это выглядит как system prompt в файле .claude/settings.json. Подробнее о настройке окружения читайте в статье Рабочий процесс создателя Claude Code. А для более тонкого контроля советую изучить 10 скрытых настроек, которые превратят его в полноценный отдел автоматизации.
4 Симуляция ввода
Когда Claude Code возвращает решение (координаты и действие), локальный агент выполняет клик. Для игр pyautogui не подходит — игры часто игнорируют его события. Используем pydirectinput, который эмулирует DirectInput, а не Windows message queue.
import pydirectinput
import time
def click_at(x, y, button='left'):
pydirectinput.moveTo(x, y)
pydirectinput.click(button=button)
time.sleep(0.001) # минимальная задержка
def press_key(key):
pydirectinput.keyDown(key)
time.sleep(0.001)
pydirectinput.keyUp(key)
5 Запускаем и тестируем
Запускаем OSU! в оконном режиме (1920x1080), ставим самую простую карту. Claude Code запускает свой агент, и мы смотрим, промахивается ли он. Спойлер: первая попытка будет провальной. Мы ещё не учитывали, что координаты скриншота могут не совпадать с игровыми из-за scaling. Придётся калибровать. Но это нормально.
Подводные камни: как я потратил 3 дня на 2% точности
Давайте честно: первая версия бота набирала 2% точности на самой лёгкой карте. Вот что пошло не так:
- Мискалибрование координат. OSU! использует scaling при оконном режиме. Решение: захватывать изображение прямо из процесса через BitBlt, а не через mss (mss даёт скриншот всего монитора, но координаты мыши могут быть в других единицах).
- Латентность Claude API. Даже с быстрым vision (Claude 4 Sonnet) время ответа — 800-1500ms. Для OSU! это вечность. Решение: мы не ждём ответ от Claude на каждый кадр. Claude планирует стратегию на следующие 200ms, а локальный агент выполняет клики по расписанию. Если возникает новый круг — локальный агент может сам принять решение на основе правил (например, кликнуть по ближайшему кругу). Так Claude управляет только сложными ситуациями.
- Античит и защита от автоматизации. OSU! не банит за автоматизацию в оффлайне, но если делать это в мультиплеере — рискуете. Я тестировал только в solo режиме с отключенным интернетом.
- Перегрузка Claude Context. Если передавать все координаты каждого круга, контекст быстро забивается. Пришлось ограничить историю последними 5 событиями.
Типичная ошибка: Думать, что Claude Code сам разберётся с real-time gaming. Он — инструмент для кода, а не для гейминга. Вам придётся написать слой на Python/TypeScript, который будет буферизировать события и выдавать их дозированно. Если хотите избежать катастроф — почитайте 5 правил контроля Claude Code в production. Там описаны механизмы изоляции, которые спасут ваш продакшн от разрывов.
Результаты: что получилось и что пошло не так
После 3 дней итераций и ~$50 на API (да, это дорого) я получил бота, который стабильно проходит карты сложностью до 2 звёзд с точностью 85-90%. На 3-звёздочных картах точность падает до 40% — Claude не успевает обрабатывать поток событий. Вывод: Claude Code отлично справляется с медленными играми (пошаговые стратегии, симуляторы), но для быстрых ритм-игр нужна дополнительная локальная логика.
К слову, похожий подход используется в проекте civStation — VLM-система для Civilization VI. Там AI управляет игрой через голос, но принцип тот же: компьютерное зрение + LLM для принятия решений. А если вам интересен другой пример генерации игр AI-агентами, гляньте битву код-агентов.
Что дальше? Игры, где AI уже стоит попробовать
OSU! — лишь тестовый стенд. Технологию можно применить к:
- Пошаговые тактики (XCOM, Fire Emblem) — Claude Code отлично справляется, так как нет дедлайнов.
- Стратегии реального времени (StarCraft II) — нужно больше локальной автоматики, но возможно.
- Графические интерфейсы — автоматизация тестирования UI, заполнение форм, навигация по сложным приложениям.
Кстати, если вы думаете, что Claude Code может быть опасен в руках неопытного — вы правы. Я уже писал о том, как внутренние паттерны нейронной активности Claude приводят к неожиданным эффектам в статье 171 эмоция Claude. Но в рамках этой задачи AI не выходил за рамки — он просто пытался кликнуть по кружочкам, порой с нечеловеческим упорством.
Хотите попробовать сами? Скачайте мой скрипт (ссылка в профиле) или соберите свой на основе описанного. Только не забудьте отключить интернет у OSU!, чтобы не получить бан. И помните: Claude Code — это не читерский инструмент, а исследовательский. Используйте с умом.