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

Вложенные условия и ранний выход

У jump одно условие и одна цель. Всё остальное — «и», «или», else, выход из цикла — собирается из нескольких переходов

среднийНужно знать: Условие и ветвление, Циклы

В jump помещается ровно одна проверка: два значения и одно сравнение. Ни «и», ни «или», ни «иначе если» в нём нет — и не появится. Зато переходов можно поставить несколько подряд, и этого хватает на всё.

Условие «включено и запаса хватает» пишется двумя строками, и обе ведут в одно и то же место — мимо работы:

jump 8 equal включено 0
jump 8 lessThan запас 10

Обратите внимание: проверки перевёрнуты. jump уводит выполнение, значит уводить его надо тогда, когда условие работы не выполнено. Это главная причина, по которой чужие программы на mlog читаются тяжело, и привыкнуть к ней стоит сразу.

Перевёрнутых проверок здесь не нужно: каждый переход сам по себе достаточен.

jump 12 greaterThan враговРядом 0
jump 12 lessThan здоровье 200

Программа уйдёт на строку 12, если случилось хотя бы одно из двух.

тик 0
Установить0
=
Установить1
=
Прыжок -> 82
если
Прыжок -> 83
если
Установить4
=
Операция5
=
Установить6
=
Стоп7
Установить8
=
@counter0number
включеноnullnull
запасnullnull
выдатьnullnull
сделаноnullnull

Вот та же пара проверок целиком. Всё, что должно сорвать работу, проверяется в начале, и каждая проверка уводит в конец:

jump 8 equal включено 0
jump 8 lessThan запас 10
set выдать 5
op sub запас запас выдать
set сделано 1
stop
set сделано 0

Такой приём называют ранним выходом, а сами проверки — охраной. Работа остаётся одним ровным куском, без ступенек.

Соблазн написать наоборот — «если включено, то если запаса хватает, то…» — приводит к лесенке из переходов, где каждая ветка ведёт на свою строку. В тексте это ещё читается, а в блоках превращается в клубок стрелок.

тик 0
Установить0
=
Чтение1
=
Прыжок -> 72
если
Операция3
=
Прыжок -> 14
если
Установить5
=
Стоп6
Установить7
=
Стоп8
@counter0number
адресnullnull
значениеnullnull
найденоnullnull

Цикл ищет в ячейке первое непустое место — и прекращает перебор, как только нашёл:

read значение cell1 адрес
jump 7 notEqual значение 0
op add адрес адрес 1
jump 1 lessThan адрес 64
set найдено -1
stop
set найдено адрес

Переход из середины цикла на строку после него и есть досрочный выход. Программа остановится на адресе 3, где лежит 42, а не пройдёт все шестьдесят четыре места впустую.

Строка set найдено -1 — то, что случится, если цикл дошёл до конца и ничего не нашёл. Ответ «не нашлось» стоит готовить всегда: без него переменная останется с прошлой итерации, и программа примет старую находку за новую.

тик 0
Установить0
=
Операция1
=
Прыжок -> 42
если
Операция3
=
Операция4
=
Прыжок -> 15
если
Стоп6
@counter0number
счётnullnull
остатокnullnull
итогnullnull

Обратный случай: шаг цикла не нужно делать, но и выходить рано. Переход ведёт не наружу, а на увеличение счётчика:

op mod остаток счёт 2
jump 4 notEqual остаток 0
op add итог итог счёт
op add счёт счёт 1
jump 1 lessThan счёт 10

В сумму попадают только чётные числа — итог выходит 20. Нечётные цикл проматывает, не трогая сумму.

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