# Циклы

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

## FOR..END

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

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

`имя переменной` - [переменная](https://docs.sannybuilder.com/ru/coding/variables), которая используется для подсчета количества итераций (счетчик)\
`начальное значение` - значение счетчика перед первой итерацией (любое число, включая [имя модели](https://docs.sannybuilder.com/ru/data-types#imena-modelei))\
`TO` или `DOWNTO` - указывает на то, увеличивается или уменьшается значение счетчика после каждой итерации\
`конечное значение` - значение счетчика, при котором цикл завершается (любое число, включая [имя модели](https://docs.sannybuilder.com/ru/data-types#imena-modelei))\
`шаг` - необязательный параметр, который определяет на сколько изменяется значение счетчика после каждой итерации. По умолчанию равен `1`\
`тело цикла` - команды, которые выполняются при каждой итерации цикла; тело цикла может отсутствовать

```
var
    $value: int = 0
    $final: int = 100
end

FOR $MyCounter = 1 to $final step 2
    $value += $mycounter
end
```

Если тип счетчика не был [объявлен](https://docs.sannybuilder.com/ru/variables#konstrukciya-var-end) ранее, счетчик приобретает тип `Integer`. Если `начальное значение`, `конечное значение` или `шаг` цикла указаны в виде переменных, эти переменные будут автоматически объявлены с тем же типом, который есть у переменной цикла.

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

```
var
    $MyCounter: float
end

FOR $MyCounter = 1.0 to $final step 2.0

end

// переменные $MyCounter и $final имеют тип Float
```

## WHILE..END

Синтаксис:\
`WHILE <условие цикла>`\
&#x20; `<тело цикла>`\
`END`

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

```
while not #AK47.Available
    wait 0
end
```

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

```
$var = 10

while $var > 11
    inc($var)
end

// условие цикла ложно, поэтому команда inc($var) никогда не выполнится
```

[Константы](https://docs.sannybuilder.com/ru/coding/constants) `True` и `False` могут использоваться в качестве условия цикла.

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

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

```
while false
    <the loop body>
end
```

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

{% hint style="warning" %}
В текущей версии допускается только один опкод в качестве условия цикла. Если нужно скомбинировать несколько проверок, их можно поместить в начало цикла и использовать команды `Break` и `Continue`

```
while true
    if and
       $var >= 0
       $var <= 100
    then
       Break
    end

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

{% endhint %}

## REPEAT..UNTIL

Синтаксис:\
`REPEAT`\
&#x20; `<тело цикла>`\
`UNTIL <условие цикла>`

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

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

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

```
repeat
  // цикл с одной итерацией
until true 
```

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

{% hint style="warning" %}
В текущей версии допускается только один опкод в качестве условия цикла. Если нужно скомбинировать несколько проверок, их можно поместить в конец цикла и использовать команды `Break` и `Continue`

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

{% endhint %}

## Команды Continue и Break

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

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

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

```
while true
  if
    not $actor.dead
  jf Break // завершить цикл

  if
    $actor.dead
  then
    Continue // перейти на следующую итерацию
  end
end
```
