Comunidad Game Maker

Ayuda => Preguntas y respuestas => Mensaje iniciado por: Spawn_x3 en Febrero 13, 2012, 04:00:25 AM

Título: Elección de Objetos al Azar
Publicado por: Spawn_x3 en Febrero 13, 2012, 04:00:25 AM
Buenas noches, por aquí de nuevo molestando con una nueva duda en este mundo GML :-[

El problema es que para el juego que estoy realizando requiero que se cada cierto tiempo se muestre un objeto entre 4 al azar, cada objeto realizara una acción diferente;

ejemplo:
objeto 1----->carga munición...
objeto 2 ---->aumenta velocidad...
objeto 3----->duplica el numero de balas...
objeto 4----->acción X

Mi idea para hacer esto es la siguiente:
1.-Crear una variable global con un contador con valor =4
2.-Y de alguna manera(que aún no se) usar una función random para cambiar el valor  de la variable al azar.
3.-Usar la condicional IF para asignar las acciones a cada numero de variable.

Esa es la idea básica de lo que quiero lograr, pero todavía me confundo un poco con la sintaxis del GML. Sobre todo en la relación con elección de valores al azar.
Agradezco alguna solución o propuesta y de corazón les doy gracias de antemano.

Un cordial saludos amigos...



Título: Re:Elección de Objetos al Azar
Publicado por: brunoxzx en Febrero 13, 2012, 04:26:15 AM
[gml]instance_create(x,y,choose(obj1,obj2,obj3,obj4));[/gml]
Título: Re:Elección de Objetos al Azar
Publicado por: Spawn_x3 en Febrero 13, 2012, 06:38:00 AM
Cita de: brunoxzx en Febrero 13, 2012, 04:26:15 AM
[gml]instance_create(x,y,choose(obj1,obj2,obj3,obj4));[/gml]

Excelente, me funciona perfecto y mucho más sencillo de como lo había realizado. No cabe duda de que hay varias soluciones a un solo problema. Una duda me podrías explicar un poco las funciones de cada parte del código, para entender lo que estoy usando.

Lo que entiendo es:
instance_create    //crear instancia
x,y //cordenadas de posición de la instancia.
choose(obj1,obj2,obj3,obj4)) //aqui no entiendo muy bien, creo que elige entre obj1,obj2,obj3 y obj4

pd. gracias por su paciencia y atención. :P
Título: Re:Elección de Objetos al Azar
Publicado por: MaanuRP en Febrero 13, 2012, 06:53:35 AM
la funcion "choose" lo que hace es elegir al azar entre las opciones que vos le pongas dentro.
Estas opciones deben estar separadas por "," (Comas).
Acepta hasta 16 opciones solamente si no me equivoco
Título: Re:Elección de Objetos al Azar
Publicado por: brunoxzx en Febrero 13, 2012, 09:36:31 AM
Cita de: MaanuRP en Febrero 13, 2012, 06:53:35 AM
la funcion "choose" lo que hace es elegir al azar entre las opciones que vos le pongas dentro.
Estas opciones deben estar separadas por "," (Comas).
Acepta hasta 16 opciones solamente si no me equivoco
Solo para completar lo dicho por MaanuRP, realmente no hay mucho problema con el numero de argumentos puedes usar un choose dentro de otro choose, por ejemplo.
[gml]choose(0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,choose(15,16,17));[/gml]
aunque de ese modo las probabilidades de que salga 15 16 o 17 son menores.
[gml]choose(choose(0,1,2,3,4,5,6,7,8),choose(9,10,11,12,13,14,15,16));[/gml]
Lo mismo puedes hacer con otras funciones como min() o max() de echo creo que esto venia en un  consejo de la anterior a la comunidad anterior xD  (no estaría mal volver a poner algo así).

Buen
Cita de: Spawn_x3 en Febrero 13, 2012, 06:38:00 AM
Excelente, me funciona perfecto y mucho más sencillo de como lo había realizado. No cabe duda de que hay varias soluciones a un solo problema. Una duda me podrías explicar un poco las funciones de cada parte del código, para entender lo que estoy usando.

En realidad tu idea no estaba tan mal, puedes usar ese método sin ningún problema aunque usar ifs no es lo ideal sería usar un switch (http://www.comunidadgm.org/manual_GM/Sentencia_switch.htm) que es muy parecido a usar muchos if y else de echo no dudo que internamente la función choose funcione así.

un ejemplo rápido sería así.

var a; // con esto se declara la variable temporal a.
switch(irandom(3)){// escoje un numero entero aleatorio entre 0 y 3.
     case 0: a=obj0 break;
     case 1: a=obj1 break;
     case 2: a=obj2 break;
     case 3: a=obj3 break;
}
instance_create(x,y,a);


En fin creo que esto ya se extendió demasiado y mi grafista me exige que trabaje...

P.D: ah lo olvidaba Bienvenido a comunidad gm "Spawn_x3" si tienes alguna duda no dudes en preguntar, pero antes de hacerlo no olvides buscar en el manual (http://www.comunidadgm.org/manual_GM/Index.php) esperamos ver pronto un juego de tu autoría.

Edit: checando tu perfil me di cuenta de que eres de los primeros usuarios de la comu O.o! te registraste en el 2004, así que ignora lo que escribí arriba.
Título: Re:Elección de Objetos al Azar
Publicado por: Zeit en Febrero 13, 2012, 07:54:07 PM
Hola, lo anterior es cuando cada opcion tiene la misma probabilidad de ser elegido, pero, que pasa cuando quieres que las probabilidades sean otras??? por ejemplo:

Tienes 4 objetos (obj1, obj2, obj3, obj4) pero a ti te interesa (por cualquier razon, quiza por importancia o relevancia) que el obj2 salga el doble de veces que el obj1 y el obj3 el triple que el obj1 y el obj4 a el cuadruple de veces que el obj1.

requieres 4 probabilidades (p1,p2,p3,p4) para las cuales p2=2*p1, p3=3*p1, p4=4*p1, y ademas p1+p2+p3+p4=1 (es decir el 100%)

p1+2*p1+3*p1+4*p1=1
p1*(1+2+3+4)=1
p1=1/(1+2+3+4)
p1=0.1
p2=0.2
p3=0.3
p4=0.4

Ahora, generas una valor aleatorio en el (0,1) con u=random(1) y checas uno por uno si se encuentra entre cada una de las probabilidades acumuladas, es decir,

F1=p1=0.1
F2=p1+p2=0.3
F3=p1+p2+p3=0.6
F4=p1+p2+p3+p4=1

Para k en 1 al 4
si u<=Fk entonces la opcion es objk y terminas.

Puedes gneral cualquier tipo de numeros aleatorios por este metodo o usar cualquier distribucion de probabilidad existente para tus necesidades (por ahi vi una extencion para GM), espero haber ayudado.

Saludos.
Título: Re:Elección de Objetos al Azar
Publicado por: Spawn_x3 en Febrero 13, 2012, 08:13:32 PM
Gracias a todos por su valiosa aportación.

Si, aunque tengo desde el 2004 por aquí. Hace poco reanude la aventura del GM, pues hace tiempo me faltaban habilidades y conocimientos para realizar un buen juego y termine abortando la misión, pero ya estoy por aquí dando guerra de nuevo. Y pues realmente si me pueden considerar nuevo en todo esto del GML. En lo que les puedo aportar es en modelado 3D y gráfico para su juegos, producción de algún tema musical y un poco de after fx, espero compartir mis habilidades con ustedes como ustedes comparten sus conocimientos.

Un saludo enorme.
Título: Re:Elección de Objetos al Azar
Publicado por: MaanuRP en Febrero 14, 2012, 03:09:22 PM
Zeit, una forma mas simple, pero mas "rustica" de sumar probabilidades en un choose es poner mas de una vez esa opcion. Por ejemplo "choose(Objecto1,Objeto2,Objeto3,Objeto1,Objeto1)" y con algo asi serian muchas mas las probabilidades que salga, no?
Es una idea a medio terminar porque nunca lo probe, pero, si el gm te permite repetir los argumentos, esto elevaria el % que saldra, ahora solo te quedara hacer la cuenta de que porcentaje tiene cada uno.
Título: Re:Elección de Objetos al Azar
Publicado por: Zeit en Febrero 14, 2012, 03:42:51 PM
Cita de: MaanuRP en Febrero 14, 2012, 03:09:22 PM
Zeit, una forma mas simple, pero mas "rustica" de sumar probabilidades en un choose es poner mas de una vez esa opcion. Por ejemplo "choose(Objecto1,Objeto2,Objeto3,Objeto1,Objeto1)" y con algo asi serian muchas mas las probabilidades que salga, no?
Es una idea a medio terminar porque nunca lo probe, pero, si el gm te permite repetir los argumentos, esto elevaria el % que saldra, ahora solo te quedara hacer la cuenta de que porcentaje tiene cada uno.

Si, tamben sirve para el proposito, en tu ejemplo el obj1 tiene el 60%, obj3 el 20% y obj3 el 20%. Pero este metodo meparece muy engorroso, muchos max; el otro metodo me parece mas automatico con un for, array o list, etc, saludos.