Циклы

Цикл - это конструкция, позволяющая выполнять последовательность команд неоднократно. 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

Last updated