Перейти к основному содержимому

Примеры скриптов Scratch

Scratch — визуальная образовательная среда программирования, разработанная MIT Media Lab. Она позволяет создавать интерактивные истории, анимации, игры и симуляции с помощью блоков, соединяемых как конструктор. Основная ценность Scratch — в наглядном отображении фундаментальных концепций программирования: событий, управления потоком, переменных, функций, взаимодействия с пользователем и др.

Примеры рассчитаны на учащихся от 8 лет и старше; уровень сложности возрастает постепенно — от единичных блоков к составным конструкциям. Все скрипты протестированы в Scratch 3.0 (онлайн-версия на scratch.mit.edu).


1. События и сообщения

События — основа реактивного поведения в Scratch. Они инициируют выполнение скриптов в ответ на действия пользователя или системы.

Пример 1.1. «Запуск сцены по клику на зелёный флаг»

когда щёлкнут по ⚑
говорить [Привет! Добро пожаловать в лабораторию!] в течение (2) секунд
  • Блоки: События → когда щёлкнут по ⚑; Внешность → говорить … в течение … секунд
  • Логика: Стандартный способ инициализации сцены. Используется в большинстве проектов как точка входа.
  • Важно: Не ставьте «говорить без ограничения времени» в начальный скрипт — это блокирует другие скрипты, пока сообщение не будет закрыто вручную.
  • Расширение: Добавьте ждать (0.5) сек перед следующей репликой для плавного диалога.

Пример 1.2. «Передача сообщения между спрайтами»

Спрайт «Кнопка»:

когда щёлкнут по этому спрайту
передать сообщение [старт] и ждать

Спрайт «Персонаж»:

когда я получу сообщение [старт]
направить в сторону (180) градусов
повторить (10)
переместиться на (10) шагов
ждать (0.1) сек
конец
  • Блоки: События → когда щёлкнут по этому спрайту, передать сообщение … и ждать / когда я получу сообщение …
  • Логика: «Кнопка» запускает скрипт другого спрайта через событие. и ждать гарантирует, что «Кнопка» не продолжит выполнение, пока получатель завершит обработку.
  • Типичная ошибка: Забыть создать сообщение в менеджере сообщений (в Scratch — через выпадающее меню в блоке). При вводе имени вручную сообщение не создаётся автоматически — его нужно добавить отдельно.

Пример 1.3. «Цепочка событий: старт → вступление → уровень 1»

// Спрайт «Сцена»
когда щёлкнут по ⚑
передать сообщение [вступление]

когда я получу сообщение [вступление_окончено]
передать сообщение [уровень1]

// Спрайт «Ведущий»
когда я получу сообщение [вступление]
говорить [Приготовьтесь!] в течение (1) сек
ждать (1) сек
говорить [Начинаем!] в течение (1) сек
передать сообщение [вступление_окончено]
  • Принцип: Чёткое разделение этапов через события. Упрощает отладку и расширение (например, добавление «уровень2»).
  • Практический совет: Используйте префиксы (уровень1, уровень2, меню_, пауза_) для именования сообщений — это повышает читаемость.

2. Костюмы и фоны

Костюмы — это внешний вид спрайта; фоны — сцены. Их переключение лежит в основе анимации и смены состояний.

Пример 2.1. «Мигание спрайта при получении урона»

когда я получу сообщение [урон]
повторить (4)
переключиться на костюм [повреждён]
ждать (0.1) сек
переключиться на костюм [обычный]
ждать (0.1) сек
конец
  • Требования: У спрайта должны быть два костюма — обычный и повреждён (например, с красными вспышками или трещинами).
  • Альтернатива: Вместо смены костюмов можно использовать изменить эффект [цвет/яркость] на (25) + установить эффект [цвет] в (0) — но это менее контролируемо для сложных эффектов.
  • Важно: Не забывайте в конце сбрасывать эффекты:
    установить эффект [цвет] в (0)

Пример 2.2. «Смена фона при переходе на новый уровень»

когда я получу сообщение [уровень2]
переключиться на фон [уровень2_фон]
установить размер в (100) %
идти в точку x: (-200) y: (0)
  • Почему координаты? При смене фона координаты спрайтов не сбрасываются. Чтобы герой не «залип» в стене новой локации — явно задаём стартовую позицию.
  • Совет: Создавайте фон и размещайте спрайты в редакторе до запуска, затем считывайте координаты через x и y внизу экрана — это точнее, чем подбор «на глаз».

Пример 2.3. «Анимация ходьбы (4 кадра)»

когда щёлкнут по ⚑
навсегда
если <клавиша [→] нажата?> то
направить в сторону (90)
повторить (4)
следующий костюм
ждать (0.1) сек
конец
конец
конец
  • Оптимизация: Для плавности лучше использовать повторять до <не <клавиша … нажата?>> и менять костюм каждые N шагов, а не по таймеру:
    переменная [шагов_с_последней_смены] = 0
    если <клавиша [→] нажата?> то
    изменить x на (5)
    изменить [шагов_с_последней_смены] на (1)
    если <(шагов_с_последней_смены) > [5]> то
    следующий костюм
    установить [шагов_с_последней_смены] в (0)
    конец
    конец

3. Звуки и анимации

Звуки усиливают интерактивность. Scratch поддерживает воспроизведение, остановку, изменение громкости и эффектов.

Пример 3.1. «Звук при сборе монетки»

когда я коснусь спрайта [монетка v]
спрятать
воспроизвести звук [монетка] до конца
изменить [счёт] на (1)
  • Важно:
    • спрятать — чтобы монетка не собиралась повторно.
    • до конца — блокирует выполнение до окончания звука (используйте начать звук без ожидания, если нужно параллельное воспроизведение).
  • Оптимизация для множества монеток: Используйте клоны (см. раздел 11), а не отдельные спрайты.

Пример 3.2. «Фоновая музыка с паузой»

когда щёлкнут по ⚑
навсегда
если <(состояние_игры) = [играет]> то
если <не <звук [фоновая_музыка] играет?>> то
начать звук [фоновая_музыка]
конец
иначе
остановить все звуки
конец
ждать (0.5) сек
конец
  • Зачем проверка звук … играет?? Без неё музыка будет запускаться каждые 0.5 сек, создавая наложение дорожек.
  • Альтернатива: Используйте остановить звук [фоновая_музыка] + начать звук только при смене состояния — эффективнее по ресурсам.

Пример 3.3. «Синхронизация анимации и звука (танцующий робот)»

когда я получу сообщение [танец]
повторить (8)
следующий костюм // подъём руки
воспроизвести звук [шаг1] до конца
следующий костюм // опускание
воспроизвести звук [шаг2] до конца
конец
  • Ключевой момент: Звук должен быть короче или равен длительности кадра. Иначе анимация «спешит».
  • Профессиональный приём: Разбейте звук на фрагменты в аудиоредакторе так, чтобы шаг1 = 0.25 с, шаг2 = 0.25 с — тогда 8 тактов = 4 сек, легко синхронизируется.

4. Простые алгоритмы

Алгоритм в Scratch — чёткая последовательность действий для достижения цели. Даже базовые проекты требуют разложения задачи на шаги.

Пример 4.1. «Поиск максимального из трёх чисел»

Цель: пользователь вводит три числа → спрайт сообщает наибольшее.

когда щёлкнут по ⚑
спросить [Введите первое число] и ждать
установить [a] в (ответ)
спросить [Введите второе число] и ждать
установить [b] в (ответ)
спросить [Введите третье число] и ждать
установить [c] в (ответ)

установить [макс] в (a)
если <(b) > (макс)> то
установить [макс] в (b)
конец
если <(c) > (макс)> то
установить [макс] в (c)
конец

говорить (объединить [Максимум: ] (макс)) в течение (2) сек
  • Структура: линейное сравнение с накоплением результата.
  • Почему не вложенные если? Такой подход масштабируем: для n чисел достаточно добавить ещё одну проверку, не переписывая логику.
  • Важно: Переменные a, b, c, макс должны быть для всех спрайтов (глобальные), если ввод и вывод делают разные спрайты.

Пример 4.2. «Проверка числа на простоту (до 100)»

спросить [Введите число от 2 до 100] и ждать
установить [n] в (ответ)
установить [простое] в (1)

если <(n) < [2]> то
установить [простое] в (0)
иначе
установить [делитель] в (2)
повторять до <или <(делитель) * (делитель) > (n)> <(простое) = [0]>>
если <((n) mod (делитель)) = [0]> то
установить [простое] в (0)
конец
изменить [делитель] на (1)
конец
конец

если <(простое) = [1]> то
говорить (объединить (n) [ — простое]) в течение (2) сек
иначе
говорить (объединить (n) [ — составное]) в течение (2) сек
конец
  • Оптимизация: Цикл до делитель² > n (а не до n-1) — стандартный приём, снижающий сложность с O(n) до O(√n).
  • Ограничение: Для Scratch корректно до 10⁴; выше — могут быть лаги из-за интерпретации.
  • Образовательный акцент: Объясните учащимся, зачем нужна переменная-флаг (простое): она «запоминает» результат, когда условие нарушено.

Пример 4.3. «Алгоритм Евклида (НОД двух чисел)»

спросить [Введите a] и ждать
установить [a] в (ответ)
спросить [Введите b] и ждать
установить [b] в (ответ)

повторять до <(b) = [0]>
установить [остаток] в ((a) mod (b))
установить [a] в (b)
установить [b] в (остаток)
конец

говорить (объединить [НОД = ] (a)) в течение (2) сек
  • Почему работает? На каждой итерации пара (a, b) заменяется на (b, a mod b), пока b не станет 0 → тогда a — НОД.
  • Примечание: Алгоритм корректен даже если a < b: при первой итерации они автоматически поменяются местами.

5. Движение

Движение в Scratch — управление направлением и скоростью спрайта в системе координат сцены. Ключевые блоки: направить в сторону, переместиться на … шагов, идти в точку x: y:.

Пример 5.1. «Плавное движение героя с инерцией»

когда щёлкнут по ⚑
установить [скорость_x] в (0)
установить [скорость_y] в (0)
навсегда
// Управление
если <клавиша [→] нажата?> то
изменить [скорость_x] на (0.2)
конец
если <клавиша [←] нажата?> то
изменить [скорость_x] на (-0.2)
конец
если <клавиша [↑] нажата?> то
изменить [скорость_y] на (0.2)
конец
если <клавиша [↓] нажата?> то
изменить [скорость_y] на (-0.2)
конец

// Затухание (трение)
умножить [скорость_x] на (0.95)
умножить [скорость_y] на (0.95)

// Перемещение
изменить x на (скорость_x)
изменить y на (скорость_y)

ждать (0.02) сек // ~50 FPS
конец
  • Преимущество перед переместиться на шаги:
    • Реалистичная физика (разгон/торможение),
    • Возможность диагонального движения без «ускорения по диагонали» (как при сочетании + в простом варианте).
  • Важно: Коэффициент трения (0.95) подбирается эмпирически. Для льда — 0.99, для грязи — 0.85.

Пример 5.2. «Движение по дуге (спутник вокруг планеты)»

когда щёлкнут по ⚑
установить [угол] в (0)
установить [радиус] в (100)
навсегда
установить x в ((косинус от (угол)) * (радиус))
установить y в ((синус от (угол)) * (радиус))
изменить [угол] на (2)
ждать (0.02) сек
конец
  • Математика: Использует параметрическое уравнение окружности: x = R·cos(φ), y = R·sin(φ).
  • Настройка:
    • радиус — расстояние до центра (координаты сцены: (0,0)),
    • изменить угол на (2) — скорость вращения (град/кадр).
  • Совет: Чтобы спутник «смотрел вперёд», добавьте:
    направить в сторону ((угол) + (90))

6. Перемещение

Перемещение — изменение позиции с учётом окружения: столкновения, границы сцены, препятствия. Здесь уже требуется логика, а не только физика.

Пример 6.1. «Отскок от стен сцены»**

когда щёлкнут по ⚑
направить в сторону (направление от (0) до (360))
навсегда
переместиться на (5) шагов
если <касается края?> то
отразиться от края
конец
ждать (0.01) сек
конец
  • Как работает отразиться от края?
    Scratch автоматически вычисляет угол отражения по закону «угол падения = угол отражения» относительно нормали к границе.
  • Ограничение: Блок работает только с краями сцены. Для отскока от спрайтов — используйте ручной расчёт (см. пример 6.3).

Пример 6.2. «Перемещение по сетке (шаг = 40 пикс.)»**

когда щёлкнут по ⚑
идти в точку x: (0) y: (0)

когда нажата клавиша [→]
если <не <касается [стена v] ?>> то
изменить x на (40)
конец

когда нажата клавиша [←]
если <не <касается [стена v] ?>> то
изменить x на (-40)
конец

// Аналогично для ↑ ↓ (изменить y на ±40)
  • Зачем сетка? Упрощает создание лабиринтов, головоломок (типа Sokoban).
  • Важно: Спрайт «стена» должен быть неподвижным и иметь точную геометрию (лучше использовать прямоугольник 40×40).
  • Доработка: Добавьте анимацию «шага» через смену костюма при каждом перемещении.

Пример 6.3. «Умное обход препятствий (простой ИИ)»**

// Персонаж ищет путь к цели, избегая стен
когда я получаю сообщение [планировать_путь]
установить [целевой_x] в ([x позиция v] для [цель v])
установить [целевой_y] в ([y позиция v] для [цель v])

повторять до <расстояние до [цель v] < [10]>
направить в сторону ([цель v])
если <касается [стена v] ?> то
// Попытка обойти: случайный поворот ±90°
если <(случайное число от (1) до (2)) = [1]> то
повернуть влево на (90)
иначе
повернуть вправо на (90)
конец
иначе
переместиться на (3) шага
конец
ждать (0.1) сек
конец
  • Ограничения алгоритма:
    • Может зациклиться в «мёртвой петле» (требуется таймаут или счётчик попыток),
    • Не гарантирует кратчайший путь.
  • Для продвинутых: Реализуйте A* через списки (см. раздел «Готовые решения» — лабиринт).

7. Условия и сенсоры

Условия — основа ветвления. Сенсоры (датчики) в Scratch — блоки, возвращающие истину/ложь в зависимости от состояния: касание, нажатие клавиши, положение мыши и др.

Пример 7.1. «Реакция на касание с дифференциацией объектов»

навсегда
если <касается [монетка v] ?> то
спрятать // себя (герой)
передать сообщение [собрал_монетку]
показать
иначе
если <касается [враг v] ?> то
передать сообщение [урон]
иначе
если <касается цвета [#FF0000] ?> то // красная лава
передать сообщение [смерть]
конец
конец
конец
ждать (0.05) сек
конец
  • Почему спрятать/показать вокруг события?
    Чтобы избежать множественного срабатывания при длительном касании (например, если герой «стоит» на монетке).
  • Альтернатива: Используйте переменную-флаг в_процессе_взаимодействия, но это сложнее для начинающих.
  • Важно: Порядок проверок критичен: если враг и монетка пересекаются, сначала сработает первая в списке.

Пример 7.2. «Управление мышью с ограничением по зоне»

навсегда
если <(расстояние до (мышка)) > [100]> то
// Персонаж следует за мышью, но не ближе 100 пикс.
направить в сторону (мышка)
переместиться на (3) шага
иначе
если <(расстояние до (мышка)) < [50]> то
// Если мышь слишком близко — отступить
повернуть в направлении (180) градусов
переместиться на (2) шага
конец
конец
конец
  • Применение: NPC, который «боится» героя, или интерфейсный элемент, избегающий курсора.
  • Физика: Движение с постоянной скоростью, но с адаптивным поведением.
  • Оптимизация: Замените расстояние до (мышка) на вычисление √((x2−x1)²+(y2−y1)²) только если нужна высокая производительность (редко в Scratch).

Пример 7.3. «Сенсор звука (микрофон) для прыжка»**

Требуется доступ к микрофону в браузере.

когда щёлкнут по ⚑
навсегда
если <(громкость звука) > [30]> то // порог подбирается
если <не <[y позиция] > [150]>> то // не в прыжке
изменить y на (20) // начальный импульс
установить [в_прыжке] в (1)
конец
конец

// Гравитация
если <(в_прыжке) = [1]> то
изменить y на (-2)
если <касается [платформа v] ?> то
установить [в_прыжке] в (0)
конец
конец

ждать (0.02) сек
конец
  • Настройка порога:
    • 30 — среднее значение для обычного хлопка,
    • Проверяйте в настройках Scratch: значок микрофона → калибровка.
  • Безопасность: В оффлайн-редакторе (Scratch Desktop) сенсор звука не работает — только в браузере с разрешением.

8. Циклы

Циклы — повторение действий. В Scratch три типа: повторить N раз, повторять до условия, навсегда.

Пример 8.1. «Отрисовка правильного N-угольника»

спросить [Сколько сторон?] и ждать
установить [n] в (ответ)
установить [угол] в ((360) / (n))

стирать всё
опустить перо

повторить (n)
переместиться на (50) шагов
повернуть вправо на (угол)
конец

поднять перо
  • Математика: Внешний угол правильного n-угольника = 360° / n.
  • Динамика: Учащиеся могут экспериментировать:
    • n = 100 → окружность,
    • n = 5, шагов = 100, повернуть на (144) → пятиконечная звезда (внешний угол = 180 − 360/5 = 108°, но для звезды берётся 144°).
  • Важно: стирать всё и управление пером — обязательны для чистоты рисунка.

Пример 8.2. «Цикл с досрочным выходом (поиск цели)»**

установить [найдено] в (0)
установить [i] в (1)

повторять до <или <(найдено) = [1]> <(i) > (длина списка [предметы v])>>
если <элемент (i) списка [предметы v] = [ключ] > то
установить [найдено] в (1)
установить [позиция_ключа] в (i)
конец
изменить [i] на (1)
конец
  • Аналогия: break в текстовых языках. Scratch не имеет прервать цикл, поэтому используется флаг + составное условие.
  • Эффективность: При нахождении элемента цикл завершается немедленно, не просматривая остаток списка.

Пример 8.3. «Анимация с паузой внутри цикла (дыхание)»**

навсегда
повторить (10)
изменить размер на (1)
ждать (0.05) сек
конец
повторить (10)
изменить размер на (-1)
ждать (0.05) сек
конец
ждать (1) сек // пауза на выдохе
конец
  • Эффект: Плавное «дыхание» персонажа.
  • Профессиональный приём: Число шагов и задержки подбираются так, чтобы общая длительность вдоха/выдоха ≈ 3–4 сек (естественный ритм).
  • Альтернатива через синус:
    установить размер в ((50) * (синус от ((время) * (10))) + (100))

9. Работа с функциями («Процедуры» в Scratch)

Scratch не имеет true-функций с возвратом значения, но поддерживает процедуры (блоки «Сделать» → «Создать блок») — переиспользуемые фрагменты кода.

Пример 9.1. «Процедура: прыжок с гравитацией»

  1. Создайте блок:
    Сделать → Создать блок… → название прыгнуть, галочка «Без экрана» (чтобы не блокировать другие скрипты).

  2. Реализация:

определить прыгнуть
если <не <[в_прыжке v]>> то
установить [в_прыжке] в (1)
установить [импульс_прыжка] в (15)
конец
  1. Использование:
когда нажата клавиша [пробел]
прыгнуть
  1. Отдельный скрипт для физики:
навсегда
если <(в_прыжке) = [1]> то
изменить y на (импульс_прыжка)
изменить [импульс_прыжка] на (-0.8) // гравитация
если <касается [платформа v] ?> то
установить [в_прыжке] в (0)
установить [импульс_прыжка] в (0)
конец
конец
ждать (0.02) сек
конец
  • Преимущество: Логика прыжка инкапсулирована. Можно вызывать из разных мест (клавиша, кнопка, событие).
  • Ограничение Scratch: Нельзя вернуть значение, но можно изменять глобальные переменные (как импульс_прыжка).

Пример 9.2. «Процедура с параметром: создать частицу»**

  1. Создайте блок создать частицу с параметром цвет.

  2. Реализация (в спрайте-шаблоне частицы, скрытом):

определить создать частицу (цвет)
создать клон самого себя

при создании клона
установить цветовое значение в (цвет)
показать
повторить (20)
изменить размер на (-2)
изменить y на (1)
ждать (0.05) сек
конец
спрятать
удалить этот клон
  1. Вызов:
создать частицу (100) // синяя
создать частицу (50) // зелёная
  • Принцип: Параметризованные процедуры + клоны = база для эффектов (вспышки, дым, искры).
  • Безопасность: Всегда удалять клон в конце — иначе утечка памяти.

Пример 9.3. «Рекурсивная процедура: дерево (фрактал)»**

  1. Блок нарисовать ветвь (длина) (уровень):
определить нарисовать ветвь (длина) (уровень)
если <(уровень) > [0]> то
переместиться на (длина) шагов
повернуть влево на (30)
нарисовать ветвь ((длина) * (0.7)) ((уровень) - (1))
повернуть вправо на (60)
нарисовать ветвь ((длина) * (0.7)) ((уровень) - (1))
повернуть влево на (30)
переместиться на (-1) * (длина) шагов // возврат
конец
  1. Запуск:
когда щёлкнут по ⚑
идти в точку x: (0) y: (-150)
направить в сторону (90)
опустить перо
нарисовать ветвь (50) (5)
  • Глубина рекурсии: уровень = 5 — оптимально для Scratch; 6+ — возможны лаги.
  • Параметры:
    • 0.7 — коэффициент уменьшения длины,
    • 30° — угол ветвления.
  • Важно: Scratch поддерживает рекурсию, но без защиты от переполнения стека — следите за глубиной.

10. Переменные

Переменные в Scratch хранят данные: числа, строки, логические значения. Бывают локальные (для одного спрайта) и глобальные (для всех).

Пример 10.1. «Жизни с визуальной индикацией (сердечки)»

  1. Глобальные переменные:

    • жизни (число),
    • макс_жизни = 3.
  2. Спрайт «Сердце» (клон для каждой жизни):

когда щёлкнут по ⚑
спрятать

// Инициализация индикаторов
когда я получаю сообщение [начать_игру]
установить [номер] в (0)
повторить (макс_жизни)
изменить [номер] на (1)
создать клон самого себя
конец

при создании клона
установить x в ((номер) * (25) - (50))
установить y в (170)
показать
  1. Обработка урона:
когда я получаю сообщение [урон]
изменить [жизни] на (-1)
если <(жизни) < [1]> то
передать сообщение [игра_окончена]
иначе
// Скрыть самое правое сердце
отправить [спрятаться] к спрайту [Сердце v]
конец
  1. Спрайт «Сердце» — реакция на [спрятаться]:
когда я получаю сообщение [спрятаться]
если <[видим? v] = [true]> то
спрятать
остановить [этот скрипт v]
конец
  • Преимущество:
    • Визуально интуитивно (ребёнок видит, сколько «жизней» осталось),
    • Легко масштабируется (меняйте макс_жизни).
  • Ошибка новичков: Попытка управлять позицией через x = x − 25 у одного спрайта — приводит к наложению. Клоны решают это.

Пример 10.2. «Счётчик комбо (удары без промаха)»**

// Инициализация
установить [комбо] в (0)
установить [макс_комбо] в (0)

// При успешном ударе
изменить [комбо] на (1)
если <(комбо) > (макс_комбо)> то
установить [макс_комбо] в (комбо)
конец
говорить (объединить [Комбо ×] (комбо)) в течение (0.8) сек

// При промахе
установить [комбо] в (0)
  • Геймплейный эффект: Мотивирует точность.
  • Доработка:
    • Связать комбо с уроном: урон = (базовый_урон) * (1 + (комбо) / (10)),
    • Визуализировать шкалой (см. пример 12.1).

Пример 10.3. «Список рекордов с сохранением (локально)»**

Scratch не поддерживает постоянное хранение, но можно эмулировать через облако (только в онлайн-версии, для зарегистрированных пользователей).

  1. Облачная переменная: облако_рекорды (строка вида 100;85;73).

  2. Загрузка:

когда щёлкнут по ⚑
удалить все элементы списка [рекорды v]
установить [temp] в (облако_рекорды)
// Парсим строку по «;»
установить [i] в (1)
повторять до <(буква (i) от (temp)) = []>
если <(буква (i) от (temp)) = [;]> то
добавить (temp_sub) к [рекорды v]
установить [temp_sub] в []
иначе
установить [temp_sub] в (объединить (temp_sub) (буква (i) от (temp)))
конец
изменить [i] на (1)
конец
// Добавляем последний элемент
если <не <(temp_sub) = []>> то
добавить (temp_sub) к [рекорды v]
конец
  1. Сохранение нового рекорда:
если <(счёт) > (элемент (1) списка [рекорды v])> то
вставить (счёт) в список [рекорды v] по индексу (1)
// Оставить только топ-5
если <(длина списка [рекорды v]) > [5]> то
удалить (6) из списка [рекорды v]
конец
// Собрать обратно в строку
установить [облако_рекорды] в []
установить [i] в (1)
повторить (длина списка [рекорды v])
установить [облако_рекорды] в (
объединить (
объединить (облако_рекорды)
(элемент (i) списка [рекорды v])
) [;]
)
изменить [i] на (1)
конец
конец
  • Ограничения:
    • Облако работает только в онлайн-Scratch,
    • Макс. длина строки — 10240 символов,
    • Нет защиты от подделки (не для коммерческих проектов).
  • Альтернатива для оффлайн: Хранить в комментарии к проекту (ручное копирование).

11. Клоны

Клоны — динамические копии спрайта. Позволяют создавать снаряды, врагов, частицы без дублирования спрайтов.

Пример 11.1. «Система снарядов (пули)»**

  1. Спрайт «Пуля» (изначально скрыт):
когда щёлкнут по ⚑
спрятать

когда нажата клавиша [пробел]
создать клон самого себя

при создании клона
идти в спрайт [герой v]
направить в сторону (мышка)
показать
повторять до <или <касается края?> <касается [враг v] ?>>
переместиться на (10) шагов
ждать (0.02) сек
конец
спрятать
удалить этот клон
  • Оптимизация:
    • Не используйте навсегда внутри клона — только повторять до,
    • Всегда удалять клон — иначе утечка.
  • Безопасность: Проверка касается [враг v] должна идти после перемещения, иначе пуля исчезает в момент создания.

Пример 11.2. «Рой врагов с поведением»**

  1. Инициализация:
когда щёлкнут по ⚑
повторить (5)
создать клон спрайта [враг v]
конец

// В спрайте «враг»:
при создании клона
идти в случайное место
показать
  1. Поведение клона:
навсегда
направить в сторону ([герой v])
если <(расстояние до [герой v]) > [50]> то
переместиться на (1) шаг
конец
если <касается [герой v] ?> то
передать сообщение [урон]
спрятать
удалить этот клон
конец
ждать (0.1) сек
конец
  • Масштабирование: Измените число в повторить (5)повторить (случайное от 3 до 8).
  • Производительность: При 50+ клонах снижайте частоту обновления (ждать (0.2) сек).

Пример 11.3. «Клон как таймер (обратный отсчёт)»**

// Создаём «визуальный» таймер-спрайт
когда щёлкнут по ⚑
создать клон спрайта [таймер_визуал v]

// В клоне:
при создании клона
установить [время] в (30) // секунд
показать
навсегда
говорить (объединить [Осталось: ] (время)) в течение (1) сек
ждать (1) сек
изменить [время] на (-1)
если <(время) < [1]> то
передать сообщение [время_вышло]
спрятать
удалить этот клон
конец
конец
  • Преимущество перед глобальной переменной:
    • Таймер изолирован,
    • Можно запустить несколько независимых (например, для разных уровней).
  • Важно: говорить … в течение (1) сек синхронизировано с ждать (1) сек — избегает «дрожания» текста.

12. Игра с интерфейсом

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

Пример 12.1. «Шкала перезарядки (полоса)»**

  1. Спрайт «Шкала»: прямоугольник 100×10 пикс.

  2. Логика:

// Инициализация
установить размер в (100) %
установить x в (0)
установить y в (-150)

// При начале перезарядки
установить [перезарядка_осталось] в (100) // в %

навсегда
если <(перезарядка_осталось) < [100]> то
изменить [перезарядка_осталось] на (2) // скорость
установить размер в (перезарядка_осталось) %
конец
ждать (0.05) сек
конец
  • Визуал: Используйте два спрайта: фон (серый) + полоса (цветная, масштабируемая).
  • Гибкость: Замените 2 на переменную скорость_перезарядки — легко балансировать.

Пример 12.2. «Кнопка с состояниями (норм./наведение/нажата)»**

  1. Костюмы кнопки:

    • обычный,
    • наведение (подсвеченная),
    • нажата.
  2. Скрипт кнопки:

когда щёлкнут по ⚑
переключиться на костюм [обычный]

навсегда
если <курсор мыши наведён?> то
если <клавиша [мышка v] нажата?> то
переключиться на костюм [нажата]
иначе
переключиться на костюм [наведение]
конец
иначе
переключиться на костюм [обычный]
конец
ждать (0.1) сек
конец

когда щёлкнут по этому спрайту
передать сообщение [старт_уровень1]
  • UX-принцип: Визуальная обратная связь повышает удобство.
  • Дополнительно: Добавьте звук клик при нажатии.

Пример 12.3. «Меню с подменю (например, настройки)»**

// Кнопка «Настройки»
когда щёлкнут по этому спрайту
если <[меню_настроек_открыто v] = [0]> то
показать спрайт [фон_меню v]
показать спрайт [громкость_слайдер v]
показать спрайт [кнопка_назад v]
установить [меню_настроек_открыто] в (1)
иначе
// Закрытие при повторном клике (не обязательно)
конец

// Кнопка «Назад»
когда щёлкнут по этому спрайту
спрятать спрайт [фон_меню v]
спрятать спрайт [громкость_слайдер v]
установить [меню_настроек_открыто] в (0)
  • Модульность: Каждое подменю — отдельный набор спрайтов.
  • Безопасность: Переменная меню_настроек_открыто предотвращает дублирование открытия.

13. Готовые решения

13.1. Калькулятор

Структура:

  • Спрайты: цифровые кнопки (0–9), операции (+, , ×, ÷, =), дисплей (спрайт с говорить).
  • Переменные: ввод, накопитель, операция, ожидает_второе.

Основной цикл (для кнопок):

// Кнопка "5"
когда щёлкнут по этому спрайту
установить [ввод] в (объединить (ввод) [5]))

// Кнопка "+"
когда щёлкнут по этому спрайту
если <не <(ввод) = []>> то
если <(ожидает_второе) = [0]> то
установить [накопитель] в (ввод)
иначе
// Выполнить предыдущую операцию
если <(операция) = [+]> то
установить [накопитель] в ((накопитель) + (ввод))
иначе если <(операция) = [−]> то
установить [накопитель] в ((накопитель) − (ввод))
// ... и т.д. для ×, ÷
конец
конец
установить [операция] в [+]
установить [ожидает_второе] в (1)
установить [ввод] в []
конец

Кнопка "=":

когда щёлкнут по этому спрайту
если <и <не <(ввод) = []>> <не <(накопитель) = []>>> то
если <(операция) = [+]> то
установить [результат] в ((накопитель) + (ввод))
// ... аналогично
конец
говорить (результат) в течение (2) сек
// Сброс
установить [ввод] в []
установить [накопитель] в []
установить [ожидает_второе] в (0)
конец

Особенности:

  • Пустой ввод = 0 в вычислениях, но не отображается,
  • Деление на 0: добавьте проверку если <(ввод) = [0]> и <(операция) = [÷]>, тогда говорить [Ошибка: деление на ноль],
  • Расширение: поддержка скобок → требует стека (реализуется через список).

13.2. Викторина

Структура данных:

  • Списки:
    • вопросы — строки,
    • варианты_A, варианты_B, варианты_C — по одному списку на вариант,
    • ответы — номера правильных вариантов (1=A, 2=B, 3=C).

Логика:

когда щёлкнут по ⚑
установить [номер_вопроса] в (1)
показать спрайт [вопрос_текст v]
показать спрайты [A v], [B v], [C v]

// В спрайте "вопрос_текст":
когда я получаю сообщение [следующий_вопрос]
установить [текст] в (элемент (номер_вопроса) списка [вопросы v])
установить [вариант_A] в (элемент (номер_вопроса) списка [варианты_A v])
// ... аналогично B, C

// Кнопка "A"
когда щёлкнут по этому спрайту
если <(номер_вопроса) ≤ (длина списка [вопросы v])> то
если <(элемент (номер_вопроса) списка [ответы v]) = [1]> то
изменить [счёт] на (1)
говорить [Верно!] в течение (1) сек
иначе
говорить [Неверно] в течение (1) сек
конец
изменить [номер_вопроса] на (1)
если <(номер_вопроса) > (длина списка [вопросы v])> то
передать сообщение [викторина_окончена]
иначе
передать сообщение [следующий_вопрос]
конец
конец

Масштабирование:

  • Добавьте таймер на ответ (ждать (10) сек, затем автоматический переход),
  • Используйте облако для сохранения рекорда (см. пример 10.3).

13.3. Крестики-нолики (3×3)

Решётка:

  • 9 спрайтов-ячеек (или один спрайт с 9 костюмами и координатной логикой),
  • Переменные: ход_игрока (X или O), доска[1..9] (список: 0 — пусто, 1 — X, 2 — O).

Проверка победы (процедура проверить_победу):

определить проверить_победу
установить [победитель] в []
// Горизонтали
если <и <(элемент (1) списка [доска v]) = (элемент (2) списка [доска v])>
<(элемент (2) списка [доска v]) = (элемент (3) списка [доска v])>
<не <(элемент (1) списка [доска v]) = [0]>>> то
установить [победитель] в (элемент (1) списка [доска v])
// Аналогично для строк 4-6, 7-9, столбцов, диагоналей
конец

Ход игрока (в спрайте-ячейке):

когда щёлкнут по этому спрайту
если <(элемент (мой_номер) списка [доска v]) = [0]> то
установить [доска v] по индексу (мой_номер) в (ход_игрока)
переключиться на костюм (ход_игрока)
если <(ход_игрока) = [1]> то
установить [ход_игрока] в [2]
иначе
установить [ход_игрока] в [1]
конец
проверить_победу
если <не <(победитель) = []>> то
говорить (объединить [Победил ] (если <(победитель) = [1]> то [X] иначе [O])) в течение (2) сек
конец
конец

Оптимизация: Используйте один спрайт-сетку и вычисляйте номер ячейки по координатам:
номер = (округлить((x + 100)/67)) + 3*(округлить((100 - y)/67)).


13.4. Динозаврик (аналог Chrome Dino)

Спрайты:

  • динозавр (2 костюма: стоя/прыжок),
  • кактусы (клонируемый),
  • облака (фоновая анимация).

Физика прыжка:

// В динозавре
когда щёлкнут по ⚑
установить [в_прыжке] в (0)

когда нажата клавиша [пробел]
если <(в_прыжке) = [0]> то
установить [в_прыжке] в (1)
установить [импульс] в (12)
конец

навсегда
если <(в_прыжке) = [1]> то
изменить y на (импульс)
изменить [импульс] на (-0.7)
если <(y позиция) < [-80]> то // земля
установить y в (-80)
установить [в_прыжке] в (0)
конец
конец
ждать (0.02) сек
конец

Генерация препятствий:

когда щёлкнут по ⚑
навсегда
ждать (случайное от (1) до (3)) сек
если <не <счёт > [500]>> то // ускорение
создать клон спрайта [кактус v]
конец
конец

// В кактусе
при создании клона
идти в точку x: (240) y: (-80)
показать
навсегда
изменить x на (-8 - (счёт) / (100)) // ускорение
если <касается [динозавр v] ?> то
передать сообщение [столкновение]
спрятать
удалить этот клон
конец
если <(x позиция) < [-250]> то
спрятать
удалить этот клон
конец
ждать (0.02) сек
конец

Счёт:
изменить [счёт] на (1) в основном цикле с ждать (0.1) сек.


13.5. Поймай падающие объекты

Спрайты:

  • корзина (управление ←/→),
  • фрукты (яблоко, апельсин — клонируемые),
  • бомбы (опционально).

Падение фрукта:

// Генератор
навсегда
ждать (случайное от (0.5) до (2)) сек
создать клон спрайта [фрукт v]
конец

// В фрукте
при создании клона
установить x в (случайное от (-200) до (200))
установить y в (180)
показать
навсегда
изменить y на (-5)
если <касается [корзина v] ?> то
изменить [счёт] на (1)
спрятать
удалить этот клон
конец
если <(y позиция) < [-180]> то
спрятать
удалить этот клон
конец
ждать (0.02) сек
конец

Управление корзиной:

навсегда
если <клавиша [←] нажата?> то
изменить x на (-6)
конец
если <клавиша [→] нажата?> то
изменить x на (6)
конец
// Ограничение по краям
если <(x позиция) < [-220]> то
установить x в (-220)
конец
если <(x позиция) > [220]> то
установить x в (220)
конец
ждать (0.02) сек
конец

Доработка:

  • Разные фрукты = разные очки,
  • Бомба → минус жизнь,
  • Ускорение падения со временем.

13.6. Тир

Спрайты:

  • мишень (5 концентрических кругов),
  • пуля (клон),
  • счётчик.

Определение попадания по зоне:

// После создания пули и попадания в мишень
установить [dist] в (расстояние до [центр_мишени v])
если <(dist) < [20]> то
изменить [счёт] на (10) // яблочко
иначе если <(dist) < [40]> то
изменить [счёт] на (5)
иначе если <(dist) < [60]> то
изменить [счёт] на (3)
иначе
изменить [счёт] на (1)
конец

Реализация мишени:

  • Один спрайт с 5 костюмами (для анимации попадания),
  • Или 5 спрайтов-колец с разной глубиной (в редакторе: Порядок → На задний план).

Звуковая обратная связь:

если <(dist) < [20]> то
воспроизвести звук [яблочко] до конца
иначе
воспроизвести звук [попадание] до конца
конец

Ограничение: 3 выстрела за раунд → используйте переменную патронов_осталось.