Как спрайт принимает решения: условия «если», сравнения и клавиши

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

Условия в Scratch — это блоки «если … то» и «если … то … иначе» из категории «Управление»: они выполняют вложенные команды только тогда, когда проверка в шестиугольном окошке истинна. Проверкой может быть касание, нажатая клавиша или сравнение чисел, и именно условия превращают анимацию в игру с правилами.

Загружаем…

Что такое условие в Scratch

Условие — это вопрос, на который программа отвечает «да» или «нет»: «касается ли кот стены?», «нажат ли пробел?», «больше ли очков, чем 10?». От ответа зависит, какие блоки выполнятся дальше.

В школьной информатике такую конструкцию называют ветвлением: путь программы раздваивается, и выбирается одна из веток. По федеральной образовательной программе основного общего образования ветвления и составные условия изучают в 8 классе[1], но в Scratch ребёнок встречает их гораздо раньше — как только хочет, чтобы игра заканчивалась при касании врага. Карен Бреннан и Митчел Резник из MIT Media Lab включили условия в число семи базовых концепций вычислительного мышления[2], наряду с циклами, событиями и данными.

Их подход к оценке в исследовании строится на разборе проектов самого ребёнка: понятие считается освоенным, когда он применяет его в своей работе, а не когда пересказывает определение. Поэтому условие лучше вводить через задачу: «сделай так, чтобы игра заканчивалась при касании призрака». Объяснение «что такое ветвление» после этого почти не нужно — ребёнок уже им пользуется.

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

«Если … то» и «если … то … иначе»

В палитре «Управление» 2 блока условий: «если … то» выполняет действия только при истинной проверке, а «если … то … иначе» имеет вторую ветку для случая, когда проверка ложна.

БлокЧто происходит, если проверка истиннаЧто происходит, если ложнаПример
«если … то»Выполняются блоки внутриНичего, скрипт идёт дальшеКоснулся монеты — плюс очко
«если … то … иначе»Выполняется верхняя веткаВыполняется нижняя веткаОтвет верный — «Молодец!», иначе — «Попробуй ещё»
«ждать до …»Скрипт продолжает работуСкрипт стоит и ждётЖдать, пока не нажат пробел
«повторять пока не …»Повторение заканчиваетсяТело повторяется сноваПадать, пока не коснулся земли

Два нижних блока тоже принимают шестиугольные проверки, хотя формально относятся к ожиданию и повторению. Блока «иначе если», как в текстовых языках, среди блоков для условия в Scratch нет: когда вариантов три и больше, второе «если … иначе» вкладывают в ветку «иначе» первого.

Шестиугольные блоки: какие бывают проверки

Проверка в Scratch — это всегда шестиугольный блок; их можно найти в 2 категориях: голубые «Сенсоры» отвечают на вопросы о касаниях, клавишах и мыши, зелёные «Операторы» сравнивают значения и соединяют проверки.

  • «касается … ?» — касается ли спрайт края сцены, указателя мыши или другого спрайта.
  • «касается цвета … ?» — касается ли спрайт выбранного цвета, например синей воды или чёрной стены.
  • «цвет … касается … ?» — касается ли один цвет костюма другого цвета на сцене.
  • «клавиша … нажата?» и «мышь нажата?» — нажата ли клавиша или кнопка мыши прямо сейчас.
  • «>», «<», «=» — сравнение чисел и текста.
  • «и», «или», «не» — соединение и отрицание проверок.

Цвет в блоке «касается цвета» выбирают пипеткой прямо со сцены — так точнее, чем подбирать оттенок на глаз. Цветовые проверки — одна из особенностей среды из MIT: игру с условием можно собрать без единого числа[3]. Если стена нарисована с градиентом или сглаженными краями, проверка может срабатывать не всегда: для игр стены лучше закрашивать одним сплошным цветом.

Почему условие ставят внутрь цикла

Блок «если» проверяет условие ровно 1 раз — в тот момент, когда до него дошла очередь. Чтобы игра постоянно следила за касаниями, условие кладут внутрь «повторять всегда».

Условие в Scratch без цикла — самая частая ошибка новичка: он ставит под флажком «если касается врага, то стоп все» — и удивляется, что ничего не происходит. На самом деле проверка сработала, но в первую же долю секунды, когда кот был далеко от врага, а больше её никто не повторял. В цикле проверка выполняется много раз в секунду, и касание будет замечено.

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

Этот скрипт возвращает героя на старт при каждом касании призрака: условие в Scratch проверяется на каждом повторе, и ни одно касание не проскочит. Обратите внимание на «говорить … 1 секунд»: пока реплика на экране, скрипт ждёт, и это заодно защищает от повторного срабатывания в следующую же долю секунды.

Касания: край, другой спрайт, цвет

Касания — это 3 самые популярные проверки в играх: касание края удерживает героя на экране, касание спрайта отвечает за монеты и врагов, а касание цвета — за стены лабиринта, лаву и финиш.

когда щёлкнут по флажку
перейти в x: -210 y: 150
повторять всегда
    если <клавиша [стрелка вправо] нажата?> то
        изменить x на 3
    если <касается цвета [чёрный]?> то
        перейти в x: -210 y: 150
    если <касается цвета [зелёный]?> то
        говорить [Финиш!]
        стоп [все]

Это каркас игры-лабиринта: чёрные стены отправляют на старт, зелёная клетка останавливает игру. Остальные стрелки добавляются по образцу. Полный пошаговый разбор с уровнями — в статье про лабиринт в Scratch, а про сами стрелки и координаты — в уроке о движении спрайтов.

Сравнения и составные условия

Сравнение — это зелёный шестиугольник «>», «<» или «=», в окошки которого вставляют числа, переменные или ответ пользователя; «и», «или», «не» собирают из нескольких проверок одну.

Например, «если очки > 9 то переключить фон на Победа». Составное условие «касается монеты и клавиша пробел нажата» истинно, только когда верны обе части; «или» — когда верна хотя бы одна; «не» переворачивает ответ. Эти же логические операции «и», «или», «не» по ФОП изучают на информатике в 8 классе, а таблицы истинности для них можно построить в статье о логических операциях.

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

Пример: проверка ответа в викторине

Чтобы проверить ответ игрока, нужно 3 блока: «спросить … и ждать» показывает вопрос и поле ввода, овальный «ответ» хранит то, что ввёл игрок, а «если … то … иначе» сравнивает его с правильным.

когда щёлкнут по флажку
спросить [Сколько будет 7 × 8?] и ждать
если <(ответ) = [56]> то
    говорить [Верно!] 2 секунд
иначе
    говорить [Нет, это 56] 2 секунд

Кот задаёт вопрос, ребёнок вводит число, и условие решает, какая из двух веток сработает: похвала или подсказка. Добавьте переменную очков и ещё несколько вопросов — получится настоящая викторина.

Условия в Scratch и if в Python

Блок «если … то» — это if в Python, «иначе» — else, а вложенное «если … иначе» внутри ветки «иначе» заменяется коротким словом elif.

otvet = 56
if otvet == 56:
    print("Верно!")
else:
    print("Нет, это 56")

ochki = 12
if ochki > 20:
    print("Золото")
elif ochki > 9:
    print("Серебро")
else:
    print("Бронза")

Вместо шестиугольного окошка — выражение после if, вместо скобки — двоеточие и отступ, а сравнение пишется двумя знаками равенства. Один знак = в Python означает присваивание, и путаница между ними — частая причина синтаксической ошибки. Подробно о текстовых ветвлениях — в статье про условия if в Python.

Робот в лабиринте: уровни с проверкой пути

Тренажёр под заголовком — это уровни 9–12 «Робота в лабиринте», где маршрут нельзя выучить наизусть: роботу нужны блоки «если путь впереди», «если путь налево», «если путь направо» и «если … иначе».

Попробуйте собрать универсальную программу: «повторять, пока не у флажка» и внутри — проверки пути. Классическая стратегия называется правилом правой руки: если справа есть проход, повернуть направо, иначе, если путь впереди свободен, идти вперёд, иначе повернуть налево. Нажмите «▶ Запустить» и посмотрите, справится ли одна программа с разными уровнями; «Сначала» вернёт робота на старт.

Когда «если» не поможет

Блок «если» не поможет, когда проблема не в логике, а в том, где и когда стоит проверка. Вот 4 типичные ситуации.

  • Проверка стоит вне цикла. Она сработает 1 раз при старте и больше не повторится.
  • Стена нарисована 2 оттенками. «Касается цвета» видит только один из них — перекрасьте стену.
  • Нужно реагировать на щелчок по спрайту. Удобнее событие «когда спрайт нажат», чем опрос мыши 30 раз в секунду.
  • Вариантов больше 5. Цепочка вложенных «иначе» становится нечитаемой; лучше список или переменная с номером.

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

Миф: «Сравнение в Scratch работает так же, как в Python». Полного совпадения не существует: Scratch не различает регистр букв, а Python различает.

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

Нельзя проверять касание один раз под флажком и ждать, что игра будет следить за ним всё время. Вот остальные ловушки.

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

Источники

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

[2] 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.

[3] 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.

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

Почему касание врага не срабатывает?

Скорее всего, проверка стоит вне «повторять всегда». Перенесите её в цикл, и она будет выполняться постоянно.

Как сделать три варианта ответа?

Вложите второе «если … то … иначе» в ветку «иначе» первого. Получится цепочка: первый вариант, второй, все остальные.

Где найти блок «касается цвета»?

В голубой категории «Сенсоры». Щёлкните по цветному квадратику в блоке и выберите пипеткой нужный цвет на сцене.

Можно ли сравнивать текст?

Да, блок «=» сравнивает и числа, и слова. Регистр он не учитывает: «ДА» и «да» считаются одинаковыми.

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

«Ждать до» останавливает скрипт, пока проверка не станет истинной, а «если» проверяет один раз и сразу идёт дальше.

Нужно ли знать математику для таких проверок?

Достаточно понимать «больше», «меньше» и «равно». Остальное — касания и клавиши — работает без чисел.