Novidades

31 agosto 2011

Progressão Pawn

[Tutorial] Criando switch [PP]


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

Subscribe to this Blog via Email :