API Basic While - LIHACHTETAN/ClassicUO-BadNewbie-BasicIDE GitHub Wiki

While / Wend / Exit While / Break

ClassicUO • Basic

While проверяет условие перед каждой итерацией и повторяет тело, пока оно истинно. В этом движке блок закрывается Wend; написание End While из VB.NET не поддерживается.

Точный синтаксис

While condition
    statements
Wend
Continue While
Exit While
Break

Параметры

  • condition — Выражение проверяется перед каждым проходом, включая первый и завершающий. Используйте сравнение или числовое логическое значение: 0/False завершает цикл, 1/True продолжает; прочие ненулевые числа тоже продолжают. Текст не преобразуется в Boolean.
  • statements — Команды тела выполняют работу и изменяют условие. Если первая проверка ложна, тело полностью пропускается.
  • Wend / exit — Wend возвращает к условию. Continue While снова его проверяет; Exit While выходит из ближайшего While, в том числе через вложенный цикл другого вида. Break выходит из ближайшего цикла любого вида.

Возвращает

While, Wend, Exit While и Break ничего не возвращают. RETURN внутри тела завершает всю процедуру/функцию. Примеры возвращают Integer 6, 1 и 406. Результат поиска 1 — индекс массива, а не логический признак успеха.

Поведение

  • Движок проверяет условие, выполняет тело и возвращается к проверке. В отличие от For, он не сохраняет числовую границу и не меняет счётчик автоматически.
  • Продвижение нужно писать явно. При постоянной проверке игрового состояния добавляйте подходящий Wait и ограничение времени: сам While не спит и не имеет таймаута. Пауза и остановка движка остаются доступны.
  • Continue и выход выполняют Finally тех блоков Try, которые покидают. Заголовок, команды и Wend пишите на отдельных строках внутри процедуры или функции.

Примеры

1. Сумма цифр

# DigitSum получает number=123 по ByVal. MOD 10 берёт последнюю цифру, Fix(number/10) убирает её: 123→12→1→0. total складывает 3+2+1=6. Последняя ложная проверка завершает цикл; Main получает 6. Вход 0 сразу дал бы 0 без выполнения тела.
Option Explicit On
Function DigitSum(ByVal number)
    Var total = 0
    While number > 0
        total += number MOD 10
        number = Fix(number / 10)
    Wend
    Return total
End Function
Sub Main()
    Return DigitSum(123)
End Sub

Разбор параметров и выполнения:

DigitSum получает number=123 по ByVal. MOD 10 берёт последнюю цифру, Fix(number/10) убирает её: 123→12→1→0. total складывает 3+2+1=6. Последняя ложная проверка завершает цикл; Main получает 6. Вход 0 сразу дал бы 0 без выполнения тела.

2. Поиск первого совпадения

# FirstAbove получает values=[4,7,9] и threshold=6. Проверка границы защищает values[index]. На индексе 1 условие 7>6 сохраняет found=1; Exit While прекращает просмотр. Если совпадений нет, остаётся -1. Main возвращает индекс 1, отсчитываемый с нуля.
Option Explicit On
Function FirstAbove(ByVal values, ByVal threshold)
    Var index = 0
    Var found = -1
    While index < GetArrayLength(values)
        If values[index] > threshold Then
            found = index
            Exit While
        End If
        index += 1
    Wend
    Return found
End Function
Sub Main()
    Dim values[2]
    values[0] = 4
    values[1] = 7
    values[2] = 9
    Return FirstAbove(values, 6)
End Sub

Разбор параметров и выполнения:

FirstAbove получает values=[4,7,9] и threshold=6. Проверка границы защищает values[index]. На индексе 1 условие 7>6 сохраняет found=1; Exit While прекращает просмотр. Если совпадений нет, остаётся -1. Main возвращает индекс 1, отсчитываемый с нуля.

3. Число проверок условия

# CanContinue принимает checks по ByRef, index и limit=3 по ByVal. Увеличивает checks и возвращает index<limit как 1/0. Проверки проходят при index=0,1,2,3: четыре вызова для трёх итераций. total=1+2+3=6; Main возвращает 400+6=406.
Option Explicit On
Function CanContinue(ByRef checks, ByVal index, ByVal limit)
    checks += 1
    Return index < limit
End Function
Sub Main()
    Var checks = 0
    Var index = 0
    Var total = 0
    While CanContinue(checks, index, 3)
        index += 1
        total += index
    Wend
    Return checks * 100 + total
End Sub

Разбор параметров и выполнения:

CanContinue принимает checks по ByRef, index и limit=3 по ByVal. Увеличивает checks и возвращает index<limit как 1/0. Проверки проходят при index=0,1,2,3: четыре вызова для трёх итераций. total=1+2+3=6; Main возвращает 400+6=406.


en · ru · uk · fr · de · it · es · zh-tw · ja · ko

Basic