Hola amigos, hace tiempo que no paso por esta comunidad, tengo una duda y queria saber si alguien me podria ayudar,estoy armando un juego similar a este:
http://www.juegos.com/juego/whats-your-sign

ahora el tema es que quiero saber como puedo hacer para que las operaciones se generen aleatorias y por lo tanto infinitas supongamos tengo un boton por cada signo (+, -, * y /) arriba se debe mostrar una operacion incompleta y un resultado y yo deberia pulsando cualquiera de los botones asignar el signo respectivo, de acertar pasa a otra operacion y sino sigue en la misma hasta que acierte, alguna sugerencia o idea de como hacerlo estuve realizando pruebas pero no consigo algo optimo.

el codigo que arme es el siguiente:


//Tiempo De juego
if global.Tiempo>0{global.Tiempo-=0.025}else{
room_goto(R_Score);}
//Elige Un Numero aleatorio
if Estado="Ninguno"{IMG=0
Numero01=round(random(100));Numero02=round(random(100))
global.Cuenta=choose("+","/","-","x")
if global.Cuenta="+"{Resultado=Numero01+Numero02}//Suma
if global.Cuenta="-"{Resultado=Numero01-Numero02}//Resta
if global.Cuenta="/"{Resultado=Numero01 div Numero02}//Division
if global.Cuenta="x"{Resultado=Numero01*Numero02}//Multiplicasion
if Resultado=round(Resultado){Estado="Esperando"}
}
//Resultado Elegido
if global.Accion=""{Imagen=Spr_Signo}//Ninguno
if global.Accion="+"{Imagen=Spr_Suma}//Suma
if global.Accion="-"{Imagen=Spr_Resta}//Resta
if global.Accion="/"{Imagen=Spr_Division}//Division
if global.Accion="x"{Imagen=Spr_Multiplicar}//Multiplicasion
//Verifica Si El Resultado Es correcto
if global.Accion<>""{//Acerto
if global.Cuenta=global.Accion{
if Tiempo02=0.90{instance_create(x,y,Obj_Acierto)}
if Tiempo02>0{Tiempo02-=0.05}
else{
global.Tiempo+=2;global.Accion="";global.Puntuacion+=100;global.Aciertos+=1;Estado="Ninguno";Tiempo02=1
}
}
if global.Cuenta<>global.Accion{//Fallo
if Tiempo02=0.90{instance_create(x,y,Obj_Fallo)}
if Tiempo02>0{Tiempo02-=0.05}else{if global.Tiempo>0{global.Tiempo-=10;
}else{global.Tiempo=0}
;global.Accion="";global.Errores+=1;Tiempo02=1}
}}


y en el evento de pulsación de cada botón (signo) tengo por ejemplo en el caso de la resta este código:
global.Accion="-"

ahora el tema es que no funciona adecuadamente dado que no es muy aleatorio que digamos sino que repite y de hecho casi siempre que lo juego arranca con las mismas operaciones y por otro lado en las divisiones redondea pero no sirve porque esta mal el resultado o sea si la operación no es posible directamente no debería ni mostrarla.

si me pueden ayudar les agradecería  mucho. un saludo.-

#1 Febrero 28, 2015, 08:21:26 AM Ultima modificación: Febrero 28, 2015, 08:47:16 AM por penumbra
Para que las operaciones sean aleatorias, necesitas agregar la función randomize(), de lo contrario se van a repetir siempre en el mismo orden.

Quizás no entendí correctamente lo que quieres lograr (no me fijé en el código), pero según lo que capté, si las operaciones son binarias siempre van a tener dos miembros, por ejemplo A + B, se me ocurre tener dos variables, una para guardar el miembro A y otra para B, por ejemplo

[gml]
randomize()
A = irandom(100)
B = irandom(100)
[/gml]

Luego, tener un arreglo de cuatro elementos, porque hay cuatro operaciones (pensando en las operaciones básicas)
[gml]
operacion[0] = A + B
operacion[1] = A - B
operacion[2] = A * B
operacion[3] = A / B
[/gml]

Definir qué operación se elige[gml]
signo = choose(0, 1, 2, 3)     //Esto se puede colocar arriba, donde se definen A y B. suma = 0; resta = 1, etc.[/gml]

Elegir el resultado de la operación actual:
[gml]resultado = operacion[signo][/gml]

En el evento donde se presiona el BOTÓN DE SUMA:
[gml]
if (A + B) == resultado
     //Se acertó en la elección del signo[/gml]

En el evento donde se presiona el BOTÓN DE RESTA:
[gml]
if (A - B) == resultado
     //Se acertó en la elección del signo[/gml]

Los 4 primeros bloques de código se pueden juntar en un solo script, que se llamaría cada vez que se quisiera realizar una nueva operación, así quedaría más limpio el código.

Es una idea simple. Se necesita pulirla más, por ejemplo, si es un juego para chicos, pues no sería justo que la división arrojara un cociente no entero, o que el cociente fuera  un número decimal menor a 1, por lo que A debería ser múltiplo de B (en el caso de la división. En el caso de la resta, se debe asegurar que A sea mayor a B para no obtener números negativos, si no se quiere)

Hola Penumbra, como estas tanto tiempo?. Bueno primero que nada muchas gracias por tomarte el tiempo de explicarme detalladamente como debería implementar este sistema, ahora las cosas me quedaron mas claras.
Lo que si aprobecho para consultarte como puedo verificar lo que mencionas del caso de las divisiones como para que solo muestre la operación en el caso de que el resultado no sea ni números negativos, ni decimales, etc, osea solo operaciones normales supongamos 10/2 =5, 100/4=25, etc, de lo contrario que saltee la operación esa y siga con otra. desde ya muchas gracias. :)

#3 Febrero 28, 2015, 11:27:43 PM Ultima modificación: Febrero 28, 2015, 11:32:24 PM por penumbra
Aquí andamos, todo bien. Un saludo, the_blade.

La validación de la multiplicación se puede implementar de varias maneras, una que se me ocurre es, cambiando un poco el orden del código, es decir, lo primero que se haría es elegir la operación
[gml]
randomize()
signo = choose(0, 1, 2, 3)     //Decidimos la operación de esta "ronda"; suma = 0; resta = 1, etc.
//En caso de que la operación sea una división...
if (signo == 3)
{
     B = irandom_range(1, 10)            //Elegir al azar el divisor
     A = B * irandom_range(1, 10)        //Elegir "pseudoaleatoriamente" el dividendo: A depende de B (A es múltiplo de B, se asegura división entera)
}
else
{
    //Si la operación no es una división, se definen A y B de manera "normal"
    A = irandom(100)
    B = irandom(100)
}
[/gml]

Excelente Penumbra nuevamente gracias. sos un groso che. a otra cosa cuando puedas si queres contactate conmigo por e-mail salvaticoandres@gmail.com, porque por ahí podemos organizar algunos proyectos o algo. un saludo y suerte.