Как работает цикл из блоков: три вида повторений и где их применять

Scratchобновлено 07.10.20268 мин чтенияесть тренажёр

Циклы в Scratch — это оранжевые блоки-скобки из категории «Управление», которые повторяют вложенные в них команды. Их три: «повторить 10 раз» выполняет действия заданное число раз, «повторять всегда» — пока проект не остановят, а «повторять пока не» — до тех пор, пока условие не станет истинным.

Загружаем…

Что такое цикл в Scratch

Цикл — это блок, который выполняет одни и те же команды несколько раз подряд; без него для 10 шагов пришлось бы поставить 10 одинаковых блоков, а с ним хватает одного блока-скобки с одной командой внутри.

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

Карен Бреннан и Митчел Резник из MIT Media Lab отнесли циклы к семи ключевым концепциям вычислительного мышления, которые дети осваивают, создавая проекты[1]. В статье Maloney и соавторов, где описано устройство среды, блоки повторения входят в базовый набор категории «Управление»[4]. На практике циклы — первое, что отличает сценку из пяти блоков от настоящей программы: стоит добавить повторение, и кот уже не делает шаг, а гуляет по сцене.

Удобно объяснять цикл в Scratch на бытовом примере. Утренняя зарядка — это «повторить 10 раз: присесть, встать». Чистка зубов — «повторять, пока не прозвенит таймер». А сердце бьётся по правилу «повторять всегда». Ребёнок быстро замечает, что повторения вокруг него повсюду, и начинает искать их в своих проектах сам: где кот делает одно и то же, там просится цикл. Идея не нова: ещё в языке Logo, который описал Сеймур Пейперт, была команда REPEAT — «повторить», и оранжевый блок Scratch можно считать её наследником. Полезное упражнение — взять готовый скрипт из десятка одинаковых блоков и попросить сократить его до трёх.

Три блока повторения: сравнение

В палитре «Управление» 3 блока-цикла, и выбор между ними зависит от одного вопроса: известно ли заранее, сколько раз повторять, и нужно ли вообще останавливаться.

БлокСколько раз повторяетТипичное применениеАналог в Python
«повторить 10 раз»Ровно указанное числоФигуры, короткая анимация, обратный отсчётfor i in range(10):
«повторять всегда»Пока не нажат «стоп» или «стоп все»Управление героем, фоновая музыка, проверка касанийwhile True:
«повторять пока не <…>»Пока условие ложноПадение до земли, игра до победыwhile not …:

В окошко «повторить» можно вставить не только число, но и овальный блок — переменную или результат «выдать случайное от 3 до 7». Тогда число повторов будет меняться от запуска к запуску. В блок «повторять пока не» вставляется только шестиугольное условие: касание, сравнение, нажатая клавиша.

«Повторить N раз»: фигуры и анимация

Блок «повторить 10 раз» нужен, когда число повторов известно заранее: 4 стороны квадрата, 5 лучей звезды, 3 прыжка мяча, 10 секунд обратного отсчёта.

когда щёлкнут по флажку
опустить перо
повторить 5 раз
    идти 100 шагов
    повернуть ↻ на 144 градусов
поднять перо

Этот скрипт с расширением «Перо» рисует пятиконечную звезду: пять раз отрезок и поворот на 144 градуса. Попробуйте заменить 5 и 144 на 6 и 60 — получится шестиугольник. Больше таких узоров — в уроке про рисование пером в Scratch.

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

«Повторять всегда»: сердце любой игры

Блок «повторять всегда» выполняет тело без остановки, пока не нажат красный знак «стоп» или не сработал блок «стоп все» — это основной игровой цикл, в котором герой постоянно проверяет клавиши и касания.

когда щёлкнут по флажку
перейти в x: 0 y: -150
повторять всегда
    если <клавиша [стрелка вправо] нажата?> то
        изменить x на 6
    если <клавиша [стрелка влево] нажата?> то
        изменить x на -6
    если <касается [Яблоко]?> то
        играть звук [Pop]

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

«Повторять пока не»: цикл с условием

Блок «повторять пока не <условие>» повторяет тело, пока условие ложно, и останавливается, как только оно станет истинным; после этого выполняются блоки под скобкой.

когда щёлкнут по флажку
перейти в x: 0 y: 170
повторять пока не <касается [Земля]?>
    изменить y на -4
говорить [Приземлился!] 2 секунд

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

Циклы в Scratch и в Python

Каждый оранжевый блок повторения имеет прямой аналог в Python: «повторить N раз» — это цикл for с range, а «повторять всегда» и «повторять пока не» — цикл while.

for i in range(5):
    print("Шаг номер", i + 1)

height = 20
while not height <= 0:
    height = height - 4
print("Приземлился!")

Первая часть повторяет вывод 5 раз, вторая «роняет» высоту на 4, пока она не дойдёт до нуля, — как яблоко из примера выше. Разница в записи: вместо скобки — двоеточие и отступ в 4 пробела, рекомендованный руководством PEP 8[2]. Ребёнку, который уже собирал циклы в Scratch, остаётся выучить только эту запись. Подробно о текстовом варианте — в статье про цикл for в Python, а о связи блоков и кода в целом — в материале о блочном программировании.

По федеральной образовательной программе основного общего образования циклы с условием и с переменной изучают на информатике в 8 классе[3]. Если к этому времени ученик уже собирал повторения из блоков, школьная тема даётся заметно легче.

Робот в лабиринте: уровни с повторениями

Тренажёр под заголовком — это уровни 5–8 «Робота в лабиринте», где длинные коридоры невыгодно проходить отдельными командами: нужны блоки «повторить N раз» и «повторять, пока не у флажка».

Сначала пройдите уровень «в лоб», отдельными «вперёд» и поворотами, а потом попробуйте сократить программу повторением. Сравните, сколько блоков понадобилось в обоих случаях. Кнопка «▶ Запустить» выполняет программу, «Сначала» возвращает робота на старт. Если робот упёрся в стену, проверьте число повторов: чаще всего оно на 1 больше или меньше нужного. Подборку заданий на тексте найдёте в разделе задач на циклы.

Когда повторение не нужно

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

  • Действие нужно 1 раз. «Повторить 1 раз» только загромождает скрипт.
  • Реакция на щелчок по кнопке. Хватит блока события «когда спрайт нажат», без опроса мыши 30 раз в секунду.
  • 50 одинаковых снежинок. Скрипт создаёт их по очереди, но управлять каждой удобнее через клоны.
  • Пауза на 3 секунды. Для ожидания есть блок «ждать», пустое повторение тут не нужно.

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

Миф: «Блочные повторения не похожи на настоящие». Такой разницы не существует: блок с числом повторов и for в Python решают одну задачу, отличается только запись.

Чего делать нельзя

Нельзя ставить в бесконечный повтор блоки, которые должны сработать один раз: стартовую позицию, сброс очков, первую реплику. Вот остальные правила.

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

Источники

[1] Brennan K., Resnick M. New frameworks for studying and assessing the development of computational thinking // Proceedings of the 2012 Annual Meeting of the American Educational Research Association. Vancouver, 2012.

[2] van Rossum G., Warsaw B., Coghlan N. PEP 8 — Style Guide for Python Code. Python Software Foundation, 2001.

[3] Приказ Минпросвещения России от 18.05.2023 № 370 «Об утверждении федеральной образовательной программы основного общего образования».

[4] Maloney J., Resnick M., Rusk N., Silverman B., Eastmond E. The Scratch Programming Language and Environment // ACM Transactions on Computing Education. 2010. Vol. 10, № 4. Article 16.

Вопросы и ответы

Как остановить бесконечное повторение?

Нажмите красный восьмиугольник над сценой. В самом проекте для этого ставят блок «стоп все» внутри условия, например при проигрыше.

Почему тело повторяется слишком быстро?

Между повторами нет паузы. Добавьте «ждать 0.1 секунд» внутрь — движение и анимация станут заметными.

Можно ли узнать номер текущего повтора?

Готового счётчика нет. Создайте переменную, задайте ей 0 до повтора и добавляйте 1 внутри — это аналог переменной i в Python.

Чем повтор с условием отличается от «ждать до»?

«Ждать до» просто стоит на месте, пока условие не выполнится, а повторение с условием всё это время выполняет блоки внутри.

Сколько повторов может работать одновременно?

Сколько угодно: у каждого спрайта и сцены может быть несколько скриптов со своими повторами, и все они выполняются параллельно[4].

Можно ли вложить один повтор в другой?

Да. Внутренний блок проходит целиком на каждом шаге внешнего: 3 внешних повтора по 4 внутренних дают 12 выполнений.