Автор: Vaise
- Цикл (лат. cyclus от др.-греч. ?????? — окружность)
То есть, от слова "Окружность" становиться ясно, что это действие которое проходит от начала до конца по чему либо и выполняет какие либо определенные действия.
Циклы помогают оптимизировать мод (что повышает его быстроту действия путем уменьшения количества строк).
Немного дополнительной информации о циклах pawn:
- Циклы в Pawn бывают четырех видов: while, for и do..while
- Каждый круг цикла по скрипту называется итерацией.
- Инкремент (Пример: i++)- добавление к числу единицы.
- Декремент (Пример: i--) - вычитание из числа единицы.
* Число которое увеличиваться/уменьшается в нашем случае может браться например из переменной
i (new i = 0;) которая равна нулю.
- Использование цикла - While
Code: Select all
while(условие)
{
<< Тут находиться выполняемый скрипт (иминуеться как "Тело цикла")
}
Например у каждого в Role-Play если запуск очистки чата Samp
Он выглядит так:Code: Select all
SendClientMessage(playerid,0xFFFFFFAA, "");
SendClientMessage(playerid,0xFFFFFFAA, "");
SendClientMessage(playerid,0xFFFFFFAA, "");
SendClientMessage(playerid,0xFFFFFFAA, "");
SendClientMessage(playerid,0xFFFFFFAA, "");
SendClientMessage(playerid,0xFFFFFFAA, "");
SendClientMessage(playerid,0xFFFFFFAA, "");
SendClientMessage(playerid,0xFFFFFFAA, "");
SendClientMessage(playerid,0xFFFFFFAA, "");
И так далее (более 50 таких строк)
Мы можем сделать тоже самое действие только с использование цикла который называется "while"Code: Select all
new d; // задаем переменную
while(d++<50) // Указываем, сколько цикл должен проходить по функции до его завершения (в нашем 50 раз)
{
SendClientMessage(playerid, 0xFFFFFFFF, ""); // Функция которая должна выполняться
С помощью этих пяти строчек мы избавились от 50 строк одного и того же!
И так с помощью цикла мы упростили себе работу, а так же еще оптимизировали мод.
- Использование цикла - For
- Внешнее строение цикла и его обозначения:
Code: Select all
for (переменная, условие, увеличение(инкремент))
}
<< Условия цикла (Тело цикла)
}
Цикл "For" почти точно такой же как и "While" отличается он только тем, что он начинается с объявления переменной. После переменной идет условие, а затем инкремент.
Пример использования:Code: Select all
for(new i = 0; i < MAX_PLAYERS; i++)
{
SendClientMessage(playerid,0xFFFFFFAA,"Поздравляю вы один из тех, кто был кикнут с сервера");
Kick(i);
}
Разберём этот пример по частям:Code: Select all
for(new i = 0; i < MAX_PLAYERS; i++) - Тут мы создаем переменную "i" и приравниваем её к нулю, затем создаем условие и задаем действие
Code: Select all
{
SendClientMessage(playerid,0xFFFFFFAA,"Поздравляю вы один из тех, кто был кикнут с сервера");
Kick(i); - Здесь условие выполняемого цикла
}
Данный цикл который я привел в пример, проходит по всем игрокам которые в данные момент на сервере и выполняет действие которое указанно в теле цикла (то есть выдача сообщения игроку и отключение его от сервера)
Согласитесь, одним циклом меньше чем за секунду кикнуть весь сервер, чем выкидывать (кикать) каждого игрока отдельно.
Личное мнение:
- Данный цикл скорее служит не для оптимизации мода, а для выполнения какой ни будь команды.
На пример обычная команда /members состоит из такого цикла, который в данные момент времени по условию (телу цикла) которое мы поставим проверяет (отбирает) игроков на то что он состоит в данной фракции и выводит его в список сотрудников.
- Использование цикла - Do..while
- Внешнее строение цикла и его обозначения:
Code: Select all
do
{
<< Что должен выполнять цикл (тело цикла)
}
while(условие);
Цикл "Do..while" похож на цикл "While" но у него есть небольшое отличие в том, что сначала выполняются инструкции которые мы ему задали, а только после этого проверяется условие.
Пример использования:Code: Select all
new i;
do
{
format(string, sizeof(string), "Выводимое число: %d",i++);
SendClientMessage(playerid,0xFFFFFFAA,string);
}
while(i < 10);
Разберём этот пример по частям:Code: Select all
new i; // Задаем переменную (можно её приравнять new i = 0; или оставить как есть)
do
{
format(string, sizeof(string), "Выводимое число: %d",i++); // Создаем задание которое должен выполнить цикл.
SendClientMessage(playerid,0xFFFFFFAA,string);
}
while(i < 10); // Проверка условия которое определит будет ли тело цикла еще раз выполняться.
Функции данного цикла:
Данный цикл выводит игроку цифры по порядку в чат.
Если переменная i равна нулю, то будет выводиться 0,1,2,3,4,5,6,7,9,10
Если она не равна,то первое число которое выведет цикл в чат игроку будет такое чему сейчас равна переменная i, а остальные по условию. Если первое число больше 10 то дальше цикл не будет выполняться, так как это нарушает наше условие while(i < 10);