Примеры скриптов 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. «Процедура: прыжок с гравитацией»
-
Создайте блок:
Сделать → Создать блок… → названиепрыгнуть, галочка «Без экрана» (чтобы не блокировать другие скрипты). -
Реализация:
определить прыгнуть
если <не <[в_прыжке v]>> то
установить [в_прыжке] в (1)
установить [импульс_прыжка] в (15)
конец
- Использование:
когда нажата клавиша [пробел]
прыгнуть
- Отдельный скрипт для физики:
навсегда
если <(в_прыжке) = [1]> то
изменить y на (импульс_прыжка)
изменить [импульс_прыжка] на (-0.8) // гравитация
если <касается [платформа v] ?> то
установить [в_прыжке] в (0)
установить [импульс_прыжка] в (0)
конец
конец
ждать (0.02) сек
конец
- Преимущество: Логика прыжка инкапсулирована. Можно вызывать из разных мест (клавиша, кнопка, событие).
- Ограничение Scratch: Нельзя вернуть значение, но можно изменять глобальные переменные (как
импульс_прыжка).
Пример 9.2. «Процедура с параметром: создать частицу»**
-
Создайте блок
создать частицус параметромцвет. -
Реализация (в спрайте-шаблоне частицы, скрытом):
определить создать частицу (цвет)
создать клон самого себя
при создании клона
установить цветовое значение в (цвет)
показать
повторить (20)
изменить размер на (-2)
изменить y на (1)
ждать (0.05) сек
конец
спрятать
удалить этот клон
- Вызов:
создать частицу (100) // синяя
создать частицу (50) // зелёная
- Принцип: Параметризованные процедуры + клоны = база для эффектов (вспышки, дым, искры).
- Безопасность: Всегда
удалять клонв конце — иначе утечка памяти.
Пример 9.3. «Рекурсивная процедура: дерево (фрактал)»**
- Блок
нарисовать ветвь (длина) (уровень):
определить нарисовать ветвь (длина) (уровень)
если <(уровень) > [0]> то
переместиться на (длина) шагов
повернуть влево на (30)
нарисовать ветвь ((длина) * (0.7)) ((уровень) - (1))
повернуть вправо на (60)
нарисовать ветвь ((длина) * (0.7)) ((уровень) - (1))
повернуть влево на (30)
переместиться на (-1) * (длина) шагов // возврат
конец
- Запуск:
когда щёлкнут по ⚑
идти в точку x: (0) y: (-150)
направить в сторону (90)
опустить перо
нарисовать ветвь (50) (5)
- Глубина рекурсии:
уровень = 5— оптимально для Scratch; 6+ — возможны лаги. - Параметры:
0.7— коэффициент уменьшения длины,30°— угол ветвления.
- Важно: Scratch поддерживает рекурсию, но без защиты от переполнения стека — следите за глубиной.
10. Переменные
Переменные в Scratch хранят данные: числа, строки, логические значения. Бывают локальные (для одного спрайта) и глобальные (для всех).
Пример 10.1. «Жизни с визуальной индикацией (сердечки)»
-
Глобальные переменные:
жизни(число),макс_жизни = 3.
-
Спрайт «Сердце» (клон для каждой жизни):
когда щёлкнут по ⚑
спрятать
// Инициализация индикаторов
когда я получаю сообщение [начать_игру]
установить [номер] в (0)
повторить (макс_жизни)
изменить [номер] на (1)
создать клон самого себя
конец
при создании клона
установить x в ((номер) * (25) - (50))
установить y в (170)
показать
- Обработка урона:
когда я получаю сообщение [урон]
изменить [жизни] на (-1)
если <(жизни) < [1]> то
передать сообщение [игра_окончена]
иначе
// Скрыть самое правое сердце
отправить [спрятаться] к спрайту [Сердце v]
конец
- Спрайт «Сердце» — реакция на [спрятаться]:
когда я получаю сообщение [спрятаться]
если <[видим? v] = [true]> то
спрятать
остановить [этот скрипт v]
конец
- Преимущество:
- Визуально интуитивно (ребёнок видит, сколько «жизней» осталось),
- Легко масштабируется (меняйте
макс_жизни).
- Ошибка новичков: Попытка управлять позицией через
x = x − 25у одного спрайта — приводит к наложению. Клоны решают это.
Пример 10.2. «Счётчик комбо (удары без промаха)»**
// Инициализация
установить [комбо] в (0)
установить [макс_комбо] в (0)
// При успешном ударе
изменить [комбо] на (1)
если <(комбо) > (макс_комбо)> то
установить [макс_комбо] в (комбо)
конец
говорить (объединить [Комбо ×] (комбо)) в течение (0.8) сек
// При промахе
установить [комбо] в (0)
- Геймплейный эффект: Мотивирует точность.
- Доработка:
- Связать
комбос уроном:урон = (базовый_урон) * (1 + (комбо) / (10)), - Визуализировать шкалой (см. пример 12.1).
- Связать
Пример 10.3. «Список рекордов с сохранением (локально)»**
Scratch не поддерживает постоянное хранение, но можно эмулировать через облако (только в онлайн-версии, для зарегистрированных пользователей).
-
Облачная переменная:
облако_рекорды(строка вида100;85;73). -
Загрузка:
когда щёлкнут по ⚑
удалить все элементы списка [рекорды 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) списка [рекорды v])> то
вставить (счёт) в список [рекорды v] по индексу (1)
// Оставить только топ-5
если <(длина списка [рекорды v]) > [5]> то
удалить (6) из списка [рекорды v]
конец
// Собрать обратно в строку
установить [облако_рекорды] в []
установить [i] в (1)
повторить (длина списка [рекорды v])
установить [облако_рекорды] в (
объединить (
объединить (облако_рекорды)
(элемент (i) списка [рекорды v])
) [;]
)
изменить [i] на (1)
конец
конец
- Ограничения:
- Облако работает только в онлайн-Scratch,
- Макс. длина строки — 10240 символов,
- Нет защиты от подделки (не для коммерческих проектов).
- Альтернатива для оффлайн: Хранить в комментарии к проекту (ручное копирование).
11. Клоны
Клоны — динамические копии спрайта. Позволяют создавать снаряды, врагов, частицы без дублирования спрайтов.
Пример 11.1. «Система снарядов (пули)»**
- Спрайт «Пуля» (изначально скрыт):
когда щёлкнут по ⚑
спрятать
когда нажата клавиша [пробел]
создать клон самого себя
при создании клона
идти в спрайт [герой v]
направить в сторону (мышка)
показать
повторять до <или <касается края?> <касается [враг v] ?>>
переместиться на (10) шагов
ждать (0.02) сек
конец
спрятать
удалить этот клон
- Оптимизация:
- Не используйте
навсегдавнутри клона — толькоповторять до, - Всегда
удалять клон— иначе утечка.
- Не используйте
- Безопасность: Проверка
касается [враг v]должна идти после перемещения, иначе пуля исчезает в момент создания.
Пример 11.2. «Рой врагов с поведением»**
- Инициализация:
когда щёлкнут по ⚑
повторить (5)
создать клон спрайта [враг v]
конец
// В спрайте «враг»:
при создании клона
идти в случайное место
показать
- Поведение клона:
навсегда
направить в сторону ([герой 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. «Шкала перезарядки (полоса)»**
-
Спрайт «Шкала»: прямоугольник 100×10 пикс.
-
Логика:
// Инициализация
установить размер в (100) %
установить x в (0)
установить y в (-150)
// При начале перезарядки
установить [перезарядка_осталось] в (100) // в %
навсегда
если <(перезарядка_осталось) < [100]> то
изменить [перезарядка_осталось] на (2) // скорость
установить размер в (перезарядка_осталось) %
конец
ждать (0.05) сек
конец
- Визуал: Используйте два спрайта: фон (серый) + полоса (цветная, масштабируемая).
- Гибкость: Замените
2на переменнуюскорость_перезарядки— легко балансировать.
Пример 12.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 выстрела за раунд → используйте переменную патронов_осталось.