[Tutorial] Aspectos Aleatorios - Usar numargs(), getarg(...) y random(...) para hacer sistemas aleatorios dinбmicos y mas fбciles!
#1

Aspectos Aleatorios
Usar numargs(), getarg(...) y random(...) para hacer
sistemas aleatorios dinбmicos y mas fбciles!
Informaciуn

En este tutorial usted adquirirб conocimiento sobre un mйtodo que se puede utilizar para hacer que tus sistemas aleatorios sean dinбmicos y mas fбciles de usar. Lo cual significa que puedes usar una funciуn que devuelve valores aleatorios o hace acciones al azar en diferentes partes de tu script, mientras tienes el control sobre lo que devuelve la funciуn/lo que se aplica.

En este tutorial usaremos los siguientes funciones integrados en SA:MP: Desarrollo

Primero iremos a la explicaciуn de lo que vamos a ver en este tutorial:

Vamos a crear una nueva funciуn y pondremos "..." entre el parйntesis de nuestra funciуn, esto le dirб al script que podemos y queremos poner cualquier cantidad de argumentos que queramos durante el uso de la funciуn. Usaremos numargs(...) para obtener el nъmero de argumentos que introducimos en la funciуn y luego vamos a almacenarla en una variable llamada "arguments". Usaremos getarg(...) para obtener lo introducido en el нndice de un argumento y luego vamos a almacenarla en una variable llamada "selected". Y finalmente utilizaremos random(...) para seleccionar un argumento al azar que esta ingresado en el parйntesis de la funciуn.

Nuestra estructura bбsica se vera asн:
pawn Code:
function(...)
{
    new arguments = numargs(), selected = getarg(random(arguments));
}
Muy bien, vamos a suponer que deseas aplicar diferentes animaciones al azar en la selecciуn de clases para diferentes clases. Entonces harнamos algo como esto:
pawn Code:
public OnPlayerRequestClass(playerid, classid)
{
    switch(classid)
    {
        case 0: PlayRandomAnimation(playerid, 0, 1, 2, 3, 4, 5);
        case 1: PlayRandomAnimation(playerid, 4, 5);
        case 2: PlayRandomAnimation(playerid, 2, 5);
        case 3: PlayRandomAnimation(playerid, 0, 1);
        case 4: PlayRandomAnimation(playerid, 2, 4, 5);
        case 5: PlayRandomAnimation(playerid, 2);
    }
    return 1;
}

PlayRandomAnimation(playerid, ...)
{
    new arguments = numargs() - 1, selected = getarg(random(arguments) + 1);
    switch(selected)
    {
        case 0: ApplyAnimation(playerid, "BENCHPRESS", "GYM_BP_CELEBRATE", 4.1, 1, 1, 1, 0, 0, 1);
        case 1: ApplyAnimation(playerid, "DEALER", "DEALER_IDLE", 4.1, 1, 1, 1, 0, 0, 1);
        case 2: ApplyAnimation(playerid, "DEALER", "DEALER_DEAL", 4.1, 1, 1, 1, 0, 0, 1);
        case 3: ApplyAnimation(playerid, "COP_AMBIENT", "COPLOOK_THINK", 4.1, 1, 1, 1, 0, 0, 1);
        case 4: ApplyAnimation(playerid, "FLAME", "FLAME_FIRE", 4.1, 1, 1, 1, 0, 0, 1);
        case 5: ApplyAnimation(playerid, "GRAFFITI", "GRAFFITI_CHKOUT", 4.1, 1, 1, 1, 0, 0, 1);
    }
}
Dependiendo de la clase que estб viendo actualmente en la selecciуn de clases, se elegirб un нndice de animaciуn aleatoriamente que especificamos en nuestra funciуn y luego serб aplicada.
Quote:

La primera clase reproducirб una animaciуn aleatoria, ya sea 0, 1, 2, 3, 4 o 5.
La segunda clase reproducirб una animaciуn aleatoria, ya sea 4 o 5.
La tercera clase reproducirб una animaciуn aleatoria, ya sea 2 o 5.
La cuarta clase reproducirб una animaciуn aleatoria, ya sea 0 o 1.
La quinta clase reproducirб una animaciуn aleatoria, ya sea 2, 4 o 5.
La sexta clase reproducirб la segunda animaciуn indexada.

Tradicionalmente harнas esto:
pawn Code:
random(10);

O incluso esto:

RandomBetween(min, max)
{
    new rand = random(max - min) + min;
    return rand;
}
Pero si quieres retornar valores especificadas aleatoriamente?
pawn Code:
RandomNumber(...)
{
    new arguments = numargs(), selected = getarg(random(arguments));
    return selected;
}

printf("Random Argument: %d", RandomNumber(500, 1000, 1500, 2000));
Retornara uno de los valores que esta en los argumentos de la funciуn.

Incluso puedes enviar mensajes aleatorios especificados al azar!
pawn Code:
SendRandomMessage(playerid, 0, 2);
SendRandomMessage(playerid, 1, 3);

SendRandomMessage(playerid, ...)
{
    new arguments = numargs() - 1, selected = getarg(random(arguments) + 1), string[32 char];
    switch(selected)
    {
        case 0: strpack(string, "Hello!");
        case 1: strpack(string, "How are you?");
        case 2: strpack(string, "Good luck!");
        case 3: strpack(string, "What's up?");
    }
    return SendClientMessage(playerid, -1, string);
}
Y puedes hacer muchos mas cosas con estos funciones, sуlo tienes que poner tu imaginaciуn en juego!

Nota

Argumentos autуnomas afectan el resultado de numargs( ) y random(...), por lo que si usted estб planeando aсadir otros argumentos a su funciуn, reste el numero total de argumentos por la cantidad de argumentos que pusistes en la funciуn, y luego le aсades la cantidad a random(...).

pawn Code:
function(playerid, ...)
{
    new arguments = numargs() - 1, selected = getarg(random(arguments) + 1);
}
Conclusiуn

Este mйtodo de crear sistemas aleatorios es mas fбcil de usar y te da la habilidad de escoger lo que quieres que la funciуn devuelva o aplica.
Reply
#2

Muy ъtil :3
A lo mejor lo uso para un sistema de recompensas, muchas gracias!
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)