tuts_rpg
Thread Id: 24957
Thread Name: Usando valores aleatorios en RPG
#0
Alice 28243
He visto en muchos foros que al trabajar valores aleatorios desde scripts muchos tienen problemas, es por ello que vengo a compartir un poco de ayuda.

¿Para que puedo utilizar los valores aleatorios?


No se me ocurrio nada mas que poner así que me voy directo a la explicación.

En Ruby, podemos generar un valor aleatorio de la siguiente manera:
rand(X..Y)
rand(X...Y)
Lo que hace es definir un rango y elegir un valor cualquiera del mismo.
Sin embargo, en RPG Maker esto no trabaja de la misma manera. En RPG podemos definir únicamente el valor máximo.

Generando el valor aleatorio
Para generarlo basta con utilizar:
rand(X)
Y es todo :3

...
...
...

¡Pero no se queda ahí!
Si quieres trabajar con ese valor debes almacenarlo en una variable, según la situación es el tipo de variable, yo la almacenaré en una local.

variable = rand(9)

Con tu numero aleatorio almacenado en una variable puedes hacer gran cosa, a continuación un ejemplo y lo explicaré:


def menu
opciones = [_INTL("4"),_INTL("Pocos"),_INTL("No sé"),_INTL("Muchos")]
comandos = Kernel.pbMessage(_INTL("¿Cuantos hacks hay en wah?"),opciones)
if comandos == 0
elegirhack(4)
elsif comandos == 1
elsif comandos == 2
elsif comandos == 3
end
end



def elegirhack(cantidad)
@cantidad = cantidad
@bloque = []
if @cantidad == 4
Kernel.pbMessage("A continuación, introduce algunos de ellos.")
@bloque[0] = Kernel.pbMessageFreeText(_INTL("¿Cómo se llama el hack?"),"",false,5)
@bloque[1] = Kernel.pbMessageFreeText(_INTL("¿Cómo se llama el hack?"),"",false,5)
@bloque[2] = Kernel.pbMessageFreeText(_INTL("¿Cómo se llama el hack?"),"",false,5)
@bloque[3] = Kernel.pbMessageFreeText(_INTL("¿Cómo se llama el hack?"),"",false,5)
Kernel.pbMessage("Se elegirá uno al azar.") if @cantidad == 4
hackaleatorio(4) if @cantidad == 4
end
end


def hackaleatorio(cantidad)
if cantidad == 4
[MENTION=25770]Aleatorio[/MENTION] = rand(3)
end
Kernel.pbMessage("Agrupando...")
[MENTION=15149]Hack[/MENTION] = @bloque [MENTION=25770]Aleatorio[/MENTION]]
if [MENTION=15149]Hack[/MENTION]almacenado.include? [MENTION=15149]Hack[/MENTION])
elegirhack(cantidad)
else
[MENTION=15149]Hack[/MENTION]almacenado.push [MENTION=15149]Hack[/MENTION]
Kernel.pbMessage("El hack elegido es: # [MENTION=15149]Hack[/MENTION]}")
continuarproceso equisdequisde
end
end


EXPLICACIÓN
Primero he creado un menú sencillito :3, muestra 4 opciones siendo la primera la que continua la cadena.

Al elegir la primera opción se llama a otro método con un atributo en cuestión; cantidad. (4)

Se abre un array vacio y si la variable es igual a la especificada en el atributo, te da la oportunidad de introducir 4 valores que serán almacenados en el array definido.

Finalmente, este te lleva a otro método, en este último se almacena un valor aleatorio de 4 opciones en una variable de clase.
rand(3)
Se elige un valor del array correspondiente al resultado del valor aleatorio y se almacena en otra variable de clase.

Por ultimo paso, se compara si el valor de la variable existe ya en otro array, si existe vuelve a elegir un valor aleatorio, si no existe se almacena en el array y continua el proceso.


Es solo un ejemplo, se pueden utilizar para otras cosas, espero haberme explicado bien que he hecho un gran esfuerzo tratando de ser clara :s
#1
VGS 12616
Genial, Muy bien tu aporte :D
Es de mucha ayuda, se pueden hacer varias cosas.
#2
Tito Drimer301 27267
Iniciado por Ciro
lolo necropost



Eso no es del todo cierto. Se puede generar un número cualquiera en un rango haciendo algo como esto:


numerito=0 # Dando un valor a numerito
until numerito>=1000 && numerito<=1100 # Genera números de valor máximo 1100 hasta tener uno comprimido entre 1000 y 1100
numerito=rand(1100)
end


Para comprobar que eso funciona, bastaría con poner algo así:


Kernel.pbMessage("#{numerito}")


Y podremos comprobar que ese mensaje siempre mostrará un número comprimido entre 1000 y 1100.



El equivocado sos vos, no veo que estés definiendo el mínimo dentro de rand, únicamente el máximo/límite superior.

Otra cosa es que condiciones tu script a que actúe en un rango específico del valor que devuelva el aleatorio.
#3
Tito Drimer301 27267
Iniciado por Ciro
Bueno, ese es el objetivo, ¿no? Generar un numero aleatorio entre (en este caso) 1000 y 1100, y eso funciona correctamente.

No defines el mínimo, pero aunque evidentemente genere números que estén por debajo de 1000, eso el jugador no lo sabrá, simplemente verá el número que esté entre 1000 y 1100.


Pero entonces ya es otra cosa.
Simplemente repites el proceso hasta que te de el valor que quieres (entre 1000 y 1100), lo mismo que hacer:

case rand(1100)
when 1000..1100
expr
end
#4
Tito Drimer301 27267
Iniciado por Ciro
Pues qué bien. ¿Cuál es el problema?


No tiene que haber uno ._.
#5
cosarara97 12296
Iniciado por Ciro
lolo necropost



Eso no es del todo cierto. Se puede generar un número cualquiera en un rango haciendo algo como esto:


numerito=0 # Dando un valor a numerito
until numerito>=1000 && numerito<=1100 # Genera números de valor máximo 1100 hasta tener uno comprimido entre 1000 y 1100
numerito=rand(1100)
end


Para comprobar que eso funciona, bastaría con poner algo así:


Kernel.pbMessage("#{numerito}")


Y podremos comprobar que ese mensaje siempre mostrará un número comprimido entre 1000 y 1100.


Eso es algo así como súper sub-optimo (?). Mucho mejor:


def awesome_rand(min, max)
return min + rand(max-min)
end