[Tutorial] Criando switch [PP]

23 de dez. de 2012.

O que é um switch? 
Switch é um comparador de resultados semelhante ao if e else if porem com uma estrutura diferenciada, em alguns casos chega à ser mais rápido(caso usado corretamente com auxilio de break). 

Exemplo de uso: 
Vamos tomar por exemplo o comando /admins, em vez criarmos um if seguido de vários else if pra cada nível de admin à aparecer no /admins precisaremos apenas criar um switch(função) seguido de cases, o case servirá como o else if mas de uma maneira mais compacta e otimizada pois só armazenará o numero(enum) à ser verificado, abaixo o exemplo do /admins por if e o /admins por switch. 

if (strcmp(cmd, "/admins", true) == 0) 
for(new i = 0; i <= MAX_PLAYERS; i++) { if(IsPlayerConnected(i) == 1 && PlayerInfo[i][pAdmin] > 0) { 
if(PlayerInfo[i][pTrampo] == 1) { GetPlayerName(i, sendername, sizeof(sendername)); 
if(PlayerInfo[i][pAdmin] == 1) 
format(string, 256, "Nome: %s [Moderador] (Trabalhando)", sendername); 
SendClientMessage(playerid, COR_ADMINS, string); 
if(PlayerInfo[i][pAdmin] == 2) 
format(string, 256, "Nome: %s [Administração Nível 2] (Trabalhando)", sendername); 
SendClientMessage(playerid, COR_ADMINS, string); 
if(PlayerInfo[i][pAdmin] == 3) 
format(string, 256, "Nome: %s [ Administração Nível 3] (Trabalhando)", sendername); 
SendClientMessage(playerid, COR_ADMINS, string); 
return 1; 



O exemplo acima mostra como seria um /admins usando else if, veja como ficaria este comando usando switch abaixo. 

if (strcmp(cmd, "/admins", true) == 0) 
for(new i = 0; i <= MAX_PLAYERS; i++) { switch(PlayerInfo[i][pAdmin])//Função a ser verificada { case 1: { format(string, 256, "Nome: %s [Moderador] (Trabalhando)", sendername); SendClientMessage(playerid, COR_ADMINS, string); } //Se a função verificada for igual a 1 case 2: { format(string, 256, "Nome: %s [Administrador nível 2] (Trabalhando)", sendername); SendClientMessage(playerid, COR_ADMINS, string); } //Se a função verificada for igual a 2 case 3: { format(string, 256, "Nome: %s [Administrador nível 3] (Trabalhando)", sendername); SendClientMessage(playerid, COR_ADMINS, string); } //Se a função verificada for igual a 3 default: { Aqui a função a ser execultada caso nada se iguale aos resultados acima. } } } return 1; }


É lógico que nem todos os comandos /admin serão assim. 

Criando o seu switch: 
Crie seu switch com a função à ser verificada que quiser, mas siga este formato abaixo: 

switch (Função) //Coloque por exemplo um PlayerInfo[player][info] ou qualquer outra coisa 
case 1: 
//O que deve ser executado caso seja igual a 1 
return true; 
case 2: 
//O que deve ser executado caso seja igual a 2 
return true; 
case 3: 
//O que deve ser executado caso seja igual a 3 } 
return true; 
default: //Não obrigatório 
//O que deve ser executado caso não seja igual aos exemplos acima 



Lembrando, não necessariamente o resultado deverá seguir este padrão de 1, 2, 3.... Você tem total liberdade pra pular ou adequar valores. 

Você pode também modificar a forma do case, pra procurar por mais de um resultado como no exemplo abaixo: 

case 1, 2, 3: 
//O que deve ser executado caso seja igual a 1, 2 ou 3 
return true; 



em um if você teria que usar algo maior como este abaixo 

if (Função == 1 || Função == 2 || Função == 3) //Ou como os valores são consecutivos usar operadores relacionais < > 
O que deve ser executado caso a função seja igual a 1, 2 ou 3 
return true; 



Você pode também verificar resultados de um numero à outro, como no exemplo abaixo. 

case 1 .. 10: 
//O que deve ser executado caso o resultado se enquadre entre 1 e 10 
return true; 



Em if ficaria assim 

if (Função >= 1 && Função <= 3) { //O que deve ser executado caso a Função se enquadre entre ou igual 1 ou 4 return true; } 


Abaixo um exemplo bem distinto dos cases: 

if (strcmp(cmd, "/org", true) == 0) 
switch (PlayerInfo[playerid][pMembro]) 
case 1 .. 3: 
SendClientMessage(playerid, Cor, "Você pertence a uma org igual ou entre 1 e 3"); 
case 7, 8, 10: 
SendClientMessage(playerid, Cor, "Você pertence a org 7, 8 ou 10"); 
case 4: 
SendClientMessage(playerid, Cor, "Você pertence a org 4"); 
default: 
SendClientMessage(playerid, Cor, "Você pertence a uma org que não é 1, 2, 3, 4, 7, 8 ou 10"); 
return 1: 



Qualquer duvidas é só perguntar, como sempre.


Créditos: Josma_CMD
Agradecimento à: Progressão Pawn

0 comentários:

Postar um comentário