Вопросы:
· Работа цикла с условием.
· Блок цикла с условием в Scratch.
Часто в Scratch, необходимо прервать выполнение цикла при наступлении какого-нибудь события. Мы уже делали что-то подобное раньше. Вспомним нашу игру про акулу и рыбку. Игра продолжается пока акуле не удастся схватить рыбку. Как только это произойдёт все скрипты завершаются, а значит завершается и цикл управления акулой. Но что делать, если после завершения цикла спрайт ещё должен что-то сделать, то есть нужно продолжить выполнение скрипта?
В такой ситуации нам придёт на помощь цикл с условием. Что же это за цикл такой? Сначала в нём происходит проверка условия. Если условие истинно, то выполняется тело цикла. После этого снова проверяется условие. Так происходит пока, во время одной из проверок условие не оказывается ложно. В этом случае цикл завершает свою работу, то есть выполняются команды, которые идут после цикла.
Рассмотрим цикл с условием в Scratch. Его блок, как и блоки других циклов находится в категории «Управление». Это блок «Повторять пока не...». В нём, как и в блоке ветвления есть ячейка для условия. В Scratch цикл с условием работает почти так же, как обычный. Разница в том, что нужно поменять ветви условия местами. То есть, если условие при проверке ложно, то выполняется тело цикла, а затем снова проверяется условие. Так происходит пока во время одной из проверок условие не оказывается истинно. В этом случае цикл завершает свою работу и выполняются команды, следующие за ним.
Сделаем ещё одну игру для своей коллекции. Игрок должен пробить пенальти в ворота, а второй игрок должен поймать мяч, прямо как в настоящем футболе. Пусть первый игрок управляет направлением полёта мяча, оно будет указано с помощью стрелки.
Удалим со сцены спрайт царапки. Котёнок не очень хороший футболист. Загрузим из рабочей папки фон сцены, он находится в файле «Футбольное поле». Теперь загрузим спрайты и их костюмы. Начнём со спрайта ворот. Загрузим его из файла «Ворота». Установим нужный размер ворот, и перенесём их в нужное место сцены. Добавим спрайт мяча. В библиотеке Scratch в категории «Спорт» есть замечательный футбольный мяч. Установим для него нужный размер и перенесём на точку, с которой пробивается пенальти.
Дальше загрузим спрайт футболиста. Для этого в папке «Футболист» выберем файл «Футболист один». Установим для него нужный размер. Сделаем это с помощью блока «Установить размер» из категории «Внешность». Установим размер равный четырём процентам от оригинала. Поставим футболиста за мячом. Загрузим ещё костюмы для футболиста. Для этого из папки «Футболист» загрузим файлы «Футболист 2», «Футболист 3» и «Футболист 4». Сейчас футболист смотрит вниз, хотя должен смотреть вверх, поэтому отразим все костюмы сверху вниз. Теперь футболист повёрнут в направлении мяча. По костюмам видно, что футболист будет разбегаться и бить по мячу. Установим центр всех костюмов футболиста в центре головы.
Добавим спрайт вратаря. Загрузим из папки «Вратарь» файл «Вратарь один». Как и для игрока установим его размер равным четырём процентам от оригинала. Установим вратаря перед воротами. Вратарь повёрнут в нужном направлении. Загрузим второй его костюм из файла «Вратарь два». По костюмам видно, что вратарь будет двигаться приставными шагами. Пока центр костюмов вратаря устанавливать не будем.
Стрелку, которая будет обозначать направление мяча нарисуем сами. Используем для этого инструмент «Линия». Главное нарисовать стрелку направленной вправо, чтобы её направление совпадало с направлением спрайта по умолчанию. Центр спрайта установим в основание стрелки. Установим нужный размер стрелки. Сделаем так, чтобы основание стрелки совпало с центром мяча. Когда все спрайты установлены на сцене, установим ворота в верхний слой с помощью блока из категории «Внешность».
Начнём написание скриптов. Прежде всего напишем скрипт для управления вратарём. Пусть он управляется клавишами с английскими буквами A и D. При нажатии на клавишу A вратарь будет двигаться влево, а при нажатии на D – вправо. Составим для вратаря соответствующий скрипт. Скрипт будет начинать работу при нажатии на зелёный флажок. В начале установим вратаря в середину сцены с помощью блока «Установить x в 0». Дальше удостоверимся, что он повёрнут в направлении 90 градусов с помощью соответствующего блока.
Дальше будет часть для управления спрайтом. Она будет длиться до конца игры. В цикл установим блок для сокращённой формы ветвления. В качестве условия установим в нём сенсор нажатия на клавишу A. При движении вратаря его костюмы будут меняться. Добавим в цикл соответствующую команду. Установим паузу между шагами в 0,15 секунды так, как это показано на экране. Дальше для движения добавим блок «Идти». Вратарь должен двигаться влево, при этом он повёрнут вправо, поэтому укажем количество шагов в блоке равным -5. Теперь продублируем блок ветвления и изменим его так, чтобы при нажатии клавиши D вратарь двигался вправо.
Теперь займёмся футболистом. Установим его так, чтобы он находился на 40 шагов ниже мяча. Чуть позже вы поймёте, почему. Теперь составим скрипт. Установим футболиста в нужном месте и повернём в направлении 0 градусов. Чтобы футболист при этом не ворочался, отключим вращение у его спрайта. Вначале футболист должен просто стоять. Для этого установим ему первый костюм. Опишем действия футболиста после нажатия клавиши «Пробел». У футболиста 4 костюма, поэтому добавим в скрипт цикл «Повторить 4 раза». В цикле футболист будет передвигаться на 10 шагов вперёд и менять костюм с паузой в 0,1 секунды. Мы установили футболиста за 0 шагов до мяча, так как за одно повторение цикла он будет продвигаться на 10 шагов, а всего повторений четыре. Так после выполнения цикла футболист ударит по мячу. После удара футболист должен просто стоять, поэтому добавим после цикла паузу в 1 секунду и снова сменим костюм футболиста на первый.
Запустим скрипты на выполнение и проверим, как работают управление вратарём и разбег футболиста. Пока всё работает так, как задумано. Остановим скрипты и продолжим работу. Составим скрипт для стрелки. Установим её в нужном месте и повернём в направлении ноль градусов. Дальше будет часть для управления стрелкой. Пусть при нажатии клавиш боковых стрелок стрелка, указывающая направление, поворачивается в соответствующие стороны. Добавим блок сокращённой формы ветвления, который будет срабатывать при нажатии на стрелку влево. В ветвление установим блок для поворота спрайта против часовой стрелки на 2 градуса. Продублируем блок ветвления и сделаем так, чтобы при нажатии стрелки вправо спрайт поворачивался по часовой стрелке на 2 градуса. При нажатии на клавишу «Пробел» стрелку направления нужно спрятать. Так как мы будем прятать стрелку, нужно сделать так, чтобы во время следующей игры она появилась. Добавим соответствующий блок перед стрелкой управления.
Составим скрипт для мяча. До удара по нему он должен вести себя почти так же, как стрелка, то есть оказаться на начальной позиции, повернуться в направлении ноль градусов. После этого он должен менять направление при нажатии на боковые стрелки, как и стрелка направления. Составим соответствующие части скрипта, при этом не забудем отключить у мяча вращение. Теперь опишем поведение мяча после удара по нему. Прежде нужно определить момент удара. Это можно определить по касанию спрайта футболиста. Дальше мяч должен лететь, но до какого момента? Пока не столкнётся с вратарём, воротами или краем сцены. Добавим в ветвление цикл с условием, который закончит свою работу в любом из описанных случаев. В цикле будет единственный блок «Идти 5 шагов».
Когда цикл закончит свою работу, нужно определить, с чем столкнулся мяч. Для этого добавим блок для полной формы ветвления. В качестве условия в нём установим сенсор, который сработает при касании вратаря. Что должно происходить, если мяч попадёт во вратаря? Вратарь его поймает, то есть мяч окажется в руках вратаря. Чтобы так и было, используем блок «Перейти в...», в выпадающем списке которого укажем спрайт вратаря. После выполнения этого блока мяч окажется в центре спрайта вратаря. Чтобы всё работало правильно, установим центр обоих костюмов вратаря между его руками.
Рассмотрим случай, когда мяч коснулся ворот. В этом случае просто засчитаем попадание и, чтобы не было вопросов, переместим мяч в центр ворот так же, как мы это сделали при попадании мяча во вратаря. Если мяч коснулся края сцены, ничего делать не будем. Однако, куда бы ни попал мяч, мы завершим игру, просто остановив все скрипты.
Запустим игру, нажав на зелёный флажок. Мяч сразу полетел во вратаря, и вратарь его поймал. Почему так произошло? Дело в том, что в начале скрипта футболист был рядом с мячом и уже после начала его работы переместился на начальную позицию. Так как футболист касался мяча, мяч посчитал это ударом и полетел. Чтобы этого не было, мяч должен проверять касание футболиста не сразу, а через некоторое время, поэтому установим перед соответствующим ветвлением полусекундную паузу.
Снова запустим игру. Стрелка и вратарь реагируют на клавиши управления. При нажатии на пробел мяч летит именно туда, куда направлена стрелка. Пока мяч попал во вратаря и тот его поймал. Снова запустим игру и попадём мячом в ворота. Мяч оказался в воротах. Снова запустим игру и попадём мячом в край сцены. Ничего не произошло. Всё работает, как и было задумано. В игру уже можно играть, хотя она ещё не закончена. Сохраним её в нашей рабочей папке под именем «Пенальти». Чуть позже мы ещё доведём эту игру до ума и даже немного улучшим.
Мы узнали:
· Цикл с условием позволяет задать условие своего повторения или же завершения своей работы.
· В Scratch цикл с условием представлен блоком «Повторять пока не...» из категории «Управление». В этом блоке устанавливается условие завершения работы цикла.