Циклы while и repeat
Заставляем программу повторять действия, пока условие выполняется.
Цикл — конструкция, которая повторяет блок кода много раз, избавляя нас от копирования одинаковых строк.
Циклы — основа любой игры: каждый кадр обновить позиции, каждую секунду уменьшить таймер. Lua даёт два цикла с условием: while и repeat.
Цикл while
while проверяет условие перед каждым повтором. Если условие ложно с самого начала — тело не выполнится ни разу:
local countdown = 3
while countdown > 0 do
print("Старт через", countdown)
countdown = countdown - 1
end
print("Поехали!")Вывод:
Старт через 3 Старт через 2 Старт через 1 Поехали!
Важно: внутри цикла нужно менять переменную условия, иначе цикл станет бесконечным и программа зависнет.
Цикл repeat-until
repeat проверяет условие после тела, поэтому тело всегда выполняется хотя бы раз:
local tries = 0
repeat
tries = tries + 1
print("Попытка", tries)
until tries >= 3Вывод:
Попытка 1 Попытка 2 Попытка 3
Обратите внимание: в repeat условие после until — это условие выхода, а не продолжения. Цикл крутится, пока оно ложно.
Сравнение двух циклов
| Цикл | Проверка условия | Минимум выполнений |
while | до тела | 0 раз |
repeat | после тела | 1 раз |
Досрочный выход: break
Оператор break мгновенно прерывает цикл:
local i = 1
while true do -- бесконечный цикл
if i > 3 then break end
print(i)
i = i + 1
endВывод:
1 2 3
Как работает под капотом
В Lua нет оператора continue (как в других языках) для пропуска итерации. Если нужно пропустить часть тела — оборачивают остаток в if. В новых версиях есть приём с метками goto, но для новичка проще обойтись условием.
Частые ошибки
- Забыть изменять переменную условия — получится бесконечный цикл.
- Думать, что
until— это «пока». На самом деле это «до тех пор пока не», то есть условие выхода. - Искать
continue— его в Lua нет, используйтеifвнутри тела.
Итог
whileпроверяет условие до тела и может не выполниться ни разу.repeat-untilвыполняет тело хотя бы раз;untilзадаёт условие выхода.breakдосрочно прерывает любой цикл.- В Lua нет
continue; пропуск итерации делают черезif.