[TUT] Criando switch [PP]
Autor: Antonio Souza | Publicado: 2012-01-24T14:05:00-08:00





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 &lt;= MAX_PLAYERS; i++) {     if(IsPlayerConnected(i) == 1 &amp;&amp; PlayerInfo[i][pAdmin] &gt; 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 &lt;= 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 &lt; &gt;

{

 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 &gt;= 1 &amp;&amp; Função &lt;= 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_CMDAgradecimento à: Progressão Pawn