Pawn :: Основы скриптинга
Оператор switch
Оператор switch – это оператор выбора.
Он удобен в первую очередь тем, что может заменить много условий if, которые проверяют значение одной переменной. Представим себе такой пример. У нас есть целочисленная переменная pawn, значение которой нужно проверить. И в зависимости от того, какое значение у данной переменной выполнить соответствующий код.
new pawn;
switch(pawn)
{
case 0: //аналог условия if(pawn == 0)
{
print(”Переменная pawn = 0”);
}
case 1: //аналог условия if(pawn == 1)
{
print(”Переменная pawn = 1”);
}
}
Обратите внимание, если в фигурных скобках указано одно действие, его можно упростить так же как в случае с обычной условной конструкцией.
Но, что если переменная не попадает ни под одно условие в операторе switch. Тогда можно использовать default, он выполняется только в том случае, если switch не попадает ни в один из case.
new pawn;
switch(pawn)
{
case 0: printf(”Переменная pawn = 0”);
case 1: printf(”Переменная pawn = 1” );
default: printf(”Переменная pawn = %d” , pawn);
}
То же самое можно сделать и с помощью обычной условной конструкции if, тогда код выглядел бы следующим образом:
if(pawn == 0)
{
printf(”Переменная pawn = 0”); //все равно что case 0
}
else if(pawn == 1)
{
printf(”Переменная pawn = 1”); //все равно что case 1
}
else
{
printf(”Переменная pawn = %d” , pawn); //все равно что default
}
Этот способ удобнее и читабельнее чем много if конструкций идущих подряд. Еще одно отличие, что в case можно указать диапазон значений куда проще, чем в обычной условной конструкции if.
case 0..2: printf(”Переменная pawn = %d” , pawn); //условие внутри switch
if(pawn > 0 && pawn < 2) printf(”Переменная pawn = %d” , pawn); //то же условие, но уже в if
Рассмотрим пример использования данного оператора в функции OnPlayerDisconnect.
В данной функции параметр reason возвращает ID причины отключения игрока от сервера.
Благодаря этому параметру можно сделать вот такой код оповещения игроков о уходе игрока с сервера с пояснением причины.
switch(reason)
{
case 0:
{
GetPlayerName(playerid,plname,24);
format(string,sizeof(string), "*** %s вылетел с сервера.(ID:%d)",plname,playerid);
SendClientMessageToAll(0xAA3333AA,string);
}
case 1:
{
GetPlayerName(playerid,plname,24);
format(string,sizeof(string), "*** %s покинул сервер.(ID:%d)",plname,playerid);
SendClientMessageToAll(0xAA3333AA,string);
}
case 2:
{
GetPlayerName(playerid,plname,24);
format(string,sizeof(string), "*** %s был кикнут.(ID:%d)",plname,playerid);
SendClientMessageToAll(0xAA3333AA,string);
}
}
Этот пример можно упростить с помощью вот такой stock функции.
stock GetName(playerid)
{
new nick[MAX_PLAYER_NAME];
GetPlayerName(playerid, nick, sizeof(nick));
return nick;
}
В этом случае функцию GetPlayerName можно просто убрать из switch, а вместо переменной plname подставить вызов данной функции. Саму переменную plname также нужно удалить.
|
|
|