Циклы

В теме 5 сообщений

Привет, форумчане. Сейчас я расскажу вам про циклы в языке 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, чтобы сервер не написал сообщение сам
}

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

В большинстве случаев неактуально и следует использовать Foreach. Если даже не во всех. Тем кто пишет мод с нуля или какие то отдельные системы. Рекомендовал бы использовать уже:

https://github.com/Open-GTO/foreach

Быстрей, удобней. Экономичней в плане ресурсов.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!


Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.


Войти

  • Последние посетители   0 пользователей онлайн

    Ни одного зарегистрированного пользователя не просматривает данную страницу