# Циклы

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

## FOR..END

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

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

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

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

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

Если тип счетчика не был [объявлен](/ru/coding/variables.md#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) никогда не выполнится
```

[Константы](/ru/coding/constants.md) `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
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.sannybuilder.com/ru/coding/loops.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
