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

Циклы

Тот же jump, только стрелка смотрит вверх — и программа начинает повторять кусок себя

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

Цикл в mlog — не отдельная инструкция и не особая запись. Это тот же jump, у которого стрелка смотрит вверх: на строку, которая уже выполнялась.

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

тик 0
Установить0
=
Установить1
=
Операция2
=
Операция3
=
Прыжок -> 24
если
Конец5
@counter0number
счётnullnull
итогnullnull

итог станет десяткой: 0 + 1 + 2 + 3 + 4. счёт остановится на пятёрке — на том значении, при котором условие перестало быть верным.

Часть В примере Зачем
подготовка set счёт 0, set итог 0 обнулить то, что цикл будет накапливать
тело op add итог итог счёт ради чего всё затевалось
шаг и проверка op add счёт счёт 1, jump сдвинуться и решить, нужна ли ещё итерация

Проверка здесь стоит в конце, и это важно: тело выполняется хотя бы раз, даже если условие было ложным с самого начала. Такой цикл собирается сам собой, и чаще всего нужен именно он.

Если тело не должно выполняться ни разу — проверку ставят в начало: переход вперёд, за конец цикла, а в конце тела — безусловный переход назад. Две строки jump вместо одной.

Программа выполняется в бесконечном цикле, и вторая итерация начинается не с чистого листа: в переменных лежит то, что осталось от первого. Поэтому set счёт 0 — не формальность, а часть цикла.

Цикл, из которого нет выхода, — не катастрофа. Процессор выполняет за тик ровно столько инструкций, сколько ему положено (@ipt: две у микропроцессора, восемь у логического, двадцать пять у гиперпроцессора), и отдаёт управление игре. Он будет крутиться вечно, но игра при этом идёт как обычно.

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

Восемнадцать инструкций у микропроцессора — это девять тиков, примерно седьмая часть секунды. На «пуске» такой цикл не разглядеть, поэтому его и проходят шагами.

Чем длиннее цикл, тем реже программа возвращается к началу. Это не ошибка, а цена: у логики в Mindustry нет параллельности, и единственный способ успевать больше — либо процессор побыстрее, либо цикл покороче.

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