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?
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()
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.
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.
[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
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.
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...
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
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.
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
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?
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
Cita de: kostra en Noviembre 24, 2015, 05:15:47 PM
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
Lo que pasa es que ahora estoy dándome cuenta que sería mejor evitar el ini online para que el usuario no tenga que estar permanentemente conectado a internet. De última cuando quiera actualizar las preguntas si lo podré hacer con un botón para que actualice el quiz.dat viejo. O en el peor de los casos actualizo el APK pero por lo menos me evito tener que hacer un objeto para cada pregunta.
o puedes bajar un set nuevo de preguntas una sola vez, cada vez que se conecte y abra el juego, y que, si por ejemplo, no tiene internet despues de un par de intesto se rinda y arranque con el que ya tiene guardado
solo tienes que conectar una vez al inicio del juego, que verifique si hay actualización o no, si la hay descarga el nuevo ini sino, pues no, y si no tiene conexión, pues nada, se queda con el ini que tenía antes, eso no es problema :3
Este tuto te ayudará a hacer tal cosa ;)
https://www.youtube.com/watch?v=6erhvsbBr-o
a mí me ayudó :B
Cita de: kostra en Noviembre 24, 2015, 05:48:30 PM
solo tienes que conectar una vez al inicio del juego, que verifique si hay actualización o no, si la hay descarga el nuevo ini sino, pues no, y si no tiene conexión, pues nada, se queda con el ini que tenía antes, eso no es problema :3
Este tuto te ayudará a hacer tal cosa ;)
https://www.youtube.com/watch?v=6erhvsbBr-o
a mí me ayudó :B
Muchas gracias por todo. De verdad lo digo. Soy diseñador gráfico así que si algún día necesitas ayuda con algo referente a eso no dudes en pedírmelo. Saludos desde Argentina.
Pues ya puedes ir contactándome pero YA!!! xD
PD: coloca [Solucionado] en el inicio del titulo del post si así es
PD2: Sin absolutamente ningún ánimo de ofender, simplemente me ha hecho gracia y quería decírtelo para que rías tú también... pero hace un momento lei tu nick mal y me dió la impresión de que decia "Masca mi pelo" XDD