00045. Циклы (Часть 1 - while)
Циклы (Часть 1 - while)|Этот урок посвящен оч ень важной теме - циклам. А именно тем циклам, которые существенно упрощают написание скриптов.|wmysterio|wmysterio||||Есть три типа циклов: "while", "for", "repeat". Мы рассмотрим простое использование циклов. Прежде всего нужно понять как работают эти циклы и я постараюсь на примерах объяснить их использование. Поехали! :)
В этом уроке я расскажу о цикле while. Конструкция:
while 1@ == 0 // условие
wait 0
// ...действия...
end
Суть этого цикла в том, что пока выполняется условие будут выполняются какие то-действия внутри блока. Если дос ловно перевести "while", то получится "Пока". Таким образом выйдет:
Пока 1@ == 0
Ждать 0
...действия...
КонецЦикла
После слова "while" обязательно должно быть условие! Напишем простой пример скрипта:
while not actor.Dead($PLAYER_ACTOR)
wait 0
player.Money($PLAYER_CHAR) += 100
end
× **ВАЖНО:** в этом цикле обязательно нужно ставить задержку! Минимальная задержка - 0, но если нам не нужно выполнять его очень часто ( например: в стартерах ), то можно её увеличить.
Пока СЖ не умрёт он будет получать 100$. Как только он склеит ласты, он и перестанет получать деньги. Довольно трудно объяснить принцип работы цикла и в новичков часто возникают проблемы с написанием скриптов с этими конструкциями. Я постараюсь как-можно проще описать суть цикла, ведь это важный фундамент для написания хороших скриптов.
Рассмотрим пример из жизни. Прежде всего придумаем условие: "Сергей на работе?". Дальше придумаем что будет, если он на работе: "Он получает деньги". Таким образом можно образовать цикл как:
Пока Сергей на работе
Он получает деньги
КонецЦикла
Сергей перестаёт получать деньги
Следовательно если Сергей не на работе - деньги ему не светят, то есть цикл завершается.
Особенностью цикла в том, что он выполняются по кругу неограниченное количество раз. Выйти с цикла, как уже сказано, можно только тогда, когда условие возле "while" перестает выполняется. Но есть способ прервать цикл принудительно, даже если условие выполняется. Для этого используется коман да - break ( прервать ). Давайте напишем скрипт с теми же деньгами:
while not actor.Dead($PLAYER_ACTOR)
wait 0
0@ = player.money($PLAYER_CHAR)
if
0@ > 5000
then
break
end
player.Money($PLAYER_CHAR) += 100
end
Данный скрипт будет постоянно давать СЖ деньги. Если он умрёт, то осуществится выход с цикла. И тут появилось ещё одно условие: если деньги СЖ превышают 5000, то мы принудительно завершаем цикл и не важно СЖ жив или мёртв. Таким образом мы сделали два выхода с цикла.
Давайте добавим ещё один выход с цикла, когда СЖ-я арестовали:
while not actor.Dead($PLAYER_ACTOR)
wait 0
0@ = player.money($PLAYER_CHAR)
if
0@ > 5000
then
break
end
if
0741: actor $PLAYER_ACTOR busted
then
break
end
player.Money($PLAYER_CHAR) += 100
end
Обычно скриптеры объединяют условия выхода в один if. Это экономит место кода и делает скрипт более читабельным. Вот и мы немного упростим этот цикл:
while not actor.Dead($PLAYER_ACTOR)
wait 0
0@ = player.money($PLAYER_CHAR)
if or
0@ > 5000
0741: actor $PLAYER_ACTOR busted
then
break
end
player.Money($PLAYER_CHAR) += 100
end
Давайте графически покажем работу цикла:

Цвета линий:
- Желтый - обычное движение шарика;
- Красный - движение шарика, если условие НЕ выполняется;
- Зелёный - движение шарика, если условие выполняется;
- Фиолетовый - это сами условия;
Попробуйте и вы создать подобный скрипт и нарисовать к нему рисунок с движениями. Это поможет вам быстрее понять работу цикла. Свои варианты присылайте на форум. В большинстве случаев, человек, научившись делать такие схемы быстрее сможет научится скриптингу.
Существует также ещё один оператор. Это команда continue ( можно перевести как "продолжить" ). Суть команды в том, что она начинает цикл сначала, не выполняя опкоды, написанные после неё. Это существенно сокращает время выполнения цикла, так как не нужно будет выполнять команды, что находятся ниже по коду. Для примера можно написать скрипт, который будет генерировать целые числа, если они положительные, то с ними произойдут арифметические изменения. Если число будет ноль - прервём цикл. Если отрицательное - будем начинать цикл сначала. Напишем такой скрипт:
$MONEY = 10
while 10000 > $MONEY
wait 0
0209: $TEMP = random_int_in_ranges -10 10
if
0 > $TEMP
then
continue
end
if
$TEMP == 0
then
break
end
$TEMP *= 2
0058: $MONEY += $TEMP // (int)
end
player.Money($PLAYER_CHAR) += $MONEY
А вот и графический вариант:
× **ВАЖНО:** Операторы "break" и "continue" используются только в циклах! Задержку в 0 мсек рекомендовано использовать сразу же после объявления цикла, если в нём существует оператор продолжения. Во многих случаях такой способ избавляет от зацикливания, что ведёт к зависанию игры

Также есть возможность использовать цикл в середине другого цикла, но об этом мы поговорим немного позже.|981|1|0|56999064
png
715523
400292``\|69422868
png590
434400
294``||cikly_chast_1_while|1498998674Last modified 1yr ago