Циклы в Scratch. Цикл "повторять пока не …". Вложенный цикл
Мы уже не раз использовали циклы. Обычно это был цикл "повторять всегда". Всего в Scratch три разновидности цикла. Это блоки "повторять всегда", "повторить … раз", "повторять пока не …".
Цикл "повторять всегда" не дает скрипту самому закончить свою работу. В результате он работает бесконечно, повторяя и повторяя выполнение вложенных в тело цикла блоков. Прервать такое зацикливание можно, остановив работу всей программы (нажать на красный кружок над сценой) или с помощью специальной команды в теле цикла, которая срабатывает при заданном условии.
Например, спрайт может бесконечно долго перемещаться по сцене. Но при определенном событии останавливаться.
А как быть, если спрайт должен останавливаться, но сама программа продолжаться? Ведь в Scratch мы не можем добавлять команды под циклом "повторять всегда". У этого блока нет выемки внизу. Однако у нас могут быть другие скрипты, работающие независимо от первого или запускающиеся только, если получат от него сообщение.
С циклом "повторить … раз" мы тоже знакомы. Он повторяет вложенные в него команды количество раз, которое указано в его заголовке. Особенностью этого цикла является то, что заранее известно количество повторов.
Конечно, мы можем запрашивать у пользователя количество повторов, или оно может определяться в результате арифметической операции, результат которой мы не знаем. Но все-равно, когда поток выполнения программы доходит до цикла "повторить … раз", программе уже известно количество повторов.
Новым для нас и самым сложным из всех циклов является цикл "повторять пока не … ". Тело этого цикла выполняется до тех пор, пока условие в его заголовке не вернет правду. Как только условное выражение станет истинным, цикл прекратит свою работу. Но когда условие станет правдой, мы не знаем. Поэтому неизвестно количество повторов цикла.
Тело цикла "повторять пока не …" может вообще ни разу не выполниться, если условие сразу вернет правду. Или же цикл так и не сможет завершиться, если условие всегда будет оставаться ложью.
Вспомним этот пример из прошлого урока:
Здесь, если человек вводит положительное число, то программа зацикливается в цикле "повторять всегда" и спрайт ходит по сцене.
Однако, если человек вводит строку или отрицательное число, программа выполняет ветку "иначе" и завершается.
Что если мы хотим, чтобы программа продолжала запрашивать у пользователя число, пока он его не введет. То есть, когда человек вводит строку, программа должна сообщать ему о неправильном вводе и снова запрашивать число. В таком случае не обойтись без цикла "повторять пока не …".
Логика здесь следующая. Пользователя просят ввести скорость. Если он вводит положительное число, то выражение "модуль от ответ = ответ" возвращает правду. Поэтому тело цикла "повторять пока не …" не будет выполнено ни разу. Поток выполнения программы сразу перейдет к циклу "повторять всегда", внутри которого реализована ходьба спрайта.
Если человек вводит строку, выражение "модуль от ответ = ответ" возвращает ложь. Тело цикла "повторять пока не …" будет выполняться. Пользователю покажут предупреждение и снова попросят ввести скорость. Если он опять введет строку, ему снова покажут предупреждение и снова попросят ввести скорость.
И так будет до тех пор, пока человек не введет положительное число. Когда это произойдет, мы не знаем. Но только после этого программа сможет перейти к циклу "повторять всегда".
В программе выше в одном скрипте мы использовали два цикла. Они идут друг за другом. Сначала полностью завершает свою работу один и только потом начинает выполняться другой. С другой стороны, нередко бывает так, что один цикл вкладывается в другой. Почему так происходит? Потому что такова жизнь. Внутри одной цикличности может быть другая и еще какие-то действия.
Представьте, что вам надо отжаться 45 раз. При этом после каждых пятнадцати отжиманий вы должны сделать небольшой перерыв, размять кисти рук. Другими словами, выполняете три подхода по 15. Внешний цикл ‒ это цикл подходов. Он повторяется 3 раза. Внутренний цикл ‒ это цикл отжиманий одного подхода. Он повторяется 15 раз. Цикл подходов, помимо цикла отжиманий, также включает отдых и действия с кистями рук.
Вернемся в Scratch и составим программу, согласно которой кот бесконечно ходит туда-сюда, но через каждые 300 шагов останавливается на 1 секунду и говорит "Мяу".
В программе надо использовать два цикла: "повторять всегда" и "повторить … раз". Второй цикл обеспечивает анимацию трехсот шагов. Произведение количества повторов и количества шагов должно давать число 300. Например, 30 повторов по 10 шагов в общей сложности дадут 300 шагов. Если бы мы не использовали внутренний цикл, а только команду "идти 300 шагов", кот просто скакал бы по сцене и постоянно орал.
После каждых трехсот шагов кот должен мяукать и останавливаться. Для этого используются команды "играть звук … до конца" и "ждать … секунд". Эти команды должны быть за пределами внутреннего цикла, но должны оставаться внутри внешнего цикла "повторять всегда".
То есть кот делает 300 шагов, мяукает, ждет. Потом снова делает 300 шагов, мяукает, ждет. И так далее до бесконечности.
Ставить команду "играть звук … до конца" впереди команды "ждать … секунд" или сзади – не столь важно. Однако результат будет несколько различаться. Если поместить "ждать … секунд" выше, то кот сначала остановится и только через 1 секунду замяукает.
Вместо команды "играть звук … до конца" можно использовать "включить звук …". Отличие заключается в том, что вторая команда играет звук, когда кот выполняет уже следующую команду. То есть когда звук начинает проигрываться, поток выполнения программы не ждет его завершения. Звук играет как бы параллельно.
Задание 1
Установите флажок для переменной "моя переменная". Ее имя и значение будут отображаться на сцене. Пусть кот ходит по сцене туда-сюда. Переменная должна считать, сколько раз он касался края, то есть количество проходов от одного края до другого.
Задание 2
В верхнем правом углу сцены стоит автобус (спрайт City Bus). Из нижнего левого угла к нему несколько секунд "плывет" кот. После этого он начинает постепенно уменьшаться и исчезает, как будто сел в автобус.
PDF-версия курса с ответами к заданиям