К статье
Практический материал

Обучение и тренировки · 10 мин

Как сделать бильярд в Scratch

Создайте симуляцию бильярда в Scratch: планирование, спрайты, физика движения, столкновения шаров, управление кием и подсчёт очков.

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

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

Планирование игры: что нужно учесть до начала программирования

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

Физика в Scratch реализуется через изменение координат спрайта с течением времени. Каждый шар должен иметь переменные скорости по осям X и Y. При каждом обновлении кадра (обычно через блок «повторять всегда» или «когда флаг нажат») к координатам прибавляется скорость, умноженная на небольшой коэффициент. Трение моделируется постепенным уменьшением скорости.

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

Создание сцены и спрайтов: стол, шары, кий

Начните с фона. Нарисуйте в растровом редакторе Scratch прямоугольник зелёного цвета — это игровое поле. Вокруг него добавьте коричневую рамку — борта. В углах и по середине длинных сторон разместите чёрные круги — лузы. Удобно сделать фон один раз и использовать его как сцену.

Шары создайте как отдельные спрайты. Можно использовать один спрайт и менять его костюмы (разные цвета), но для простоты управления скоростями каждого шара лучше создать несколько спрайтов: «шар-белый», «шар-жёлтый», «шар-красный» и так далее. Каждому спрайту задайте одинаковый размер (например, 20 пикселей в диаметре) и начальную позицию в зоне треугольника, как в настоящем бильярде.

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

Движение шаров: скорость, трение, отскоки от бортов

Каждому шару задайте три переменные: скорость X, скорость Y и движется? (булево значение). В цикле «повторять всегда» для каждого шара выполните: если скорость не равна нулю, изменить X на скорость X, изменить Y на скорость Y. Затем уменьшите скорость умножением на коэффициент трения (например, 0.98). Если скорость становится меньше 0.1, обнулите её.

Отскок от бортов: если шар касается края игрового поля (координаты выходят за границы), инвертируйте соответствующую скорость (умножьте на -1). Учтите, что границы — это не сам край сцены, а внутренние края бортов. Определите их координаты (например, X от -200 до 200, Y от -140 до 140). Если шар достигает лузы (координаты близки к центрам луз), он должен исчезнуть или переместиться в специальный «карман» — просто скройте спрайт.

Порядок реализации движения
  1. 1
    Создайте переменные для каждого шара: скорость X, скорость Y, состояние покоя.
  2. 2
    Напишите скрипт для каждого шара: при запуске установить начальные координаты.
  3. 3
    В блоке «повторять всегда» обновляйте координаты и применяйте трение.
  4. 4
    Добавьте проверку на касание границ — инвертируйте скорость.
  5. 5
    Проверьте, что шары останавливаются через несколько секунд.

Столкновения шаров между собой: упрощённая модель

Для пары шаров A и B проверяйте расстояние между их центрами. Если оно меньше суммы радиусов, значит, они столкнулись. В простейшем варианте обменяйте их скорости полностью: скорость X A становится скоростью X B, и наоборот; то же для Y. Это напоминает упругий удар при равных массах, но без учёта направления удара. Для большинства случаев в Scratch этого достаточно.

Чтобы избежать многократного срабатывания при касании, используйте флаг «уже столкнулись» — например, переменную касание, которую устанавливайте в true при столкновении и сбрасывайте, когда расстояние станет больше. Или просто проверяйте, что шары не перекрываются, и сразу раздвигайте их на безопасное расстояние.

Более точная физика требует расчёта вектора столкновения: найдите угол между центрами, разложите скорости на составляющие вдоль и поперёк этой линии, обменяйте только продольные компоненты. Это можно реализовать с помощью блоков «косинус» и «синус», но код станет сложнее. Для учебного проекта упрощённый вариант — разумный компромисс.

Управление кием: прицеливание и сила удара

Кий должен вращаться вокруг белого шара. Направление задаётся положением указателя мыши: вычислите угол между белым шаром и курсором, поверните спрайт кия на этот угол. Сила удара — переменная сила, которую можно увеличивать, удерживая пробел, и уменьшать, удерживая стрелку вниз. Отображайте силу на экране (например, в виде полоски).

Удар происходит по нажатию клавиши (например, «пробел» или клик). При ударе задайте белому шару скорость, направленную под углом кия, пропорциональную силе. Разложите силу на компоненты: скорость X = сила косинус угла, скорость Y = сила синус угла. После удара кий должен отойти в сторону или стать невидимым до следующего хода.

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

Сравнение вариантов управления

Мышь + пробел

Подходит для начинающих: направление от курсора, сила удержанием пробела. Простота реализации.

Клавиатура

Стрелки для поворота, пробел для удара. Требует дополнительных блоков, но удобно на ноутбуке.

Сенсорный экран

Для планшетов: касание задаёт направление, сила — длительность удержания. Сложнее, но возможно.

Лузы и подсчёт очков: завершение игры

Определите координаты луз: четыре угла и две середины длинных сторон. Если шар оказывается в пределах небольшого радиуса от центра лузы (например, 15 пикселей), он считается забитым. В этом случае скройте спрайт шара и увеличьте счёт игрока. Для белого шара — штраф: возврат на исходную позицию.

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

Проверьте, что лузы не перекрывают борта: шары, которые катятся вдоль борта, могут застрять. Убедитесь, что радиус лузы меньше расстояния до края стола.

Типичные ошибки и как их избежать

Самая частая ошибка — шары проходят сквозь друг друга из-за слишком большой скорости. Решение: уменьшите приращение координат в каждом кадре (например, не 10, а 2) или используйте цикл с несколькими проверками внутри одного кадра. Другая проблема — шары «дрожат» при столкновении из-за того, что они не раздвигаются после касания. После обнаружения столкновения сразу переместите шары так, чтобы они не перекрывались.

Также часто забывают про трение: без него шары катятся бесконечно. Добавьте коэффициент затухания (0.98–0.99) и условие остановки при минимальной скорости. И наконец, кий может «улетать» при вращении — задайте ему точку поворота в центре белого шара с помощью блока «повернуться вокруг точки» или используйте отдельный спрайт-указатель.

Типичные ошибки
01
Шары проходят сквозь друг друга: слишком большой шаг движения, уменьшите скорость или добавьте проверку на перекрытие.
02
Шары не останавливаются: отсутствует трение, добавьте умножение скорости на 0.98 каждый кадр.
03
Кий вращается не вокруг шара: неверно задана точка поворота, используйте блок «повернуть вокруг» или обновляйте позицию кия относительно белого шара.

Расширение и настройка проекта

После базовой версии добавьте звуки ударов (в Scratch есть встроенные звуки), эффекты при забивании шара, таймер или ограничение по времени. Можно сделать режим для двух игроков: после каждого удара ход переходит к другому, если белый шар не забит. Для этого используйте переменную игрок и переключайте её.

Если хотите более реалистичную физику, изучите векторные вычисления и реализуйте точный обмен скоростями. В интернете есть готовые примеры проектов Scratch по бильярду — можно разобрать их код и адаптировать под свои задачи. Главное — не бойтесь экспериментировать и сохранять разные версии проекта.

Часто задаваемые вопросы

Сколько времени займёт создание бильярда в Scratch?

У новичка, знакомого с основами Scratch, уйдёт от 3 до 6 часов на простую версию с одним игроком и упрощённой физикой. Если вы уже умеете работать с переменными и циклами, можно уложиться быстрее.

Можно ли сделать точную физику столкновений в Scratch?

Да, но это потребует расчётов векторов, тригонометрических функций и более сложных скриптов. Для учебных целей достаточно упрощённой модели — она даёт правдоподобное поведение.

Как добавить несколько шаров разного цвета?

Создайте несколько спрайтов с одинаковыми скриптами, но разными костюмами и начальными координатами. Можно использовать один спрайт и клонировать его, но тогда сложнее управлять индивидуальными скоростями.

Что делать, если игра тормозит?

Уменьшите количество спрайтов (например, до 6 шаров), снизьте частоту обновления (используйте блок «ждать 0.01»), или упростите проверки столкновений — проверяйте только ближайшие шары.

Как реализовать удар кием без мыши?

Используйте клавиши со стрелками для поворота кия и пробел для удара. Направление задаётся углом, который меняется стрелками, а сила — удержанием пробела.

Можно ли опубликовать проект в интернете?

Да, Scratch позволяет делиться проектами через кнопку «Поделиться». Вы получите ссылку, которую можно отправить друзьям или встроить на сайт.

Итог

Что важно запомнить

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