ToolActToolAct

Игра «Уколы» (Pin Spin)

Втыкайте иглы во вращающийся диск, не задевая другие иглы — 10 уровней с растущей скоростью

1
Текущий уровень
10
Всего уровней
8
Осталось игл
1
Лучший уровень
Уровень 1 / 10
Осталось игл: 8
8

Что такое игра «Уколы»?

Pin Spin — это лёгкая казуальная браузерная игра того же семейства, что и мобильные хиты AA и Pin Out. В центре экрана с постоянной скоростью вращается белый диск. Вы по одной выстреливаете иглы снизу, и каждая игла должна воткнуться в диск, не задев уже воткнутые. На каждом уровне дано фиксированное количество игл: воткните их все — и переходите дальше, любое касание мгновенно завершает раунд. Правила настолько просты, что разобраться можно за пару секунд, но кривая сложности быстро превращает её в серьёзную проверку чувства времени и самообладания. Инструмент работает целиком в браузере, без регистрации и установки: на компьютере — клик мышью, на телефоне — касание экрана.

Как использовать

Порядок действий

  1. Откройте страницу — игра автоматически начинается с уровня 1, диск уже вращается
  2. Кликните по игровой области (или нажмите «Пробел» / «Ввод»), чтобы выпустить иглу
  3. Игла летит к центру и втыкается в диск; она не должна задеть ни одну уже воткнутую иглу
  4. Воткните все иглы уровня без столкновений, чтобы перейти на следующий
  5. Любое столкновение завершает раунд — выберите «Переиграть уровень» или «Начать заново», чтобы продолжить (примечание: нажатие «Пробел» / «Ввод» на экране окончания игры запускает «Начать заново» и возвращает на уровень 1, а не «Переиграть уровень» — если хотите переиграть тот же уровень, используйте кнопку)

Советы по прохождению

  • Диск крутится с постоянной скоростью, поэтому ритм важнее скорости кликов: целитесь в середину промежутка.
  • Стреляйте сразу после того, как соседняя игла прошла мимо: игла летит около 120 мс, поэтому берите небольшой запас.
  • В очередь становится до 3 выстрелов подряд; клики сверх этого лимита отбрасываются, а не накапливаются — поэтому долбить по экрану бессмысленно.
  • На поздних уровнях зазоры очень узкие, а вращение быстрее. Лучше пропустить рискованный выстрел, чем жадничать и столкнуться.

Сложность по уровням

  • Уровни 1–3: много игл и широкие зазоры — привыкаете к ритму.
  • Уровни 4–7: на диске уже больше игл, нужно предсказывать вращение.
  • Уровни 8–10: диск почти заполнен, каждый выстрел требует точного тайминга.

Сценарии использования

Короткая передышка во время работы или учёбыПолный забег из 10 уровней занимает 3–5 минут, проигрыш почти не наказывает — отличный вариант на пару минут перед совещанием или на паузу после законченного куска кода. Картинка — аккуратный монохромный вид, без всплывающих рекламных окон и резких звуков, поэтому открытая в углу вкладка никому не мешает.
Тренировка зрительно-моторной координации и чувства ритмаПо сути это упражнение на тайминг в системе отсчёта, вращающейся с постоянной скоростью. Чтобы стабильно проходить уровни, в голове формируется внутренний метроном: вы стреляете в момент, когда игла пересекает целевую линию, с поправкой на 120 мс полёта. Этот навык хорошо переносится на экшн-игры и музыкальный ритм и идёт глубже, чем простой тест на скорость реакции.
Мини-соревнование на уроке или тимбилдингеОткройте URL на большом экране и дайте каждому сыграть по очереди: смотрите, кто первым проходит все 10 уровней или кто доходит дальше. Правила простые для любого возраста, и в отличие от полноценной мобильной игры аккаунт не нужен. Подойдёт как ледокол или лёгкое занятие на уроке информатики. Результаты остаются только в локальном браузере, ничего не логируется.
Работает на слабых ноутбуках и старых телефонахВся игра построена только на DOM-узлах и CSS transform: за кадр обновляется не более 15 значений rotate(deg), canvas не нужен. Стабильные 60 fps достижимы и на старом ноутбуке с 4 ГБ памяти, и на бюджетном Android, и на школьном компьютере. Бэкенд не требуется — игра продолжает работать и без интернета.
Демо для фронтенд-анимации и игровых цикловДля тех, кто учит фронтенд, это компактный, но полноценный пример «главный цикл на requestAnimationFrame + проверка столкновений + конечный автомат»: вращение, выстрел, проверка попаданий, очередь выстрелов и завершение раунда умещаются в одном компоненте. Удобно показывать GPU-композицию transform, сравнивать transform с left/top по производительности и объяснять, почему в высокочастотных анимациях useRef предпочтительнее useState.

Технический принцип

Главный цикл управляется requestAnimationFrame. На каждом кадре внутреннее значение rotation увеличивается на фиксированное speed (градусов на кадр), затем перебираются все воткнутые иглы и им присваивается transform: rotate(baseAngle + rotation). Поскольку transform — свойство слоя композиции, браузер передаёт вращение в поток GPU-композитора, не вызывая ни layout, ни paint, поэтому последний уровень со всеми 15 вращающимися иглами стабильно держит 60 fps. Проверка столкновений строится на схеме «разница углов через длину хорды». Каждая воткнутая игла представлена своим baseAngle в системе координат диска (фиксированный сдвиг относительно диска, не зависящий от вращения). Когда выпущенная игла достигает центра, её угол в мировых координатах равен TARGET_ANGLE = 0, что в координатах диска даёт normalizeAngle(0 - rotation). Затем новый baseAngle сравнивается со всеми существующими: разница углов Δθ переводится в длину хорды 2R·sin(Δθ/2) между центрами точек на остриях игл (R = 111px от центра каждой точки-острия до центра диска). Если она оказывается меньше порога 24px, выстрел считается столкновением и раунд завершается. Выстрел регулирует небольшой конечный автомат. shootLocked помечает иглу как «в полёте» и предотвращает двойную обработку одного и того же выстрела событием transitionend и резервным setTimeout на 180 мс. CSS-переход длится 120 мс; setTimeout на 180 мс — страховка для редкого случая, когда transitionend не срабатывает (например, когда DOM изменяется до завершения перехода). pendingShots буферизует клики, поступившие во время полёта, с лимитом в 3 — клики сверх этого лимита отбрасываются (а не помещаются в очередь), что сохраняет ощущение быстрой стрельбы и не даёт нескольким иглам одновременно лететь к центру. И поражение, и зачёт переводят gameOver в true: главный цикл продолжает крутиться, но rotation больше не обновляется, и сцена «застывает». Чтобы корректно масштабироваться по экрану, игра удерживает фиксированный дизайн-размер 420×720, а внешняя обёртка вычисляет коэффициент масштабирования от размеров viewport и применяет его через transform: scale. Текущая реализация ограничивает масштаб единицей, поэтому маленькие viewport пропорционально уменьшаются, а десктопные — сохраняют исходный размер и не увеличиваются. Благодаря этому проверка столкновений всегда работает в дизайн-координатах с единым набором пиксельных порогов, и на любом экране результат одинаков.

  • Главный цикл: requestAnimationFrame, на каждом кадре rotation += speed, всем иглам выставляется transform: rotate(baseAngle + rotation).
  • GPU-ускорение: для вращения используется transform, а не left/top, поэтому им занимается композитор браузера — без layout и перерисовки.
  • Проверка попадания: 0° в мировых координатах проецируется в координаты диска как normalizeAngle(0 - rotation); длина хорды 2R·sin(Δθ/2) сравнивается с порогом 24px.
  • Конечный автомат: shootLocked блокирует двойную обработку, pendingShots ограничен 3 кликами с отбрасыванием избытка (без очереди), gameOver замораживает обновления rotation.
  • Завершение выстрела: 120 мс полёта на CSS, transitionend как основной путь + setTimeout на 180 мс как страховка для редкого случая, когда transitionend не срабатывает.
  • Масштабирование: фиксированная дизайн-система 420×720; обёртка применяет transform: scale в зависимости от размера viewport, с потолком 1, чтобы десктопы сохраняли исходный размер, а не увеличивались.
  • Хранение: в localStorage сохраняется только лучший пройденный уровень. Ничего не отправляется на сервер, нет аккаунтов и таблицы лидеров.

Примеры

Скорость и количество игл по 10 уровням

Уровень  Старт  Выстрелов  Скорость (deg/frame)
1        2      8          1.35
2        3      9          1.50
3        3      10         1.65
4        4      11         1.80
5        4      12         2.00
6        5      13         2.20
7        5      14         2.45
8        6      15         2.70
9        7      15         3.00
10       8      15         3.35

Типичный заход: провал на уровне 5

Уровень 5: 4 стартовые иглы, 12 выстрелов.
Выстрелы 1–7: чисто втыкаются, осталось 5.
Выстрел 8: сделан слишком рано, до того как воткнулась предыдущая игла.
Решение: новый baseAngle всего в 8° от выстрела 6, ниже DOT_HIT_DISTANCE.
Результат: столкновение, раунд завершается сообщением «Игра окончена!».
Кнопка «Переиграть уровень» возвращает на уровень 5 с начала.

Итоги полного прохождения

Время прохождения: около 2 мин 40 с
Всего выстрелов: 117
Поражений: 3
Лучший уровень: 10
Сообщение: «Все уровни пройдены!», кнопка — «Сыграть ещё раз».
Лучший уровень записывается в localStorage и сохраняется после перезагрузки страницы.

Частые вопросы

Я кликнул в пустое место — почему я всё равно проиграл?

Игла появляется не мгновенно: от клика до реального касания диска проходит около 120 мс, и всё это время диск продолжает крутиться. Если в момент клика зазор был достаточно широким, но во время полёта в целевую линию повернулась другая игла, новая просто упадёт ей на верх. Простое решение — стрелять сразу после того, как зазор пересёк линию, чтобы оставить запас на вращение.

Можно ли удерживать палец на экране для непрерывного огня?

Можно быстро кликать: до 3 выстрелов уходят в очередь и автоматически срабатывают по очереди, но ни один не выйдет, пока предыдущий ещё в полёте. Клики сверх этого лимита просто отбрасываются и не попадают в очередь. На поздних уровнях лучше сбавить темп и дать каждой игле сесть, прежде чем оценивать следующий выстрел, а не молотить по экрану.

По каким правилам растёт сложность?

У каждого уровня свои значения скорости вращения, начального количества игл и нужного числа выстрелов. Скорость растёт с 1,35 deg/frame на уровне 1 до 3,35 deg/frame на уровне 10 — примерно в 2,5 раза, до тройного значения не дотягивает. Стартовые иглы увеличиваются с 2 до 8, а оставшиеся зазоры сужаются. На поздних уровнях важнее спокойствие, чем чистая скорость рук.

После провала я начинаю с начала или с того же уровня?

Поддерживаются оба варианта, но важно, чем именно вы запускаете перезапуск. Кнопка «Переиграть уровень» перезапускает уровень, на котором вы провалились, с тем же количеством игл и той же скоростью; кнопка «Начать заново» — а также нажатие «Пробел» / «Ввод» на экране окончания игры — возвращают к уровню 1. Клавиатурного сокращения для «Переиграть уровень» нет, поэтому если рефлекторно нажать «Пробел» для продолжения, вы откатитесь на уровень 1. Лучший пройденный уровень всегда хранится в localStorage.

Почему игровая зона такая узкая?

Дизайн-размер — 420×720, как у телефона в портретной ориентации. На мобильном это естественный полный экран; на десктопе обёртка пропорционально уменьшает картинку, но масштаб ограничен значением 1, поэтому большое окно браузера не растянет игру за пределы 420×720. Логика игры от размера окна не меняется.

Отправляются ли данные на сервер?

Нет. Вся игра выполняется локально в браузере. В localStorage хранится единственное число — лучший пройденный уровень. Очистите данные сайта или смените браузер — оно пропадёт. Таблицы лидеров нет, и со стороны сайта мы не собираем ни очки, ни действия.

На что обратить внимание на мобильном?

Включите полноэкранный режим в браузере, чтобы жест «потянуть вниз» случайно не обновил страницу. Горизонтальная ориентация работает, но портретная пропорция ближе к оригинальному ощущению. Если на слабом телефоне периодически пропадают кадры, закройте лишние вкладки и тяжёлые анимации — сама игра пересчитывает за кадр лишь несколько transform, нагрузка на устройство минимальна.

Похожие инструменты

Тест скорости реакции

Онлайн-инструмент для тестирования времени реакции с записью лучших результатов и среднего значения.

Тест скорости кликов

Онлайн тест скорости кликов. Измерь клики в секунду (CPS) в режимах 5с, 10с, 30с. Отслеживай лучший результат и брось вызов своей скорости.

Тест устного счёта

Онлайн тест скорости устного счёта. Проверьте скорость и точность вычислений.

Подбрасывание монеты

Онлайн-симулятор подбрасывания монеты. Подбросьте монету и получите случайно орла или решку. Отслеживайте статистику, идеально для принятия решений или развлечения.

Симулятор зависания компьютера

Бесплатный онлайн-симулятор зависания. Симулирует экраны BSOD Windows, Kernel Panic macOS, сбой Linux и ANR Android. Полноэкранный режим, нажмите для выхода. Идеально для розыгрыша или тестирования экранов.

Колесо Решений

Бесплатный онлайн-инструмент «Колесо решений». Введите несколько вариантов, крутите колесо для случайного выбора. Идеально для выбора еды, места, фильма. Прощайте нерешительность!