Перейти к содержимому

Условие и ветвление

Одна проверка — две дороги. Разбираемся, как программа перестаёт быть прямой

У jump четыре поля: куда прыгнуть, какое условие и два значения, которые сравниваются. Читается строка так: «если запас больше или равен десяти — перейти туда».

Если условие верно, следующей выполняется строка, на которую показывает стрелка. Если нет — обычная следующая, и программа идёт дальше как ни в чём не бывало.

Нажмите «шаг» четыре раза.

тик 0
Установить0
=
Прыжок -> 41
если
Установить2
=
Конец3
Установить4
=
@counter0number
запасnullnull
малоnullnull

В запас лежит семёрка, а условие спрашивает про десять: оно ложно, прыжка нет, и программа доходит до set мало 1. Ветка «запаса хватает» осталась в стороне — до неё выполнение не добралось.

В тексте программы цель перехода — номер строки, но в блоках номера не пишут: у строки jump слева есть стрелка, и её перетаскивают на нужную строку. Пока тянут, строки подсвечиваются.

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

Третья строка примера — end, и без неё программа, попав в ветку «мало», свалилась бы в ветку «хватает» и выполнила обе.

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

Условий восемь. В списке они называются по-английски, а в самой строке видна не подпись, а знак — и это разные надписи, которые стоит знать обе:

Условие В блоке Когда прыгает
equal == значения равны
notEqual not не равны
lessThan < меньше
lessThanEq <= меньше или равно
greaterThan > больше
greaterThanEq >= больше или равно
strictEqual === равны и одного вида: отличает пустоту от нуля
always always всегда, поля сравнения пропадают

Сравнивает jump ровно так же, как op: с той же поблажкой в шестом знаке после запятой и с теми же правилами для null. Подробности — в уроке «Сравнения и логика».

Условие always прыгает всегда, и поля сравнения при этом пропадают из строки — сравнивать нечего.

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

Неофициальный проект, с Anuke не связан. Спрайты, шрифты и переводы Mindustry © Anuke, используются по GPL-3.0; Fira Code — по OFL-1.1. Код сайта — GPL-3.0.