, Raz

WarCraft 3: Циклы (практика)

Осваиваем World Editor: триггеры

Циклы (практика)

Цикл - повторение одного и того же действия.

Циклы

Итак, цикл - повторение действий. Давайте посмотрим пример:
For each (Integer A) from 1 to 10, do (Actions)
    Loop - Actions
        Set i = (i + 1)
Смотрим на первую строчку: For each (Integer A) from 1 to 10, do....
Это - "заголовок" цикла, в котором назначается сколько раз будет выполнено действие. Integer A значит, что как "счетчик" цикла будет использована переменная A (в данном случае она автоматически создается и убирается после выполнения цикла). При выполнения действия в счетчике будет находится номер итерации (т. е. выполнения) цикла. Так, при первом выполнении там будет один, при втором - два, третьем - три и так далее. Вторую строчку можно пропустить, она будет в любом цикле. Смотрим третью: Set i = (i + 1). Это - действие, которое и будет выполнено множество раз. Оно не ограничивается одной строчкой - можно поставить сколько угодно действий.
Теперь можно сказать что же этот цикл делает: присваивает переменной i значение i + 1 десять раз. После выполнения цикла в переменной i будет значение 10 (в том случае, если начальное значение было 0). Грубо говоря, цикл выполняет операцию i + 10.[field=Примечание]Важно понимать, что A - тоже переменная, и читать / записывать значение из неё / в неё можно откуда угодно. Так, можно получить её значение даже вне цикла, хотя это не имеет смысла. Но такая "возможность" может вызвать один серьезый глюк: если запустить два цикла, и оба работающие с переменной A, они обе будут пытаться изменять значение A. Скорее всего, это закончится тем, что циклы (оба) будут выполнены неправильно: действие будет выполнено несколько лишних раз либо наоборот - будет выполнено меньше раз, чем требуется. Поэтому, в триггерах есть возможность использовать другие переменные, не только A (также существует переменная B, но если нам надо сразу 3 цикла запустить?). Когда Вы создаете действие цикла (имеется в виду действия создания цикла, а не действия в цикле) у Вас есть выбор: "For Each A...", "For Each B...", "For Each Variable...". Второе - тоже самое, что первое (какая разница: A или B? хотя если у вас больше чем два цикла одновременно не будет - рекомендую, потому что тогда не нужно создавать еще одну переменную). А вот используя третье Вы можете назначить, какую именно переменную надо использовать как счетчик (тип переменной - обязательно integer).
В том же меню Вы найдете еще два типа действий цикла: "... Do Multiple Actions" и, соответственно, без такой надписи ("просто" цикл). Как видно из названий, один цикл дает возможность сделать несколько действий в триггере, а другой - нет. Никакой разницы нет, что использовать первый, что второй.
Давайте рассмотрим еще один пример. Помните, нам надо было в переменную i занести значение 1 + 2 + 3 + 4 + 5 ... + 10?
For each (Integer A) from 1 to 10, do (Actions)
    Loop - Actions
        Set i = (i + (Integer A))
В итоге в переменную i будет внесено как раз нужное значение. Судите сами - переменной i каждый раз прибавляется значение, которое само по себе меняется (номер итерации цикла). Таким образом, сначала будет Set i = (i + 1), затем Set i = (i + 2) и так далее.

Просмотров: 12 881

» Лучшие комментарии


Orses #1 - 6 лет назад 3
Сергей и Раз вы мои кумиры)
Sarispa #2 - 6 лет назад 0
санькю вери мач тригеры осваивал сам без чьей либо помощи ,замечательные статьи, вот эта помогла наконец разобраться в циклах на основе тригеров
Admiral #3 - 5 лет назад 0
А как сделать триггер задания, чтобы он считал при выполнении квеста что тебе до завершения квеста осталось скажем, "Человек убито 8/10"? подскажите пжл сам искал не нашел.
Meriler #4 - 5 лет назад 1
Ура я знаю что делают цикл))
SQVX #5 - 4 года назад -1
Хм, перевожу в jass GUI цикл и вижу ненавистную структуру loop ... endloop. Неужели придется все циклы делать через его?
Buulichkaa #6 - 4 года назад 1
function loop takes integer i returns nothing
local integer c = 0
loop
  exitwhen i > c //выход из цикла по условию
  //твои действия
  set c = c + 1
endloop
endfunction
компиль должен выдать ошибку, потому что я использовал в названии зарезервированную строку "loop" ))
Это сообщение удалено