Elite Games - Свобода среди звезд!

X2 - Скрипты - ScE - Циклы

ЦИКЛЫ

Циклы используются, когда вам необходимо повторять определенную последовательность команд, пока не будет достигнуто некоторое условие. Конечно, получить зацикленный кусок кода можно и используя операторы безусловного перехода, однако подобный подход не рекомендуется, поскольку он ухудшает читаемость кода, к тому же использовать команды цикла гораздо удобнее и проще. Вот пример простейшего цикла:

010 while [ENVIRONMENT] != [HOMEBASE]
011 @=wait randomly from 5000 to 10000 ms
012 @=[THIS] ->fly to home base
013 end


В строке 010, заголовке цикла (while), задано условие цикла (пока корабль не пристыкован к своей базе), пока оно истинно, т.е. принимает значение «истина», цикл выполняется, т.е. выполняются строки с номерами 011 и 012 (ждать 5-10 сек, возвращаться на базу). Как только выполнение скрипта доходит до строки 013, управление передается в строку 010, проверяется условие и если оно выполняется (принимает значение «истина»), то снова выполняются строки 011 и 012, и так до тех пор, пока условие не примет значение «ложь». Как только условие становится ложно, управление переходит в строку, следующую за end. Если срока с ключевым словом end последняя в скрипте, выполнение скрипта завершается. Однако нам может понадобится выйти из цикла до того как условие цикла примет значение «ложь» (например, базу уничтожили, в этом случае корабль никогда не сядет на свою базу, и цикл окажется «вечным»). Для этих целей служит команда break. Она передает управление в строку, следующую за end. С учетом проверки на существование базы наш цикл можно записать следующим образом:

010 while [ENVIRONMENT] != [HOMEBASE]
011 if not [HOMEBASE]
012 break
013 end
014 @ =wait randomly from 5000 to 10000 ms
015 @ =[THIS] ->fly to home base
016 end


Ключевое слово end стоящее в строке 013 относится к оператору if стоящему в строке 011, end всегда относится к ближайшему if или while. Оператор while можно записать и как while not, в этом случае значение выражения, задающего условие цикла, инвертируется. Вот так будет выглядеть предыдущий пример в форме while not:

010 while not [ENVIRONMENT] == [HOMEBASE]
011 if not [HOMEBASE]
012 break
013 end
014 @ =wait randomly from 5000 to 10000 ms
015 @ =[THIS] ->fly to home base
016 end


Также может потребоваться начать новый виток цикла, до того как будут выполнены все операторы текущего витка, это делается оператором continue (см. примеры — покупка товара по лучшей цене).

Назад к оглавлению
Денис Кузьмин a.k.a. Mad_Kuzia
К началу раздела | Наверх страницы Сообщить об ошибке
X2 - Скрипты - ScE - Циклы
Все документы раздела: Главная |


Дизайн Elite Games V5 beta.18
EGM Elite Games Manager v5.17 02.05.2010