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

Что получится в конце

Мини-игра с движущейся целью: раунд 30 секунд, счёт, рекорд, перезапуск, случайное позиционирование квадрата в пределах поля.

Сначала попробуйте готовую игру

Запустите раунд и попробуйте набрать рекорд. Так вы сразу увидите, почему важны ограничение координат и корректный таймер завершения.

Открыть игру отдельно

Структура проекта

poymay-kvadrat/
├── source.html
├── style.css
└── game.js

HTML: поле и цель

Интерфейс включает счёт, таймер, рекорд, кнопку нового раунда и игровое поле с кнопкой-целью.

CSS: единый стиль и игровая зона

Визуал выдержан в общей стилистике сайта. Поле фиксируется по пропорции 16:9, а квадрат перемещается абсолютным позиционированием.

.target__field {
  position: relative;
  width: 100%;
  aspect-ratio: 16 / 9;
}

.target__square {
  position: absolute;
  width: 52px;
  height: 52px;
}

JavaScript: случайное перемещение

Перед каждым перемещением вычисляются допустимые границы по X и Y, чтобы квадрат всегда оставался внутри поля.

function moveSquare() {
  const maxX = fieldEl.clientWidth - squareEl.offsetWidth;
  const maxY = fieldEl.clientHeight - squareEl.offsetHeight;
  const x = randomInt(Math.max(0, maxX));
  const y = randomInt(Math.max(0, maxY));
  squareEl.style.left = x + "px";
  squareEl.style.top = y + "px";
}

JavaScript: таймер раунда и рестарт

Раунд длится 30 секунд. После завершения квадрат блокируется, а кнопка «Новый раунд» запускает игру с чистого состояния.

function startRound() {
  score = 0;
  timeLeft = roundSeconds;
  playing = true;
  squareEl.disabled = false;
}

function finishRound() {
  playing = false;
  squareEl.disabled = true;
}

Проверка

Проверка Ожидаемый результат
Клик по квадрату Счёт увеличивается на 1, квадрат прыгает в новую точку
Во время раунда наблюдать таймер Каждую секунду время уменьшается на 1
Дождаться конца раунда Квадрат блокируется, выводится итог по очкам
Нажать «Новый раунд» Счёт и время сбрасываются, цель снова активна

FAQ

Как усложнить игру?

Постепенно уменьшайте размер квадрата и сокращайте интервал его автоперемещения по мере роста счёта.

Можно ли добавить уровни сложности?

Да. Введите пресеты с разной длительностью раунда и скоростью перемещения цели.

Исходники урока

Откройте финальные файлы этой версии. Это тот же код, который работает в демо наверху и на странице «Поиграть».

Обложка книги JavaScript с нуля: учимся программировать, создавая игры

Книга по JavaScript для начинающих

«JavaScript с нуля: учимся программировать, создавая игры»

Пошаговый формат с маленькими практическими задачами: от базового синтаксиса до первых игровых механик без перегруза теорией.

Читать книгу на ЛитРес →