Циклы

Цикл - это конструкция, позволяющая выполнять последовательность команд неоднократно. Sanny Builder поддерживает несколько видов циклов: for, while, repeat.

FOR..END

В цикле FOR количество повторений (итераций) определено заранее.

Синтаксис: FOR <имя переменной> = <начальное значение> TO/DOWNTO <конечное значение> [шаг = 1] <тело цикла> END

имя переменной - переменная, которая используется для подсчета количества итераций (счетчик) начальное значение - значение счетчика перед первой итерацией (любое число, включая имя модели) TO или DOWNTO - указывает на то, увеличивается или уменьшается значение счетчика после каждой итерации конечное значение - значение счетчика, при котором цикл завершается (любое число, включая имя модели) шаг - необязательный параметр, который определяет на сколько изменяется значение счетчика после каждой итерации. По умолчанию равен 1 тело цикла - команды, которые выполняются при каждой итерации цикла; тело цикла может отсутствовать

var
$value: int = 0
$final: int = 100
end
FOR $MyCounter = 1 to $final step 2
$value += $mycounter
end

Если тип счетчика не был объявлен ранее, счетчик приобретает тип Integer. Если начальное значение, конечное значение или шаг цикла указаны в виде переменных, эти переменные будут автоматически объявлены с тем же типом, который есть у переменной цикла.

Для использования дробных чисел для счетчика итераций, счетчик должен иметь тип Float.

var
$MyCounter: float
end
FOR $MyCounter = 1.0 to $final step 2.0
end
// переменные $MyCounter и $final имеют тип Float

WHILE..END

Синтаксис: WHILE <условие цикла> <тело цикла> END

условие цикла - любой условный опкод тело цикла - команды, которые выполняются при каждой итерации цикла; тело цикла может отсутствовать

while not #AK47.Available
wait 0
end

Цикл WHILE работает до тех пор, пока условие цикла истинно. Условие цикла проверяется до первой итерации цикла. Поэтому если условие изначально ложно, цикл не отработает ни разу.

$var = 10
while $var > 11
inc($var)
end
// условие цикла ложно, поэтому команда inc($var) никогда не выполнится

Константы True и False могут использоваться в качестве условия цикла.

while true
<тело цикла>
end

Такой цикл будет выполняться бесконечно, пока в теле не выполнится командаBreak.

while false
<the loop body>
end

Такой цикл игнорируется компилятором, т.к. условие изначально ложно.

В текущей версии допускается только один опкод в качестве условия цикла. Если нужно скомбинировать несколько проверок, их можно поместить в начало цикла и использовать команды Break и Continue

while true
if and
$var >= 0
$var <= 100
then
Break
end
// цикл выполняется, пока значение переменной $var
// находится в интервале [0...100]
<тело цикла>
end

REPEAT..UNTIL

Синтаксис: REPEAT <тело цикла> UNTIL <условие цикла>

тело цикла - команды, которые выполняются при каждой итерации цикла; тело цикла может отсутствовать условие цикла - любой условный опкод

Цикл REPEAT..UNTIL работает, пока условие цикла не будет истинно. Условие проверяется в конце итерации цикла, поэтому данный цикл будет иметь минимум одну итерацию.

Константы True и False могут быть использованы в качестве условия цикла.

repeat
// цикл с одной итерацией
until true
repeat
// цикл работает бесконечно, пока не остановлен командой Break
until false

В текущей версии допускается только один опкод в качестве условия цикла. Если нужно скомбинировать несколько проверок, их можно поместить в конец цикла и использовать команды Break и Continue

repeat
<тело цикла>
if and
$var >= 0
$var <= 100
then
Break
end
// цикл выполняется, пока значение переменной $var
// находится в интервале [0...100]
until false

Команды Continue и Break

Если необходимо пропустить текущую итерацию цикла и перейти к следующей, используйте команду Continue.

Команда Break завершает цикл и передает управление на команду, следующую за завершающим end.

Обе эти команды могут быть использованы как параметр в опкоде (например, jf Continue) или как отдельная команда.

while true
if
not $actor.dead
jf Break // завершить цикл
if
$actor.dead
then
Continue // перейти на следующую итерацию
end
end