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

Description: Основы скриптинга
Moderator: SJplayer

Дим M
Topic author, Администратор
Администратор
Avatar
Дим M
Topic author, Администратор
Администратор
Posts: 1338
Joined: 5 Apr 2013
With us: 7 years 7 months

#1by Дим » 10 Apr 2013, 12:41

Циклы и использование их в моде
Автор: 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(< 10);


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

Code: Select all

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);
i love you mxIni Mysql

! ! !


Холден Колфилд M
Avatar
Холден Колфилд M
Posts: 3
Joined: 11 Apr 2013
With us: 7 years 7 months

#2by Холден Колфилд » 11 Apr 2013, 19:41

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

Дим M
Topic author, Администратор
Администратор
Avatar
Дим M
Topic author, Администратор
Администратор
Posts: 1338
Joined: 5 Apr 2013
With us: 7 years 7 months

#3by Дим » 11 Apr 2013, 20:04

Холден Колфилд wrote:Не полная статья
Будем рады, если дополнишь.
i love you mxIni Mysql

Холден Колфилд M
Avatar
Холден Колфилд M
Posts: 3
Joined: 11 Apr 2013
With us: 7 years 7 months

#4by Холден Колфилд » 12 Apr 2013, 17:46

Ну к примеру:

Code: Select all

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


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


  • Similar Topics
    Replies
    Views
    Last post

Return to “Основы”

Who is online (over the past 5 minutes)

Users browsing this forum: 1 guest