Не волнуйтесь, если что-то не работает. Если бы всё работало, вас бы уволили.

— Mosher’s Law of Software Engineering

В программировании важное место занимает условный оператор "если". С его помощью в программах организуется ветвление, поэтому его также называют оператором ветвления.

<aside> 💡 Ветвление - означает, что при определенных условиях программа выполняется одним способом, а при отсутствии этих условий или наличии других условий программа выполняется другим способом, то есть идет по другому пути, другой ветке.

</aside>

Допустим, в Scratch кот будет идти только в том случае, если нажата клавиша мыши. Если условие с мышкой не выполняется, кот никуда не пойдет.

Untitled

Чтобы реализовать такой сценарий, понадобиться блок "если … , то", который находится в оранжевом разделе "Управление".

В заголовок этого блока вставляется другой блок особого типа – логическое выражение. Такие блоки как бы что-либо спрашивают. И ответом на их вопрос может быть либо "да", либо "нет". Никаких "не знаю" или "надо подумать". Только да или нет.

Untitled

<aside> 💡 Можно представить, что логические выражения не спрашивают, а просто что-то утверждают. При этом то, что они утверждают, либо правда, либо ложь.

</aside>

Блоки логических выражений не находятся в одном разделе. Их можно найти среди блоков как бирюзового раздела "Сенсоры", так и зеленого раздела "Операторы". В Scratch логические блоки имеют форму с острыми углами справа и слева.

В данном случае нам нужен блок "мышь нажата?", который мы вставляем в поле после слова "если" в оператор ветвления "если … , то".

https://younglinux.info/scratch/images/lesson4/if_then.png

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

Сейчас внутри оператора ветвления, ничего нет. Поместим сюда команды движения, а сам блок "если" вставим в цикл "повторять всегда", чтобы программа работала всегда, пока мы ее сами не остановим.

В результате выполнения данного скрипта всегда будет проверяться, нажата ли какая-нибудь клавиша мышки. И если она нажата, кот будет перемещаться. Когда клавиша мыши будет отпускаться, спрайт будет останавливаться, потому что условие "мышка нажата?" станет неправдой.

https://younglinux.info/scratch/images/lesson4/if_go.png

А что будет, если мы поместим команды до или после всего блока "если"? Влияет ли на них выполнение условия нажатия мышки? Абсолютно нет. Условие влияет только на те команды, которые находятся внутри "если". Команды за пределами "если" будут выполняться всегда.

Разместим команду "изменить эффект цвет на … " после блока "если".

Теперь кот будет мигать разными цветами независимо от того, стоит он или двигается. Блок изменения цвета находится за пределами условного оператора, а значит выполняется всегда.

Но допустим, мы хотим, чтобы кот изменял свой цвет только тогда, когда стоит. Когда же он двигается, цвет не должен меняться.

Эту задачу можно решить двумя способами. Добавить второй блок "если", в котором проверять обратное условие, то есть то, что мышка не нажата. Или же, что более правильно, воспользоваться условным оператором с двумя ветками, то есть блоком "если … иначе".

Рассмотрим сначала первый, не совсем верный, вариант:

Здесь мы используем новый для нас зеленый блок "не …", в который вставляем "мышка нажата?". Сложное логическое выражение "не мышка нажата?" помещаем в заголовок "если".

Таким образом, второй "если" проверяет, что мышка не нажата. И если она не нажата, то будут выполняться команды тела второго "если". В данном случае это одна команда изменения цвета.

https://younglinux.info/scratch/images/lesson4/if-if.png

Рассмотрим второй вариант решения задачи, который делает то же самое что первый, но использует блок "если … иначе":

https://younglinux.info/scratch/images/lesson4/if_else.png

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

Команды, вложенные в ветку "иначе" выполняются только тогда, когда условие при ветке "если" оказывается ложным.

В данном случае если выражение "мышь нажата?" неправда, то будут выполняться команды внутри ветки "иначе".

Программе не надо два раза проверять условие нажатия мыши, как в первом варианте. За один оборот цикла она проверяет его единожды, в заголовке "если … иначе". И если условие правдиво, будут выполняться команды внутри ветки "если". Если условие оказывается ложным, то программа сразу без дополнительных проверок пойдет выполнять команды в ветке "иначе".