Циклы и использование их в моде

Описание: Основы скриптинга
Модератор: SJplayer

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#1 Дим » 10 апреля 2013, 12:41

Циклы и использование их в моде
Автор: Vaise

- Цикл (лат. cyclus от др.-греч. ?????? — окружность)
То есть, от слова "Окружность" становиться ясно, что это действие которое проходит от начала до конца по чему либо и выполняет какие либо определенные действия.

Циклы помогают оптимизировать мод (что повышает его быстроту действия путем уменьшения количества строк).

Немного дополнительной информации о циклах pawn:
- Циклы в Pawn бывают четырех видов: while, for и do..while
- Каждый круг цикла по скрипту называется итерацией.

- Инкремент (Пример: i++)- добавление к числу единицы.
- Декремент (Пример: i--) - вычитание из числа единицы.

* Число которое увеличиваться/уменьшается в нашем случае может браться например из переменной
i (new i = 0;) которая равна нулю.

Использование цикла - While

Код: Выделить всё

while(условие) 
{ 
  
<< Тут находиться выполняемый скрипт (иминуеться как "Тело цикла") 
}


Например у каждого в Role-Play если запуск очистки чата Samp
Он выглядит так:

Код: Выделить всё

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"

Код: Выделить всё

new d; // задаем переменную 
while(d++<50) // Указываем, сколько цикл должен проходить по функции до его завершения (в нашем 50 раз) 
{ 
SendClientMessage
(playerid, 0xFFFFFFFF, ""); // Функция которая должна выполняться     


С помощью этих пяти строчек мы избавились от 50 строк одного и того же!

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

Код: Выделить всё

for (переменная, условие, увеличение(инкремент)) 
} 
                             
<< Условия цикла (Тело цикла) 


Цикл "For" почти точно такой же как и "While" отличается он только тем, что он начинается с объявления переменной. После переменной идет условие, а затем инкремент.

Пример использования:

Код: Выделить всё

for(new i = 0; i < MAX_PLAYERS; i++) 
{ 
                             SendClientMessage
(playerid,0xFFFFFFAA,"Поздравляю вы один из тех, кто был кикнут с сервера"); 
                             Kick
(i); 


Разберём этот пример по частям:

Код: Выделить всё

for(new i = 0; i < MAX_PLAYERS; i++) - Тут мы создаем переменную "i" и приравниваем её к нулю, затем создаем условие и задаем действие

Код: Выделить всё

{ 
SendClientMessage
(playerid,0xFFFFFFAA,"Поздравляю вы один из тех, кто был кикнут с сервера"); 
Kick
(i); - Здесь условие выполняемого цикла 


Данный цикл который я привел в пример, проходит по всем игрокам которые в данные момент на сервере и выполняет действие которое указанно в теле цикла (то есть выдача сообщения игроку и отключение его от сервера)
Согласитесь, одним циклом меньше чем за секунду кикнуть весь сервер, чем выкидывать (кикать) каждого игрока отдельно.

Личное мнение:
- Данный цикл скорее служит не для оптимизации мода, а для выполнения какой ни будь команды.
На пример обычная команда /members состоит из такого цикла, который в данные момент времени по условию (телу цикла) которое мы поставим проверяет (отбирает) игроков на то что он состоит в данной фракции и выводит его в список сотрудников.
Использование цикла - Do..while
Внешнее строение цикла и его обозначения:

Код: Выделить всё

do 
{ 
                           
<< Что должен выполнять цикл (тело цикла) 
} 
while(условие);


Цикл "Do..while" похож на цикл "While" но у него есть небольшое отличие в том, что сначала выполняются инструкции которые мы ему задали, а только после этого проверяется условие.

Пример использования:

Код: Выделить всё

new i; 
do 
{ 
                   format
(string, sizeof(string), "Выводимое число: %d",i++); 
                   SendClientMessage
(playerid,0xFFFFFFAA,string); 
} 
while(< 10);


Разберём этот пример по частям:

Код: Выделить всё

new i; // Задаем переменную (можно её приравнять new i = 0; или оставить как есть) 
do 
{ 
format
(string, sizeof(string), "Выводимое число: %d",i++); // Создаем задание которое должен выполнить цикл. 
SendClientMessage(playerid,0xFFFFFFAA,string); 
} 
while(< 10); // Проверка условия которое определит будет ли тело цикла еще раз выполняться.   


Функции данного цикла:
Данный цикл выводит игроку цифры по порядку в чат.
Если переменная i равна нулю, то будет выводиться 0,1,2,3,4,5,6,7,9,10
Если она не равна,то первое число которое выведет цикл в чат игроку будет такое чему сейчас равна переменная i, а остальные по условию. Если первое число больше 10 то дальше цикл не будет выполняться, так как это нарушает наше условие while(i < 10);
[center]i love you [s]mxIni[/s] Mysql[/center]


Холден Колфилд M
Аватара
Холден Колфилд M
Сообщения: 3
Зарегистрирован: 11 апреля 2013
С нами: 10 лет 11 месяцев

#2 Холден Колфилд » 11 апреля 2013, 19:41

Не полная статья
RastaOrecha

Дим M
Автор темы, Администратор
Администратор
Аватара
Дим M
Автор темы, Администратор
Администратор
Сообщения: 1608
Зарегистрирован: 5 апреля 2013
С нами: 10 лет 11 месяцев

#3 Дим » 11 апреля 2013, 20:04

Холден Колфилд писал(а):Не полная статья
Будем рады, если дополнишь.
[center]i love you [s]mxIni[/s] Mysql[/center]

Холден Колфилд M
Аватара
Холден Колфилд M
Сообщения: 3
Зарегистрирован: 11 апреля 2013
С нами: 10 лет 11 месяцев

#4 Холден Колфилд » 12 апреля 2013, 17:46

Ну к примеру:

Код: Выделить всё

static 0;
for 
5; ++21; do
printf("output: %i"a);  


Ещё while выполняется пока условие равно истина и называется он цикл с предусловием.
RastaOrecha


Вернуться в «Основы скриптинга»

Кто сейчас на форуме (по активности за 5 минут)

Сейчас этот раздел просматривают: 6 гостей