Julio 10, 2015, 05:32:27 AM Ultima modificación: Julio 10, 2015, 09:09:49 PM por ledillman
Buenas, tengo un proyecto de juego que estoy planificando, he empezado por probar algo simple con la funcion irandom(n); quiero que hayan personajes normales, raros y muy raros, para obtenerlos, por ahora, estoy usando un objeto que haciendole click izquierdo ejecuta este codigo:


randomize();

if irandom(99) = 70
   {
   show_message("Sacaste pj NORMAL");
   }
else
if irandom(99) = 20
   {
   show_message("Sacaste pj RARA");
   }
else
if irandom(99) = 10
   {
   show_message("Sacaste pj SUPER RARA");
   }


como el 0 tambien cuenta puse 99, entonces, lo que quiero es que los pjs normales tengan un 70% de probabilidad de salir, los raros un 20% y los muy raros un 10%, pero el problema al hacerle click al objeto es que hay muchas veces que simplemente no me sale el mensaje (que es lo que uso para ver si ha resultado el que salga un pj) lo que significa que no me dio un numero para cada caso, lo que quiero que haga el codigo es que si no encuentra un numero tiene que seguir buscando hasta sacar a algun pj, porque hay veces, como dije antes, que no me sale ningun mensaje.
entonces no se lo que estoy haciendo mal con el codigo, alguien es amable de explicarme? gracias

#1 Julio 10, 2015, 05:52:36 AM Ultima modificación: Julio 10, 2015, 06:59:14 AM por penumbra
Lo que está mal son las condiciones de los if. Suponiendo que se hacen 100 papelillos, en cada uno se escribe un número desde el 1 hasta el 100, se hacen bolita y se meten a un recipiente.

Por como estás construyendo las condiciones, usando un signo de igual, lo que estás haciendo es que de ese recipiente, en una sola oportunidad, quieres sacar el 70. Esto es lo que estás haciendo, pero esto no es tener el 70% de probabilidades de sacar un número "normal". Por el contrario, tal como están los IF, la probabilidad de que salga el 70 (o cualquier número, el que sea) es de 1/100. Por eso casi nunca te sale el mensaje, porque entre los tres if, sólo hay un 3% de probabilidades de que salga el 70 o el 20 o el 10

¿Qué tal si en lugar de decir "Quiero sacar un 70" dices "Quiero sacar un número menor o igual a 70"? En este caso está claro que sí habrá un 70/100 de proabilidad de que salga un número "normal". Lo mismo aplica a los otros casos.

usa el código choose


pon esto en el evento left click

"nombre de tu variable" = choose (70,20,10)
if "nombre de tu variable" = 70
   {
   show_message("Sacaste pj NORMAL");
   }
else
if "nombre de tu variable" = 20
   {
   show_message("Sacaste pj RARA");
   }
else
if "nombre de tu variable" = 10
   {
   show_message("Sacaste pj SUPER RARA");
}
y como variable pon "global.(lo que se te ocurra)"


creo que debería funcionar

si me equivoco por favor que alguien me corrija :)
   

Cita de: penumbra en Julio 10, 2015, 05:52:36 AM
Lo que está mal son las condiciones de los if. Suponiendo que se hacen 100 papelillos, en cada uno se escribe un número desde el 1 hasta el 100, se hacen bolita y se meten a un recipiente.

Por como estás construyendo las condiciones, usando un signo de igual, lo que estás haciendo es que de ese recipiente, en una sola oportunidad, quieres sacar el 70. Esto es lo que estás haciendo, pero esto no es tener el 70% de probabilidades de sacar un número "normal". Por el contrario, tal como están los IF, la probabilidad de que salga el 70 (o cualquier número, el que sea) es de 1/100. Por eso casi nunca te sale el mensaje, porque entre los tres if, sólo hay un 3% de probabilidades de que salga el 70 o el 20 o el 10

¿Qué tal si en lugar de decir "Quiero sacar un 70" dices "Quiero sacar un número menor o igual a 70"? En este caso está claro que sí habrá un 70/100 de proabilidad de que salga un número "normal". Lo mismo aplica a los otros casos.

Ya veo, al parecer era algo simple y luego de leer lo que pusiste me parece estupido no haberlo pensado asi xD, entonces deberia poner algo como if irandom(99) <= 70 (creo que <= es "menos que o igual que", por lo que cubriria los numeros del 0 al 70, deberia ponerle 69?) y para los demas deberia haber una expresion que pusiera "mas que 70 pero menos que 91" y otra que diga "mas que 90 pero menos que 100" para cubrir los demas porcentajes, esta bien?

@aroldhtz creo que tiene el mismo error que tenia mi codigo principal, pero desconozco lo que hace "choose".

no utilices los 3 IRANDOM, solamente obten la variable 1 sola vez y la iteras para saber si cumple con tu peticion por ejemplo


valor= irandom(100);

if(valor <=70){}
else if(valor >70 && valor <=90){}
else if(valor >90 && valor<=100){}

mas o menos asi, hace lo mismo y mas corto
Es Mejor No Saber Porque Funciona, Que Saber El Porque No Funciona...
Tienes alguna duda con "Game Design" o de videojuegos en general, contactamente mas facil en twitter @pavulzavala

#5 Julio 10, 2015, 07:50:00 PM Ultima modificación: Julio 10, 2015, 09:09:27 PM por ledillman
Cita de: somnus en Julio 10, 2015, 07:46:00 PM
no utilices los 3 IRANDOM, solamente obten la variable 1 sola vez y la iteras para saber si cumple con tu peticion por ejemplo


valor= irandom(100);

if(valor <=70){}
else if(valor >70 && valor <=90){}
else if(valor >90 && valor<=100){}

mas o menos asi, hace lo mismo y mas corto

Perfecto, probare de inmediato si funciona

EDIT: Vale, me ha funcionado perfectamente, gracias a todos! ahora mi entender, problema solucionado

Hola !, me alegra que hayas solucionado tu error,.
La función choose sirve para usar un montón de valores específicos

por ejemplo

valor = choose (90,100,400,600)
y
valor = irandom (600)

es como la función "random,  pero random te dejará un numero entre el 0 y el 600

pero choose seleccionará uno de los numeros que le diste (90 , 100, 400 o 600)


se puede usar también para ir a rooms aleatorios
o para los sprites

sprite_index= choose (1,3,6,8)

espero que hayas comprendido y añadido esta función a tu repertorio n.n