For

Материал из UoPilot
Перейти к навигации Перейти к поиску

Описание

Команда FOR выполняет цикл несколько раз в соответствии со значением переменной управления циклом. Эта переменная может увеличиваться или уменьшаться при выполнении цикла. Циклы могут быть бесконечными или могут иметь конечное значение для переменной управления. Код будет выполняться до тех пор, пока переменная управления удовлетворяет аргументам команды. Если переменная управления вышла за предел конечного значения, выполняется выход из цикла. Переменная управления сохраняет значение последнего выполненного цикла.

Синтаксис

Привязка к окну: нет.
Работа со свернутым окном: да.

for <#i> <#iMin> <#iMax> [<#шаг>]
  [строки_скрипта]
  [[break [уровень_break]]|[continue]]
  [строки_скрипта]
end_for

Где:
#i - числовая переменная-счётчик
#iMin - начальное значение отсчета
#iMax - конечное значение отсчета (включительно)
#шаг - шаг цикла (значение, которое при каждом цикле прибавляется к #i). Может быть положительным или отрицательным. Необязателен. Если не указан, то равен 1.
break - команда прерывания цикла. Передаёт управление на строку, находящуюся сразу за end_for.
continue - команда продолжения цикла. Передаёт управление на следующий круг цикла (на строку for ...).

Примеры

// Пример 1 (вперед, с шагом 2)
for #i 4 8 2
  msg Миша съел #i яблок(а)
end_for
msg После цикла i = #i
end_script
// увидим: 4 6 8
// Пример 2 (назад, с шагом -1)
set #a 4
set #b 2
set #s -1
for #j #a #b #s
  msg Считаем назад: #j
end_for
msg Закончили счёт
end_script
// увидим: 4 3 2 закончили
// Пример 3 (вперед, с шагом 1, используем break)
for #k 2 6
  msg Считаем вперед: #k A
  if #k = 4
     break // прервать цикл
  end_if   
  msg Считаем вперед: #k Б
end_for
msg Закончили счёт
end_script
// увидим: 2А 2Б 3А 3Б 4А Закончили
// Пример 4 (вперед, с шагом 1, используем continue)
for #i 3 5
  msg Считаем вперед: #i A
  if #i = 4
     continue // на следующий круг цикла
  end_if   
  msg Считаем вперед: #i Б
end_for
msg Закончили счёт
end_script
// увидим: 3А 3Б 4А 5А 5Б Закончили
// Пример 5 (вперед, с шагом 1, внутри цикла принудительно дополнительно увеличиваем счетчик)
for #a 5 10 1 // для #а  от 5 до 10  с шагом 1
 set #a #a + 1 // увеличение на единицу. Шаг получается 1+1=2.
 msg #a
end_for
end_script
// увидим: 6 8 10
// Пример 6 (вложенные циклы)
for #i 1 3
  for #j 6 8
     set #n (#i * 10) + #j
     msg #n
  end_for
end_for
end_script
// Увидим: 16 17 18 26 27 28 36 37 38
// Пример 7 - посчитаем количество точек заданного цвета из перечисленных в скрипте
// set linedelay 1 // раскомментировать эту строку, если нужно чтобы скрипт работал быстро
init_arr %a(1 2) 39 24, 16 14, 25 30, 23 48 // перечисляем после скобок пары координат всех проверяемых точек
set #color 32768 // искомый цвет точки
set #sz size (%a) // определили число пар точек в массиве %a
set #n 0 // тут будем считать число точек нужного цвета
for #i 1 #sz // в цикле проверяем цвет всех точек
  if %a[#i 1] %a[#i 2] #color // проверяем цвет в #i-й точке
     set #n #n + 1 // если цвет совпал с заданным, то увеличиваем счетчик найденных точек
  end_if
end_for
msg Найдено #n точек с цветом #color
end_script
// Пример 8 - кликаем по сетке 5x4 двигаясь снизу-вверх слева-направо
set #x1 0 // X левого нижнего угла  
set #y1 40 // Y левого нижнего угла
set #dx 5 // шаг по оси X
set #dy -2 // шаг по оси Y ("-" значит вверх на экране)
set #sizeY 5 // число строк
set #sizeX 4 // число столбцов
set #x2 #x1 + #dx * (#sizeX - 1) // вычисляем другой угол
set #y2 #y1 + #dy * (#sizeY - 1)
for #x #x1 #x2 #dx // переход по столбцам
  for #y #y1 #y2 #dy // переход по строкам
    // left #x #y abs // для выполнения кликов - раскомментировать строку
    log x = #x, y = #y
  end_for // #y
end_for // #x
end_script
// Пример 9
// Движение по сетке 6 * 7. В каждой строке меняется направление движения.
set linedelay 0
set #x1 700       // X левого верхнего угла
set #y1 400       // Y левого верхнего угла
set #dx -80       // шаг по оси X ("-" означает что движение будет справа налево)
set #dy 80       // шаг по оси Y
set #sizeY 7      // число строк
set #sizeX 7      // число столбцов
set #x2 #x1 + #dx * (#sizeX - 1)     // вычисляем другой угол
set #y2 #y1 + #dy * (#sizeY - 1)
set #z 1         // переменная для подсчёта строк
set #xx1 #x1     // X левого верхнего угла 

for #y #y1 #y2 #dy         // переход по строкам
    if  mod(#z 2) = 1      // если строка нечётная меняем направление
        set #tmp #x1
        set #x1 #x2
        set #x2 #tmp
       set #dx abs(#dx)
    else                   // иначе (строка чётная) двигаться влево
        set #x1 #xx1
        set #dx -#dx
        set #x2 #x1 + #dx * (#sizeX - 1)
    end_if
    for #x #x1 #x2 #dx         // переход по столбцам
        move #x #y             // перемещение курсора
        wait 200               // ждать 0,2 сек
    end_for
    set #z #z + 1
end_for
end_script
// Пример 10
// Цикл с нецелыми числами.
for #i 150 250 1
   set $s insert ("," #i 2)   // вставить запятую во вторую позицию
   hint $s
   wait 100
end_for
end_script
// Пример 11
// Прерывание вложенных циклов
for #n 0 1000 1 //Первый цикл, уровень вложенности 2
    for #i 0 1000 1 //Второй цикл, уровень вложенности 1
        log 'Второй цикл'
        break 2 //прерываем первый цикл
        log 'Эта строка не будет выведена'
    end_for
    log 'И эта тоже'
end_for
log 'Вышли из всех циклов'

Смотрите также

While
Repeat
Break
Continue

История развития

0.98 beta
Добавил цикл for ... end_for:

for #<имя> <начало> <конец> [шаг]
    ...
end_for

Если переменная существовала, то она заменяется, иначе добавляется. После завершения цикла переменная равна <конец>+1.

1.07 beta x
Исправил ошибку в команде break при прерывании нескольких циклов repeat или for.

1.07 beta 7
Исправлена ошибка в операторе for, внесенная в предыдущей версии.

2.05
Исправил ошибку в операторе for с повторным использованием переменных.

2.27.1
Исправил ошибку в команде 'for', когда оно вообще не должно было в тело цикла заходить 'for #i 2 1 1'. Малость оптимизировал.

2.27.2
Исправил ошибку в команде 'for', когда оно перестало выполнять 'for #i 1 1'.

2.29
Исправил ошибку обработки шага равного нулю в команде 'for', из-за которой цикл отрабатывал только 1 раз. 'for #i 1 5 0'

2.31
Убрал ограничение на выход из 'for' по 'goto'.

2.41
Исправил 'return' в 'for' и 'repeat' из двойного 'gosub'.