13.12.2011, 01:26
(
Last edited by Mattos; 14/09/2013 at 07:04 PM.
)
Include Progression
Diminuindo quantidade de if's
Olб galera do fуrum! Resolvi postar uma include que criei tem ai umas 4 semanas e que to usando muito no meu Servidor. Ela por equanto sу funciona com Intengers mas em breve estarei aplicando pra funcionar com Floats o que exige um cбlculo mais avanзado. Diminuindo quantidade de if's
Essa include nada mais й que uma Progressгo Aritmйtica, isso, aquela mesmo que seu professor deu no colйgio e vocк achou inъtiu... Mais conhecida como PA, e que em breve estarei adicionando a PG (progressгo Geomйtrica)
AVISO: Conteъdo massante para ser lido.
O que й uma PA?
Uma PA й uma sequencia de npumeros que segue uma sequкncia lуgica aonde a cada nъmero sгo somados ou subtraнdos um mesmo nъmero.
Um exemplo de PA й (0, 3, 6, 9...) Sendo assim a razгo ® й 3 pois vai se somando 3 a cada nъmero.
O primeiro nъmero й 0 entгo ele й o A1. E o n (posiзгo na escala) do 0 й 1.
Portanto uma PA tem estб cara: (A1, A2, A3, A4... An)
Se comparado com a primeira escala:
0 = A1 => Posiзгo 1 entao n = 1
3 = A2 => Posiзгo 2 entao n = 2
6 = A3 => Posiзгo 3 entao n = 3
9 = A4 => Posiзгo 4 entao n = 4
E o "An"? O An й um numero qualquer da escala sendo n a posiзгo dele na escala como dito a cima.
Download:
SolidFiles
Cуdigo:
pawn Code:
/*
* Progression v1.0
* © Copyright 2011 by (Mattos)
*
* Author: Mateus Costa de Mattos (http://www.brasilwarzone.com)
* Date: 12th december 2011
*
* Do not remove the credits
* (Nao remova os crйditos)
*
*
*/
#define An 0
#define A1 0
#define r 0
#define n 0
stock ArithmeticProgression_Pass(oA1 = 0, oAn = 0, or = 0, on = 0)
{
if(oAn != 0 && oA1 != 0 && or != 0 && on == 0) return (((oAn-oA1+or)/or)%65999);
if(oAn != 0 && oA1 != 0 && or == 0 && on != 0) return ((oA1-oAn)/(1-on));
if(oAn != 0 && oA1 == 0 && or != 0 && on != 0) return (oAn-or*(on-1));
if(oAn == 0 && oA1 != 0 && or != 0 && on != 0) return (oA1 +or*(on-1));
return print("Error: Wrong use of the ArithmeticProgression function."), false;
#define ArithmeticProgression(%0,%1,%2,%3) ArithmeticProgression_Pass(%0,%1,%2,%3)
}
Й muito simples de usar a funзгo. Ela tem esta cara: ArithmeticProgression(A1, An, r, n)
Sendo a fуrmula de uma PA: An = A1 + r*(n - 1)
Ou seja na funзгo temos as 4 incуgnitas, e a incуgnita que vocк quer saber vc deixa ela mesma da forma como estб... Vamos dar um exemplo matemбtico pra depois dar um exemplo no jogo:
Temos a seguinte escala: (1, 3, 5, 7...) Sabemos entao que o A1 = 1, o r = 2 (por que vai somando de dois em dois)
Agora vamos supor que eu quero saber a posiзгo (n) do numero 35 (An) na escala, entao eu uso assim:
pawn Code:
new pos = ArithmeticProgression(1, 35, 2, n); // Como deixei o n, й o n que a funзгo vai procurar.
E no Jogo? Que utilidade tem essa P@%&# toda ae?
Vamos supor que eu queira fazer no meu servidor um sistema de propriedade, em que a cada 2 de score que o player evoluir, ele vai poder comprar mais uma propriedade para ele... Bom entгo de cara eu vejo a seguinte sequencia: (0, 2, 4...)
Do score 0 ao 1 ele poderб ter 1 propriedade. Do score 2 ao 3 ele poderб ter 2. Do score 4 ao 5 ele poderб ter 3 props.
Ja pensou vc ter de fazer milhares e milhares de if's para definir isso tudo? Negativo, vc usa o ArithmeticProgression(A1, An, r, n)... Muito simples: Sabemos que o A1 = 0 e que o r = 2... Entгo o An seria o Score do player... e o n o numero de propriedades que o player poderia ter. E porque isso? Basta ver ali em cima a 1 prop ali й justamente a posiзгo do 0, as 2 props й justamente a posiзгo do 2 e as 3 props й justamente a posiзгo do 4.
Por tanto poderiamos usar:
pawn Code:
new MaxPlayerProps = ArithmeticProgression(0, GetPlayerScore(playerid), 2, n); // Deixamos o n pq й ele que queremos saber
pawn Code:
new score = GetPlayerScore(playerid);
new MaxPlayerProps;
if ( 2 > score >= 0 )
{
MaxPlayerProps = 1;
}
if ( 4 > score >= 2 )
{
MaxPlayerProps = 2;
}
if ( 6 > score >= 4 )
{
MaxPlayerProps = 3;
}
...
(0, 10, 20, 30...)
pawn Code:
new Score = ArithmeticProgression(0, Kills, 10, n); //Deixando o n a fnзгo calcula o n...
SetPlayerScore(playerid, Score)
Se nгo entenderгo por favor postem as dъvidas que nгo me encomodarei de explicar de novo, adoro matemбtica...
E em breve ai estarei colocando PG (progressгo geomйtrica) que ao invйs de ir somando, vocк vai multiplicando: (1,3,9,27...) (multiplicando por 3)... Que ai por exemplo vai poder ser usada pra tornar ganhar Score por exemplo cada vez mais dificil... tendo que matar cada vez mais ou seja la o que for... Ah! e Tambem tentarei fazer para funcionar com floats... (nгo acho tao ъtil, mas quem sabe alguem queira usar...)
Gostara? Aprenderam? Acharam ъtil? +REP
ATENЗГO: Nгo remover os crйditos, conteъdo protegido por direitos autorais!
ATENЗГO: Nгo remover os crйditos, conteъdo protegido por direitos autorais!
Autoria:
Mattos
Crйditos:
rjjj