KlasterK

Циклы

4 posts in this topic

Привет, форумчане. Сейчас я расскажу вам про циклы в языке Pawn.

Цикл while работает таким образом: сначала проверяет условие, потом делает итерацию(код, который мы вписали). Когда условие неверно, цикл оканчивается.

while(Условие)
{
    Действия;
}

while(Условие)
    Действие;

Цикл do работает таким образом: сначала происходит итерация, потом проверяется условие.

do
{
    Действия;
}
while(Условие);

do Действие
while(Условие);

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

for(Первичное действие; Условие; Конечное действие)
{
    Действия;
}

for(Первичное действие; Условие; Конечное действие)
    Действие;

Если указать в качестве условия true, то цикл будет выполняться вечно. Но этого не стоит делать, так как в этом случае сервер полностью заблокируется и не сможет обрабатывать запросы игроков. Вместо этого лучше использовать таймеры.

 

Мы можем управлять циклами при помощи двух ключей: break и continue. Также можно манипулировать циклом при помощи изменения условия.

Ключ break позволяет остановить цикл. Ключ continue позволяет пропустить итерацию.

 

В спойлере ниже довольно большой пример, думаю суть вы поймёте по комментариям. 

Спойлер

#define MAX_MESSAGE 144              // Максимальный размер сообщения
#define ADMIN_PWD_1 "{123654789=-0}" // Пароль для админки первого уровня
#define ADMIN_PWD_2 "}{ee4rggAdmin2" // Пароль для админки второго уровня
#define ADMIN_PWD_3 "pawno-rus.ru$;" // Пароль для админки третего уровня

new PlayersAdmins[MAX_PLAYERS];                            // Массив для хранения статуса админки
new AdmPwds[][] = {ADMIN_PWD_1, ADMIN_PWD_2, ADMIN_PWD_3}; // Список паролей

public OnPlayerText(playerid, text[]) // Паблик, который вызывается когда игрок отправляет сообщение
{
    for(new i; i < sizeof AdmPwds; i++) // Перебор паролей
        if(!strcmp(AdmPwds[i], text)) // Проверяем, совпадает ли текст с паролем
        {
            PlayerAdmins[playerid] = i; // Устанавливаем игроку админ-уровень
            SendClientMessageToAll(-1"Администратор зашел на сервер!"); // Пишем всем
            return 0// Выходим из цикла и из паблика, не забываем возвращать 0 чтобы текст не написался
        };
    
    new bool:flag, msg[MAX_MESSAGE], name[MAX_PLAYER_NAME]; // Выделяем память
    GetPlayerName(playerid, name, MAX_PLAYER_NAME); // Узнаем имя игрока
    flag = (text[0] == '#'); // Проверяем, есть ли решетка в начале сообщения
    if(flag) // Если есть решетка
    {
        text[0] = '\1'// Заменяем решетку на символ-заглушку
        format(msg, MAX_MESSAGE, "Чат #%d >> %s[%d]: %s", PlayersAdmins[playerid], name, playerid, text);
        // Формат сообщения: "Чат #(уровень админки) >> (имя игрока)[(ид игрока)]: (сообщение)"
        // Пример: "Чат #1 >> Pawno_Rus[65]: Привет"
        for(new i; i < MAX_PLAYERS; i++)                 // Перебор игроков
            if(!IsPlayerConnected(i) &&                  // Если игрок подключен и...
            PlayersAdmins[i] == PlayersAdmins[playerid]) // ...если совпадают уровни админки у обоих игроков...
                SendClientMessage(i, -1, msg);           // ...то пишем ему сообщение
    }
    else // Если нет решетки
    {
        format(msg, MAX_MESSAGE, "Общий чат >> %s[%d]: %s", name, playerid, text);
        // Формат сообщения: "Общий чат >> (имя игрока)[(ид игрока)]: (сообщение)"
        // Пример: "Общий чат >> Pawno_Rus[65]: Привет"
        SendClientMessageToAll(-1, msg); // Пишем всем сообщение
    }
    return 0// Не забываем возвращать 0, чтобы сервер не написал сообщение сам
}

 

 

Share this post


Link to post
Share on other sites

@KlasterK Эта тема для тех кто даже не скачал pawnbook и не учил его, вот новичкам подойдёт. 

Share this post


Link to post
Share on other sites

@skynet99, и не надо скачивать Pawn Book (а тем более и учить): отвратительная книга, которая только вводит в заблуждение большим числом неточностей и ошибок. 

Share this post


Link to post
Share on other sites

@Cawfee В PawnBook действительно много недостатков, в разделе с инклудами многие из описаний нативов перепутаны, последняя версия учебника только для 0.3d, но он может служить справочником, если фильтровать содержимое. Также автор предлагает новичкам ReturnName, что не есть хорошо. Но других полноценных учебников, к сожалению нет, либо я плохо гуглю.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!


Register a new account

Sign in

Already have an account? Sign in here.


Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.