Noviembre 22, 2015, 08:39:21 PM Ultima modificación: Noviembre 24, 2015, 08:26:25 PM por matiascarpello
Hola gente. Ya estoy terminando en Game Maker un juego de preguntas y respuestas tipo trivia. El juego ya esta un 95% y pronto estará en Google Play.

El funcionamiento del juego es sencillo, se muestra en pantalla una pregunta y tres posibles respuestas de las cuáles una es la correcta.

El juego tiene en total hasta ahora 100 preguntas. Y el funcionamiento de las preguntas y respuesta es la siguiente.

Tengo 100 objetos solo para las preguntas. Cada objeto dibuja una pregunta y tres respuestas. Si se elige la respuesta correcta se crea un objeto controlador de ganar. Y si se elige una respuesta incorrecta se crea un objeto controlador al perder.

Bien hasta ahí todo bien. Mi problema radica en que cada vez que a futuro quiera añadir una nueva pregunta tendré que actualizar el APK en google play. Además de que tendría miles de objetos en gamemaker.

Entonces se me ocurrió que sería posible leer las preguntas y respuestas desde un archivo ini de forma online. Bien, esto lo puedo hacer pero mi gran inconveniente es como validar si el usuario eligió la pregunta correcta o incorrecta. Porque como yo lo estoy haciendo es fácil ya que cada objeto de preguntas tiene su funcionamiento y validación para saber si el usuario tocó la respuesta correcta o incorrecta.

¿Alguna idea?

#1 Noviembre 22, 2015, 11:34:38 PM Ultima modificación: Noviembre 22, 2015, 11:36:59 PM por penumbra
Un método que se me ocurre es que en el ini, por cada pregunta, tengas la siguiente estructura (los comentarios no van en el ini, sólo sirven para propósitos de explicación):

[PREGUNTA10]
pregunta = "Cual es el mejor software para desarrollar juegos"   //Cadena
r1 = "Game Maker Studio"   //Cadena
r2 = "Game Salad"     //Cadena
r3 = "Unity"     //Cadena
correcta = ??    //Entero


El valor para la clave entero sería la longitud de la cadena de la respuesta correcta. Es decir, que si por ejemplo, la respuesta correcta fuera "Unity", el valor de correcta sería un 5, que es la longitud de la cadena "Unity". De esto se deduce que debes asegurarte que ninguna de las tres respuestas tenga una longitud igual. Luego, en GM, para saber cuál es la respuesta correcta, sólo tienes que comparar la longitud de la respuesta elegida con el valor de la clave correcta del ini mediante la función string_legnth()

#2 Noviembre 23, 2015, 12:00:02 AM Ultima modificación: Noviembre 23, 2015, 12:01:57 AM por jmbs19
Cita de: penumbra en Noviembre 22, 2015, 11:34:38 PM
Un método que se me ocurre es que en el ini, por cada pregunta, tengas la siguiente estructura (los comentarios no van en el ini, sólo sirven para propósitos de explicación):

[PREGUNTA10]
pregunta = "Cual es el mejor software para desarrollar juegos"   //Cadena
r1 = "Game Maker Studio"   //Cadena
r2 = "Game Salad"     //Cadena
r3 = "Unity"     //Cadena
correcta = ??    //Entero


El valor para la clave entero sería la longitud de la cadena de la respuesta correcta. Es decir, que si por ejemplo, la respuesta correcta fuera "Unity", el valor de correcta sería un 5, que es la longitud de la cadena "Unity". De esto se deduce que debes asegurarte que ninguna de las tres respuestas tenga una longitud igual. Luego, en GM, para saber cuál es la respuesta correcta, sólo tienes que comparar la longitud de la respuesta elegida con el valor de la clave correcta del ini mediante la función string_legnth()

penumbra yo tambien tenia pensado algo parecido.

[99]
pregunta="esta es la pregunta"
respuesta_1_texto="respuesta 1"
respuesta_1="verdadera"
respuesta_2_texto="respuesta 2"
respuesta_2="falsa"
respuesta_3_texto="respuesta 3"
respuesta_3="falsa"
[numero_cartas]
numero="99.000000"


me gusta mucho el orden que tienes, pero no me gusta como haces para saber cual es la correcta ya que usa la longitud de una cadena. seria bueno que en vez de usar la longitud de una cadena usara la misma respuesta. y luego comparar si los dos string son iguales, algo como:
[gml]
if r1 = correcta
{
instance_create(x,y,obj_ganar)//lo pongo asi porque el dice que cuando se gana se crea el objeto ganar
}
else
instance_create(x,y,obj_perder)
[/gml]

otra cosa, e estado testeando con los ini y se puede tener como nombre en seccion un numero usando un string(variable)

por eso, suponiendo que use un sistema random de preguntas,que el ini lo tomara de internet y que quiere poder agregar mas preguntas, prodria hacer una lectura de una seccion el ini que diga cuantas preguntas hay y a partir de ese numero hacer un round(random(valor)) para seleccionar una pregunta dentro del codigo.
no puedo creer que me hice un tumblr.
YGE Productions yep, otro tumblr.
y como no, el manual tambien

Cita de: jmbs19 en Noviembre 23, 2015, 12:00:02 AM
me gusta mucho el orden que tienes, pero no me gusta como haces para saber cual es la correcta ya que usa la longitud de una cadena.
Cuestion de gustos. Ambos métodos servirían, pero justamente, prefiero preguntar por la longitud de la cadena (o un método similar) que tener que definir dos claves más por cada pregunta en el ini. Yo me decanto por este método porque una sola clave en el ini me indica cuál es la respuesta correcta, sin necesidad de claves adicionales que indiquen las respuestas incorrectas y porque me gusta que la respuesta correcta en si misma tenga una característica de la que las otras respuestas carecen, y sólo debo buscar dicha característica.

Un método parecido sería que la clave correcta guardara una palabra clave, dicha palabra clave solamente estaría contenida en la respuesta correcta, por ejemplo, "Unity". Si la palabra clave está contenida en la cadena, la respuesta es correcta.

En cualquiera de las variaciones que propongo, se puede crear un script tipo validar_respuesta() que valide la respuesta de manera más pulcra, por ejemplo
[gml]
validar_respuesta(pregunta)
[/gml]
Y que se encarge tanto de evaluar la respuesta, como de generar los objetos obj_ganar u obj_perder, según sea el caso.

Lo bueno de todo es que siempre hay más de una manera de implementar las cosas.

Cita de: penumbra en Noviembre 23, 2015, 12:19:39 AM
Cita de: jmbs19 en Noviembre 23, 2015, 12:00:02 AM
me gusta mucho el orden que tienes, pero no me gusta como haces para saber cual es la correcta ya que usa la longitud de una cadena.
Cuestion de gustos. Ambos métodos servirían, pero justamente, prefiero preguntar por la longitud de la cadena (o un método similar) que tener que definir dos claves más por cada pregunta en el ini. Yo me decanto por este método porque una sola clave en el ini me indica cuál es la respuesta correcta, sin necesidad de claves adicionales que indiquen las respuestas incorrectas y porque me gusta que la respuesta correcta en si misma tenga una característica de la que las otras respuestas carecen, y sólo debo buscar dicha característica.

Un método parecido sería que la clave correcta guardara una palabra clave, dicha palabra clave solamente estaría contenida en la respuesta correcta, por ejemplo, "Unity". Si la palabra clave está contenida en la cadena, la respuesta es correcta.

En cualquiera de las variaciones que propongo, se puede crear un script tipo validar_respuesta() que valide la respuesta de manera más pulcra, por ejemplo
[gml]
validar_respuesta(pregunta)
[/gml]
Y que se encarge tanto de evaluar la respuesta, como de generar los objetos obj_ganar u obj_perder, según sea el caso.

Lo bueno de todo es que siempre hay más de una manera de implementar las cosas.
creo que me entendiste mal cuando te dije lo de la cadena

Citarseria bueno que en vez de usar la longitud de una cadena usara la misma respuesta. y luego comparar si los dos string son iguales, algo como:

if r1 = correcta
{
instance_create(x,y,obj_ganar)//lo pongo asi porque el dice que cuando se gana se crea el objeto ganar
}
else
instance_create(x,y,obj_perder)

pero bueno, formas de hacerlo hay muchas, sin embargo tener 100 objetos, uno por cada pregunta, eso no me parace muy eficiente, y no quiero imaginar lo dificil que seria ordenarlo o actualizarlo.
no puedo creer que me hice un tumblr.
YGE Productions yep, otro tumblr.
y como no, el manual tambien

[hola]
num=4
p1="Como uno no se complica la vida?"
r10="Atendiendo a Kostra xD"
r11="No escuchar a Kostra"
r12="Siendo chino xD"
p2="Dos mas dos?"
r20="4"
r21="22"
r22="Venticatorce"
p3="De que color es el caballo blanco de Santiago?"
r30="Blanco"
r31="Verde"
r32="Transparente"
p4="Esto es una pregunta?"
r40="Si"
r41="No"
r42="Pizza"


num es el numero total de preguntas que hay
p1 es pregunta con id 1
r10,r11,r12 es respuesta "1-0", respuesta "1-1" y respuesta "1-2"
el primer "1" es el id de la pregunta a la que corresponden y el otro numero, 0 será SIEMPRE la correcta y 1,2 serán las incorrectas, espero explicarme bien.
Lo demás a partir de p2 es lo mismo pero las siguientes, 2,3,4...

la respuesta correcta siempre será la 0 (r10,r20,r30,r40,etc), el sistema en el GM es el que ha de poner en pantalla de forma aleatoria las respuestas, así en un mismo objeto puedes poner todo...

obj_pregunta:

create:
ini_open("preguntas.ini"); //abro ini
num = ini_read_real("hola","num",1); //leo numero total de preguntas
pregnum = irandom(num)+1; //asigno un id de pregunta aleatorio, le sumo 1 porque en el ini no hay pregunta "0"
pregunta = ini_read_string("hola","p"+string(pregnum),""); //asigno la pregunta aleatoria que será p1,p2,p3 o p4 en este caso
respuesta = ini_read_string("hola",r"+string(pregnum)+"0",""); //asigno la respuesta BUENA con el mismo id que la pregunta
respuestamala1 = ini_read_string("hola",r"+string(pregnum)+"1",""); //asigno respuesta mala con el mismo id que la pregunta
respuestamala2 = ini_read_string("hola",r"+string(pregnum)+"2",""); //asigno la segunda respuesta mala


al momento de mostrar una pregunta, donde muestras las respuestas has de poner las 3 aleatoriamente entre las 3 posiciones que hay y al seleccionar una respuesta solo has de comparar si es la buena, y la buena ya la tienes en una variable... "respuesta", si no sabes hacer eso, dilo xD

primero haz el sistema evitándote los mil objetos y luego ya busca el hacer ini online... tienes varios posts que hablan sobre eso, so mismo abrí uno preguntando lo mismo, igual abrió niuweb, parece que sepone de moda los ini online xDD
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Cita de: kostra en Noviembre 23, 2015, 01:27:35 AM
primero haz el sistema evitándote los mil objetos y luego ya busca el hacer ini online... tienes varios posts que hablan sobre eso, so mismo abrí uno preguntando lo mismo, igual abrió niuweb, parece que sepone de moda los ini online xDD
no se si los ini online estan tanto asi como que moda XD, en lo personal prefiero los sql con php y la explotacion de string(exploit es una funcion en algunos lenguajes de alto nivel que separan una cadena de texto en partes a partir de un caracter especial que se encuentre en esa cadena, por ejemplo ","":"";" y cosas asi. el game maker no tiene la funcion, pero hay muchos scripts que la emulan)me parece mas seguro ya que no pueden usar mi script para subir o bajar cosas del hosting.
no puedo creer que me hice un tumblr.
YGE Productions yep, otro tumblr.
y como no, el manual tambien

#7 Noviembre 23, 2015, 12:21:32 PM Ultima modificación: Noviembre 23, 2015, 12:23:26 PM por matiascarpello
Cita de: kostra en Noviembre 23, 2015, 01:27:35 AM
[hola]
num=4
p1="Como uno no se complica la vida?"
r10="Atendiendo a Kostra xD"
r11="No escuchar a Kostra"
r12="Siendo chino xD"
p2="Dos mas dos?"
r20="4"
r21="22"
r22="Venticatorce"
p3="De que color es el caballo blanco de Santiago?"
r30="Blanco"
r31="Verde"
r32="Transparente"
p4="Esto es una pregunta?"
r40="Si"
r41="No"
r42="Pizza"


num es el numero total de preguntas que hay
p1 es pregunta con id 1
r10,r11,r12 es respuesta "1-0", respuesta "1-1" y respuesta "1-2"
el primer "1" es el id de la pregunta a la que corresponden y el otro numero, 0 será SIEMPRE la correcta y 1,2 serán las incorrectas, espero explicarme bien.
Lo demás a partir de p2 es lo mismo pero las siguientes, 2,3,4...

la respuesta correcta siempre será la 0 (r10,r20,r30,r40,etc), el sistema en el GM es el que ha de poner en pantalla de forma aleatoria las respuestas, así en un mismo objeto puedes poner todo...

obj_pregunta:

create:
ini_open("preguntas.ini"); //abro ini
num = ini_read_real("hola","num",1); //leo numero total de preguntas
pregnum = irandom(num)+1; //asigno un id de pregunta aleatorio, le sumo 1 porque en el ini no hay pregunta "0"
pregunta = ini_read_string("hola","p"+string(pregnum),""); //asigno la pregunta aleatoria que será p1,p2,p3 o p4 en este caso
respuesta = ini_read_string("hola",r"+string(pregnum)+"0",""); //asigno la respuesta BUENA con el mismo id que la pregunta
respuestamala1 = ini_read_string("hola",r"+string(pregnum)+"1",""); //asigno respuesta mala con el mismo id que la pregunta
respuestamala2 = ini_read_string("hola",r"+string(pregnum)+"2",""); //asigno la segunda respuesta mala


al momento de mostrar una pregunta, donde muestras las respuestas has de poner las 3 aleatoriamente entre las 3 posiciones que hay y al seleccionar una respuesta solo has de comparar si es la buena, y la buena ya la tienes en una variable... "respuesta", si no sabes hacer eso, dilo xD

primero haz el sistema evitándote los mil objetos y luego ya busca el hacer ini online... tienes varios posts que hablan sobre eso, so mismo abrí uno preguntando lo mismo, igual abrió niuweb, parece que sepone de moda los ini online xDD

La verdad gracias por la ayuda. Pero creo que me voy más desorientado con todo esto. No pensé que se complicara tanto. Supongo que lo de leer las preguntas de forma online analizándolo bien lo podría hacer a un lado por el momento y concentrarme en hacer que lea un ini de forma local por el momento. En cuanto al sistema que pusiste lo veo muy complejo pero no imposible de hacerlo. Será cuestión de que investigue ciertas cosas pero de momento, ¿Sabes si hay algún ejemplo en internet de tu funcionamiento para estudiarlo?

la verdad, no es tan sofisticado, puede asustarte un poco la parte donde leo con los ids, pero bueno, hoy mismo, luego te haré un ejemplo completo, no es para tanto en serio, almenos no si entiendes las funciones ini básicas...
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Cita de: kostra en Noviembre 23, 2015, 01:54:13 PM
la verdad, no es tan sofisticado, puede asustarte un poco la parte donde leo con los ids, pero bueno, hoy mismo, luego te haré un ejemplo completo, no es para tanto en serio, almenos no si entiendes las funciones ini básicas...

Si pudieras hacerme un ejemplo te lo agradecería mucho. Saludos.

me aburro, ahora mismito te lo hag y edito este post, se me olvidó el otro día sry... la cerveza.. xD
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Yo que tu haria un update. asi se actualiza todo el programa completo, menos riezgos menos bugs. en la seccion descargas hay un manual de ello.
Atentamente.-
Elvis Kelley
Mi Manual.
Mi canal de Youtube Youtube click aqui
Video tutoriales Game maker

#12 Noviembre 24, 2015, 04:35:07 AM Ultima modificación: Noviembre 24, 2015, 04:37:33 AM por kostra
bueno, no edito para que te notifique xD
aquí está el ejemplo (offline)
https://mega.nz/#!IQ80GZrL!AhAYGDQN_QPlYfHDWfr1OhL2pxwirZaKoGGOXg0HpLA

para que funciona HAS DE TENER EL ARCHIVO INI, que en esta ocasión, se me antojó llamarlo "quiz.dat", sí, .dat porque me apetecia, pero no deja de ser un ini tal y como dije en mensajes anteriores... xD

El archivo en cuestión con el cuál yo he probado (con 10 preguntas) es el siguiente:
[data]
num=10
p1="Como uno no se complica la vida?"
r10="Atendiendo a Kostra xD"
r11="No escuchar a Kostra"
r12="Siendo chino xD"
p2="Dos mas dos?"
r20="4"
r21="22"
r22="Venticatorce"
p3="De que color es el caballo blanco de Santiago?"
r30="Blanco"
r31="Verde"
r32="Transparente"
p4="Esto es una pregunta?"
r40="Si"
r41="No"
r42="Pizza"
p5="Quien es la maxima autoridad del foro?"
r50="Kostra xD"
r51="Una tortuga"
r52="hitler"
p6="Si tienes tres pelotas y se te pincha una, cuantas pelotas te quedan?"
r60="3"
r61="2"
r62="1"
p7="La raiz cuadrada de 625?"
r70="25"
r71="36"
r72="52"
p8="Cual es la mejor opcion para jugar?"
r80="MHP Labs, sin duda alguna xD"
r81="King"
r82="Una caja"
p9="Que sistema de teclado se usa en Suiza?"
r90="QWERTZ"
r91="QWERTY"
r92="QWENTIN"
p10="Esto es una pregunta"
r100="Esto la respuesta buena"
r101="Esto la respuesta mala 1"
r102="Esto la respuesta mala 2"


PD:El ejemplo quizás parece un infierno, pero el infierno es la aleatoriedad de la posición de las respuestas, confieso que me he echo un poco el lio y seguro que se puede hacer mejor y más fácil xD, lo que te dije que no era sofisticado es la lectura ALEATORIA de infinitas preguntas con sus respuestas en UN SOLO ARCHIVO. Ahí lo tienes, en el principio del create del objeto "oquestion" :B
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]

Cita de: kostra en Noviembre 24, 2015, 04:35:07 AM
bueno, no edito para que te notifique xD
aquí está el ejemplo (offline)
https://mega.nz/#!IQ80GZrL!AhAYGDQN_QPlYfHDWfr1OhL2pxwirZaKoGGOXg0HpLA

para que funciona HAS DE TENER EL ARCHIVO INI, que en esta ocasión, se me antojó llamarlo "quiz.dat", sí, .dat porque me apetecia, pero no deja de ser un ini tal y como dije en mensajes anteriores... xD

El archivo en cuestión con el cuál yo he probado (con 10 preguntas) es el siguiente:
[data]
num=10
p1="Como uno no se complica la vida?"
r10="Atendiendo a Kostra xD"
r11="No escuchar a Kostra"
r12="Siendo chino xD"
p2="Dos mas dos?"
r20="4"
r21="22"
r22="Venticatorce"
p3="De que color es el caballo blanco de Santiago?"
r30="Blanco"
r31="Verde"
r32="Transparente"
p4="Esto es una pregunta?"
r40="Si"
r41="No"
r42="Pizza"
p5="Quien es la maxima autoridad del foro?"
r50="Kostra xD"
r51="Una tortuga"
r52="hitler"
p6="Si tienes tres pelotas y se te pincha una, cuantas pelotas te quedan?"
r60="3"
r61="2"
r62="1"
p7="La raiz cuadrada de 625?"
r70="25"
r71="36"
r72="52"
p8="Cual es la mejor opcion para jugar?"
r80="MHP Labs, sin duda alguna xD"
r81="King"
r82="Una caja"
p9="Que sistema de teclado se usa en Suiza?"
r90="QWERTZ"
r91="QWERTY"
r92="QWENTIN"
p10="Esto es una pregunta"
r100="Esto la respuesta buena"
r101="Esto la respuesta mala 1"
r102="Esto la respuesta mala 2"


PD:El ejemplo quizás parece un infierno, pero el infierno es la aleatoriedad de la posición de las respuestas, confieso que me he echo un poco el lio y seguro que se puede hacer mejor y más fácil xD, lo que te dije que no era sofisticado es la lectura ALEATORIA de infinitas preguntas con sus respuestas en UN SOLO ARCHIVO. Ahí lo tienes, en el principio del create del objeto "oquestion" :B

Este trabajo es sencillamente genial. Realmente excelente. Y ojala más gente pueda hacer uso de este maravilloso ejemplo para entender su funcionamiento. AL principio no se mostraban los texto y es que me faltaba crear el archivo *.dat. Claro que dicho archivo lo tuve que crear manualmente en la ruta appdata/local/ blablabla.

Pero ahora pregunto. Como mi juego será en adroid. ¿Cómo hacer para que se cree ese archivo con toda su información de forma automática?

#14 Noviembre 24, 2015, 05:15:47 PM Ultima modificación: Noviembre 24, 2015, 05:18:46 PM por kostra
JAJAJ creeme que es una chapuza... rezo para que no lo vean gente como Clamud, Guacusio, Penumbra, etc... porque se reirán de mi JAJAJAJAJA

Vivo en "iflandia" xD

PD: traté de esforzarme en hacerlo completito porque quizás lo aproveche para hacer yo uno :B

EDITO: no lei lo ultimo de tu post

a ver... cuando hagas el ini online, no importa que no lo tenga, pues estará en tu web xDD
[spoiler="ola k ase clickarme o k ase"]la imagen no se quita xD
[/spoiler]