Как мы все прекрасно видим, уроков реально по скриптингу мало, а также я заметил, что некоторые не умеют обращаться с циклами. О том, что многие здесь даже не ведают об операторах continue и break, я вообще промолчу. Думаю, данный урок будет им полезен. Постарался изложить все доступным языком. Сперва узнаем - что же такое цикл? Цикл - это конструкция, позволяющая выполнить определенное действие n-ное количество раз (пока указанное условие истинно). Циклы могут избавить программиста от очень муторной работы. Сравним коды, выполняющие одинаковую задачу:
Какой вариант лучше? Думаю, очевидно, что второй. Существует три вида циклов в Pawn:
* while * for * do..while
Также здесь будет рассказано о переключателе switch..case. 1. Цикл while. Цикл while выполняет действие, пока указанное условие является истинным. Конструкция цикла:
То, что расположено внутри фигурных скобок, называется телом цикла. Пример цикла:
Code
new a; //Объявляем переменную a while(a < 10) { printf("%d", 10); a ++; }
В результате цикл выведет в консоль числа от 1 до 10. Этот код еще можно сократить. В результате мы получим:
Code
new a; //Объявляем переменную a while(a++ < 10) { printf("%d", a); }
2. Цикл for. Это, по сути, упрощенный цикл while. Его можно использовать, к примеру, для проверки данных всех игроков. Заменить пример цикла while, который я писал выше, циклом for, можно так:
Code
for(new a; a < 10; a++) { printf("%d", a); }
Конструкция:
Code
for(переменные; условие; операция с переменной-счетчиком) { инструкции }
3. Цикл do..while. Цикл do..while похож на цикл while, но есть отличие. В чем же, спросите вы, оно заключается? А в том, что сначала выполняются инструкции, а потом проверяется условие. В цикле while все с точностью до наоборот. Конструкция цикла:
Code
do { инструкции } while(условие); Опять же, пример скрипта, выводящего в консоль цифры: PHP код: new a; do { printf("%d", a); a ++; } while(a < 10);
Первое число выведет вне зависимости от того, меньше ли оно десяти. То есть, если a будет равно, скажем, 17, в консоль это число все равно выведет, но остальные - нет. 4. Переключатель switch..case. Оператор switch перебирает значения указанной переменной. Конструкция:
Code
switch(переменная) { case значение: { инструкции } case второе_значение: { инструкции } default: //Если значение переменной не равно ни одному (из тех, что в case) { инструкции }
Пример цикла:
Code
new a = 12; switch(a) { case 3: { print("a = 3"); } case 7: { print("a = 7"); } case 12: { print("a = 12"); } default: { print("a не равняется ни одному из значений"); } }
Также в switch можно указывать диапазон значений. Диапазон указывается точками. К примеру:
Code
new a = 12; switch(a) { case 3: { print("a = 3"); } case 7: { print("a = 7"); } case 9..15: //Если значение переменной a от 9 до 15 { print("a = 12"); } default: { print("a не равняется ни одному из значений"); } }
То есть (в третьем кейсе), если значение a от 9 до 15, как и в первом примере, в консоль выведет: "a = 12". Также в одном кейсе можно указывать несколько значений. Пример:
Code
new a = 12; switch(a) { case 7, 12, 18: //Если a равно 7, 12 или 18 { print("a = 7 || a = 12 || a = 18"); } case 5..10, 16..18: //Если значение a от 5 до 10, либо от 16 до 18 { print("a = 5 || a = 6 || a = 7 || a = 8 || a = 9 || a = 10 || a = 16 || a = 17 || a = 18"); } }
В кейсах может быть и проверка на символы. Они заключаются в одиночные скобки. 5. Операторы для работы с циклами. Для работы с циклами есть два специальных оператора - continue и break. Сейчас разберемся, как они работают. 5.1. Оператор continue. Допустим, у нас выполняются действия, и вдруг появляется необходимость переключить цикл на следующую итерацию. Что же в таком случае нужно делать? Использовать оператор continue. Этот оператор не выполняет оставшиеся действия текущей итерации, мгновенно переключая на следующую. Посмотрим, как его использовать, на примере. Предположим, у нас под таймером стоит цикл на всех игроков, где идут различные проверки, но тут (в одной из итераций) игрока нужно кикнуть. Цикл, вне зависимости от того, кикнут или не кикнут игрок, продолжит выполнение текущей итерации. Возьмем для этого цикл for:
Code
for(new a; a < 50; a++) //Проверяем первые 50 игроков { if(GetPlayerSpecialAction(a) == 2) Kick(a); new b; b ++; }
В этом случае после кика переменная b все равно будет объявлена и увеличится на 1 (повторяю, это только пример. Инструкций может быть гораздо больше). А в этом примере экономится время, и сразу после кика выполняется переход к следующей итерации:
Code
for(new a; a < 50; a++) //Проверяем первые 50 игроков { if(GetPlayerSpecialAction(a) == 2) { Kick(a); continue; } new b; b ++; }
То есть здесь после кика переменная b не объявится, и не выполнится инкрементация, а будет проверять уже следующего игрока. 5.2. Оператор break. К примеру, у нас есть бесконечный цикл (немного о них можно почитать в п. 6), и нужно выйти из цикла до его "естественного" окончания. Для этого можно использовать оператор break. Оператор break завершает цикл до окончания выполнения всех инструкций. Допустим, у нас, опять же, есть цикл на проверку пятидесяти игроков. Если значение денег десятого игрока равно $100, мы остальных игроков не проверяем (то есть завершаем цикл):
Code
for(new a; a < 50; a++) { if(a == 10 && GetPlayerMoney(a) == 100) //Если у игрока под ID 10 имеется ровно 100 долларов { break; //Завершаем действие цикла } }
6. Бесконечные циклы. Циклы, конечно же, могут выполняться бесконечно. Проще всего делать бесконечные циклы, используя конструкцию for. Выглядеть это будет так: