Hola amigos!
Aver si me podeis ayudar, estoy creando un juego matemático en el cual debo comprobar que unas variables no sean iguales que otras y si lo fueran que de error y si no lo fueran lo de por correcto.
Me explico mejor, el jeugo trata de resolver unos rompecabezas de números colocando unos números que yo tengo asignados en cada variable pero que no los puedan repetir por ejemplo si variable1 = 1 y variable2 = 1 (error) algo asi.
Tengo puesto este código:
if (global.circulosarriba)+(global.circulosizquierda)+(global.circulosabajo)+(global.circulosderecha) = 72
{
if (global.contador2 = 72)
{
if (global.circuloclick1)and(global.circuloclick2)and(global.circuloclick3)and(global.circuloclick4)and(global.circuloclick5)and(global.circuloclick6)and(global.circuloclick7)and(global.circuloclick8) != (global.circuloclick1)and(global.circuloclick2)and(global.circuloclick3)and(global.circuloclick4)and(global.circuloclick5)and(global.circuloclick6)and(global.circuloclick7)and(global.circuloclick8)
{
global.mensaje = string("¡PERFECTO!#Has conseguido resolver el juego.");
instance_create(room_width/2,room_height/2,obj_cargando);
//instance_create(room_width/2,room_height/2,obj_combinacion_correcta);
}
}
if (global.contador2 = 72)
{
if (global.circuloclick1)and(global.circuloclick2)and(global.circuloclick3)and(global.circuloclick4)and(global.circuloclick5)and(global.circuloclick6)and(global.circuloclick7)and(global.circuloclick8) = (global.circuloclick1)or(global.circuloclick2)or(global.circuloclick3)or(global.circuloclick4)or(global.circuloclick5)or(global.circuloclick6)or(global.circuloclick7)or(global.circuloclick8)
{
global.mensaje = string("¡La combinacion no es correcta.#Sigue probando.");
alarm[0] = 90;
//instance_create(room_width/2,room_height/2,obj_combinacion_correcta);
}
}
Como podéis ver en la primera variable "if (global.contador2 = 72)" compruebo que globalcirculo1 and 2 and 3, etc... no sea igual que globalcirculo1 and 2 and 3, etc... le he puesto != que significa a mi entender una negación.
Y justo debajo le puesto lo mismo pero solo = sin el !, para comprobar que si son iguales entre ellos que de error.
El problema viene en que si por ejemplo en un circulo pones 16 y en otro 2 para hacer 18 y repites eso en los 6 restantes (son 8 circulos) el juego me lo verifica como error correctamente, pero si pones 16-2,14-4, y acto seguido pones otro 16-2, es ahi cuando me lo sigue contando como correcto y deberia ser errónea.
No se si me he explicado bien.
Lo que necesito es crear un código que sea capaz de verificar si alguno de los números que hay en cada circulo esta repetido en otro circulo pues que de incorrecto y que si de lo contrario no hay ningún número repetido y todo el panel suma un total de 72 puntos, pues que lo de por correcto.
Los números disponibles en la partida son: 2,4,6,8,10,12,14,16,18.
Gracias por la ayuda!!
Hmmm... Lo que quieres es tener una serie de variables asignadas, todas con un valor X de los posibles: {2,4,6,8,10,12,14,16,18}.
Si hay alguna variable que tenga el mismo valor que la otra, dar error.
Si todas son diferentes, pero la suma de éstas no es 72, dar error.
Si todas son diferentes, y la suma de éstas sí es 72, aprobar.
(Antes que nada recomiendo que uses arrays en vez de diferentes variables para optimizar memoria)
Entonces, se me ocurre que podrías insertar los datos de las variables en una lista si este dato no existe, pero de hacerlo, saltar error.
[gml]
var lista = ds_list_create();
var circulo, add;
for(var i = 0; i < array_length_1d(global.circulos); i++) {
circulo = global.circulos;
add = ds_list_find_index(lista, circulo);
if add = -1
ds_list_add(lista, circulo);
else
//Error, un círculo tiene el mismo valor que otro
}
ds_list_destroy(lista);
[/gml]
Y para comprobar si la suma del valor de los círculos es 72:
[gml]
var n = 0;
for(var i = 0; i < array_length_1d(global.circulos); i++) {
n += global.circulos;
}
if n != 72
//Error, la suma del valor de los círculos no es 72
else
//Aprobado, la suma del valor de los círculos es 72
[/gml]
Cita de: NiuWeb en Abril 25, 2016, 04:56:19 AM
Hmmm... Lo que quieres es tener una serie de variables asignadas, todas con un valor X de los posibles: {2,4,6,8,10,12,14,16,18}.
Si hay alguna variable que tenga el mismo valor que la otra, dar error.
Si todas son diferentes, pero la suma de éstas no es 72, dar error.
Si todas son diferentes, y la suma de éstas sí es 72, aprobar.
(Antes que nada recomiendo que uses arrays en vez de diferentes variables para optimizar memoria)
Entonces, se me ocurre que podrías insertar los datos de las variables en una lista si este dato no existe, pero de hacerlo, saltar error.
Gracias por la respuesta ta rápida, te explico. Esto no me sirve o no lo se hacer funcionar bien. Te explico más detalladamente.
Cada circulo tiene asignada una variable distinta "global.circulo1" 2, 3, 4 asi hasta 8 circulos, por que cada circulo es un botón que al ser pulsado suma 2 puntos a la variable esa y si es mayor que 16 la pone en 0 y vuelve a empezar.
Entonces lo que me has puesto no me serviria por que no es una lista para ir sumando números si no que son variables diferentes para que el jugador vaya pulsando los botones y cambiando su número y en el circulo se ve con un "draw" el número que está saliendo en ese momento.
No se si me explicado bien, entonces lo que es el juego son clics en botones y luego aparte tengo la variable contador y otra variable que me suma los circulos por parejas para verificar que cada una sume 18 (que es el reto del juego, 2 circulos tienen que sumar 18 pero sin repetir ningún número).
A lo que voy, si cada circulo es un botón, como podría hacer para hacer eso que tu dices? y de que manera? tendría que modificar todo lo que llevo de juego, imagenes, diseño, y tal?
Te pongo una imagen de los circulos para que lo veas más claro.
EDITO: En el juego tengo un botón aparte que es el de confirmar, que al ser pulsado comprueba todos los circulos "de ahí el primer código que he pegado"
(http://s31.postimg.org/qwrswntrv/Juego_circulos_18.png)
Nada, sigo sin poder hacer funcionar el sistema que yo quiero. ¿Alguien se le ocurre de que otra manera podría hacerse? Teniendo en cuenta lo que he comentado antes, de que cada circulo es un boton que va cambiando el número y una vez puestos todos... el usuario tiene que dar a otro boton "confirmar" y que ese boton verifique el tablero.
Gracias.
Te funcionaría si usaras arrays, como te digo, que aparte de ser más flexibles ahorras memoria.
Es decir, que en vez de escribir algo como:
[gml]
global.circulo1 = 0;
global.circulo2 = 0;
global.circulo3 = 0;
...
global.circulo8 = 0;
[/gml]
Hagas:
[gml]
global.circulo[7] = 0;
[/gml]
Y cuando hagas click en un círculo, sumas así:
[gml]
//Al presionar el círculo 1:
global.circulo[0] += 1;
//Al presionar el 5
global.circulo[4] += 1;
[/gml]
Y de esa forma si te funcionaría el método que te dije
Hola NiuWeb, otra vez por aquí, es que no consigo entender como va esto. Si podrias decirme donde poner cada código te lo agradecería, porque ando bastante perdido y por muchas pruebas que yo haga, no entiendo mucho como funciona.
Te explico lo que he echo hasta ahora.
1. En cada botón circulo, en el evento "Create" he puesto [gml]global.circulo[7] = 0;[/gml]
el mismo código en los 8 circulos eh con el [7].
2. En cada botón circulo en el evento "Left Pressed" he puesto [gml]global.circulo[0] += 2;[/gml]
pero en cada circulo hasta el 8 he ido cambiando el
- por 1,2,3,4,5,6 y 7.
3. En cada evento "Draw" de cada botón, he echo que dibuje los números de tal variable encima de cada circulo.
Hasta ahí todo funciona bien, das click en los circulos y te va sumando los números de cada uno de 2 en 2 ya que los números tienen que ser pares.
El problema ahora es que el código que tu me pusiste primero, para verificar que no se repita ningún número en los circulos y que todo sume 72 para pasarte la pantalla... no se como y donde ponerlo.
lo puse todo en el botón de confirmar que tengo en "Left Pressed" pero me tira error porque seguramente ahí no va.
Y claro el botón confirmar es lo que a de verificar que al pulsarlo, lea todos los circulos y me tire un mensaje de error si hay alguno repetido o no suman 72 o me tire un mensaje correcto si no hay nada repetido y todo suma 72.
¿Me podrias guiar en esto último please? Soy un poco novato aún en esto.
Luego me dado cuenta que en el código me pones la global.circulos como si fuera una general, pero yo esa global general no la tengo porque lo hacia indicivuales y claro al quitar todas las variables para crear la lista que tu me dijiste pues ya no me sirve ese metodo.
Gracias por tu paciencia!
Cita de: JohnW en Abril 26, 2016, 02:57:07 AM
1. En cada botón circulo, en el evento "Create" he puesto [gml]global.circulo[7] = 0;[/gml]
el mismo código en los 8 circulos eh con el [7].
Hmmm... No me convence. Deberías colocar ese código en un sólo objeto controlador.
Cita de: JohnW en Abril 26, 2016, 02:57:07 AM
lo puse todo en el botón de confirmar que tengo en "Left Pressed" pero me tira error porque seguramente ahí no va.
¿Qué error te da?
Cita de: JohnW en Abril 26, 2016, 02:57:07 AM
Luego me dado cuenta que en el código me pones la global.circulos como si fuera una general, pero yo esa global general no la tengo porque lo hacia indicivuales y claro al quitar todas las variables para crear la lista que tu me dijiste pues ya no me sirve ese metodo.
No te comprendo bien, el array
global.circulo ya es global/general, por lo que podremos acceder a él desde cualquier objeto. Pero eso, claro, si el array existe. Por eso lo que te dije al principio, declara el array global en algún objeto controlador para evitar problemas
Buenas de nuevo!
He borrado todos los códigos "Create" de cada circulo y he creado en un "obj_control" en "Create" el código [gml]global.circulo[7] = 0;[/gml]
He probado que al clicar cada circulo siga funcionando la suma de números y funciona correctamente.
En el botón "btn_confirmar" en el evento "Left Pressed" he copiado tal cual tus códigos de esta manera[gml]var lista = ds_list_create();
var circulo, add;
for(var i = 0; i < array_length_1d(global.circulos); i++) {
circulo = global.circulos;
add = ds_list_find_index(lista, circulo);
if add = -1
ds_list_add(lista, circulo);
else
global.mensaje = string("La combinacion no es correcta.#Sigue probando.");
alarm[0] = 90
//Error, un círculo tiene el mismo valor que otro
}
ds_list_destroy(lista);
var n = 0;
for(var i = 0; i < array_length_1d(global.circulo); i++) {
n += global.circulo;
}
if (n != 72)
{global.mensaje = string("La combinacion no es correcta.#Sigue probando.");
alarm[0] = 90}
else
{ global.mensaje = string("¡PERFECTO! Has resuelto este juego.")}[/gml]
Y al clicar dicho botón dentro del juego, me salta el error[gml]Push :: Execution Error - Variable Get -5.circulos(100031, -2147483648)
at gml_Object_btn_confirmar_2_LeftButtonPressed_2 (line 8) - for(var i = 0; i < array_length_1d(global.circulos); i++) {
############################################################################################[/gml]
El error es que estás intentando, en alguna parte del código en el evento <left pressed>, leer un array llamado global.circulos, cuando el array se llama global.circulo
Cita de: NiuWeb en Abril 26, 2016, 03:19:56 AM
El error es que estás intentando, en alguna parte del código en el evento <left pressed>, leer un array llamado global.circulos, cuando el array se llama global.circulo
Vale, he cambiado esa variable por circulo quedando el código de tal manera[gml]var lista = ds_list_create();
var circulo, add;
for(var i = 0; i < array_length_1d(global.circulo); i++) {
circulo = global.circulo
;
add = ds_list_find_index(lista, circulo);
if add = -1
ds_list_add(lista, circulo);
else
global.mensaje = string("La combinacion no es correcta.#Sigue probando.");
alarm[0] = 90
//Error, un círculo tiene el mismo valor que otro
}
ds_list_destroy(lista);
var n = 0;
for(var i = 0; i < array_length_1d(global.circulo); i++) {
n += global.circulo;
}
if (n != 72)
{global.mensaje = string("La combinacion no es correcta.#Sigue probando.");
alarm[0] = 90}
else
{ global.mensaje = string("¡PERFECTO! Has resuelto este juego.")}[/gml]
Ahora no me tira ningún error pero ponga el número que ponga en los circulos, me salta el mensaje que tengo predefinido como error.[gml]global.mensaje = string("La combinacion no es correcta.#Sigue probando.");[/gml]
Y aunque ponga los números correctos y sin repetir ninguno para pasar el nivel, al darle a confirmar me sigue leyendo esa parte del código y no la parte esta[gml]{ global.mensaje = string("¡PERFECTO! Has resuelto este juego.")}[/gml]
Acabo de darme cuenta que en la parte del código [gml]for(var i = 0; i < array_length_1d(global.circulo); i++) {[/gml]
tenía puesto global.circulo y se lo he quitado.
Ahora con ese cambio, si rellenas los circulos con los mismos números repitiendolos, me lo da por válido sin hacer caso al primer código que tendría que verificar si hay alguno repetido.
El código actualmente lo tengo así[gml]var lista = ds_list_create();
var circulo, add;
for(var i = 0; i < array_length_1d(global.circulo); i++) {
circulo = global.circulo;
add = ds_list_find_index(lista, circulo);
if add = -1
ds_list_add(lista, circulo);
else
global.mensaje = string("La combinacion no es correcta.#Sigue probando.");
alarm[0] = 90
//Error, un círculo tiene el mismo valor que otro
}
ds_list_destroy(lista);
var n = 0;
for(var i = 0; i < array_length_1d(global.circulo); i++) {
n += global.circulo;
}
if (n != 72)
{global.mensaje = string("La combinacion no es correcta.#Sigue probando.");
alarm[0] = 90}
else
{ global.mensaje = string("¡PERFECTO! Has resuelto este juego.")}[/gml]
Cita de: JohnW en Abril 26, 2016, 03:39:49 AM
Acabo de darme cuenta que en la parte del código [gml]for(var i = 0; i < array_length_1d(global.circulo); i++) {[/gml]
tenía puesto global.circulo[i] y se lo he quitado.
Lo siento, mi error.
Volviendo al tema:
Quizás el error se deba a que estás ejecutando la alarma por cada iteración del ciclo, puesto que no la has agrupado bajo el
else.
El código se podría arreglar así:
[gml]
var lista = ds_list_create();
var circulo, add, n = 0;
for(var i = 0; i < array_length_1d(global.circulo); i++) {
circulo = global.circulo
;
n += circulo;
add = ds_list_find_index(lista, circulo);
if add == -1
ds_list_add(lista, circulo);
else { //Hemos usado llaves para agrupar las acciones
global.mensaje = "La combinacion no es correcta.#Sigue probando.";
if llamada == true {
alarm[0] = 90;
llamada = false;
}
}
}
ds_list_destroy(lista);
if (n != 72)
{global.mensaje = "La combinacion no es correcta.#Sigue probando.";
alarm[0] = 90}
else
{ global.mensaje = "¡PERFECTO! Has resuelto este juego."}
[/gml]
El hecho de que llames una alarma dentro de un ciclo hace que necesites medidas especiales para evitar errores. Por ello, agregué una condición if llamada == true. Pero debes declarar esa variable como true en el <create> del mismo objeto, y volverle a asignar ese valor en la alarma.
Y me parece algo extraño que en todos los "mensajes" llames una alarma, y en el último no.
Por cierto, no es necesario usar una función string() cada vez que necesites asignar un valor de texto a una variable, esta función es para convertir números reales a cadenas.
He copiado ese código tal cual y he añadido en el mismo "btn_confirmar" en "Create" el código[gml]llamada = true[/gml]
Pero sigue pasando lo mismo, rellenas los circulos con cualquier número que este repetido en otro circulo y me lo da por válido no me dice que la combinación no es correcta.
Yo creo que el código solo ve que el panel suma todo 72 y no hace caso al primer código para verificar si hay algún número repetido.
Lo de las alarmas despues de cada mensaje no tiene nada que ver con esta parte del juego, es simplemente que yo tengo una ventanita en el juego donde salen todos los mensajes para que el usuario vaya leyendo lo que el juego le dice y tras sacar X mensaje pues salta la alarma en 90 pasos y lo que hace esa alarma es que la variable de mensajes la ponga en cero, es decir que borra el mensaje que a escrito para que la ventana quede limpia.
A lo que iba, que no me detecta si los números se repiten, me lo da válido siempre que el panel sume un total de 72 puntos.
Sólo para probar, reemplaza esta parte del código:
[gml]
global.mensaje = "La combinacion no es correcta.#Sigue probando.";
if llamada == true {
alarm[0] = 90;
llamada = false;
}
[/gml]
Por esto:
[gml]
show_message("combinación incorrecta");
[/gml]
Si el mensaje se muestra, quiere decir que en realidad sí se está verificando que el número esté o no repetido.
Aunque creo que podrías solucionar poniendo break, así:
[gml]
global.mensaje = "La combinacion no es correcta.#Sigue probando.";
if llamada == true {
alarm[0] = 90;
llamada = false;
}
break;
[/gml]
Genial!!
Ahora si funciona, me sale el mensaje de incorrecto y el panel no suma 72 en ningún caso, me sale el mensaje de incorrecto si el panel suma 72 pero hay algún número que está repetido y me sale el mensaje de correcto si el panel suma 72 y ningún circulo se repite con otro. :)
Gracias por tu ayuda y paciencia NiuWeb, eres un crack!
[user]JohnW[/user] asegurarte haber cambiado esta parte de tu codigo:
if add = -1
por
if ( add == -1 )
¿Al final fue el break lo que lo solucionó?
Como no se me ocurrió antes :'( :-[ xD
PD: Vampy, en GM no es necesario este cambio de operador, la comprobación funciona perfectamente igual con los dos operadores, ni tampoco son necesarios los paréntesis.
Cita de: NiuWeb en Abril 26, 2016, 04:24:42 AM
¿Al final fue el break lo que lo solucionó?
Como no se me ocurrió antes :'( :-[ xD
PD: Vampy, en GM no es necesario este cambio de operador, la comprobación funciona perfectamente igual con los dos operadores, ni tampoco son necesarios los paréntesis.
Probé las dos formas que me dijiste, primero hize lo del show_message y si que funcionaba aunque el show_message al saltar en la pantalla la ventanita esa, saltaba 5 o 6 veces seguidas.
Pero al ponerlo todo como antes, y añadir el break; quedó perfecto :)
Yo la verdad tampoco había caído en eso pero más que nada por que pensaba que el código break; solo se usaba en los scripts cuando hacias una lista de opciones por ejemplo para un menú pero desconocia que también se usáran en el resto del programa.
:) Me queda mucho por aprender aún.