Introducciรณn:
Bien aquรญ tenemos el post que sigue a la primera parte, en este vamos a centrarnos en manejar los datos (preguntas), y empezaremos con la parte de la lรณgica del juego, en el prรณximo acabaremos la lรณgica y implementaremos el tiempo y las 3 opciones.
Base de datos:
Para la base de datos usaremos U1db, que se trata de una base de datos que guarda los datos en formato JSON.
Primero de todoย veamos que datos debemos guardar, tenemos 1 pregunta (aparte del texto de la pregunta estarรญa bien tener un identificador), con 4 posibles respuestas, de las cuales solo 1 lo puede ser, por lo tanto el documento en JSON de una sola pregunta deberรญa ser:
{ "id": 1, "pregunta": " habra dev.desdelinux.net ", "respuestas" : { r1: "si" , r2: "no" , r3: "no se sabe" ,ย r4: "esto es una respuesta falsa" }, "correcta": 3 }
Como vemos hemos estructurado en formato JSON donde tenemos un identificador, un string con la pregunta y r1,r2 que representan la respuesta 1 y respuesta 2, finalmente tenemos cuรกl de las respuestas es la correcta.
Veamos un poco como funciona U1db, lo primero que tenemos que hacer para usar U1db es importar el mรณdulo:
import U1db 1.0 as U1db
Declaramos la base de datos:
U1db.Database {
id: aDatabase
path: "aU1DbDatabase"
}
Las base de datos serรก guardada como aU1DbDatabase.u1db, ahora creamos un documento:
U1db.Document {
id: aDocument
database: aDatabase
docId: 'helloworld'
create: true
defaults: { "hello": "Hello World!" }
}
Donde podemos ver el formato { ยซhelloยป : ยซalgoยป }, para ejecutar querys, ya sea para agregar datos, obtener datos, borrarlos etc. Tenemos el elemento U1db.Query.
Vamos a nuestra aplicaciรณn y a crear nuestra base de datos, como hemos visto definimos la base de datos:
U1db.Database { id: preguntasdb; path: "preguntasdb.u1db" }
Bien, ahora pongamos unos elementos por defecto en el documento de la base de datos preguntasdb:
ย ย ย U1db.Document { ย ย ย ย ย ย ย id: aDocument ย ย ย ย ย ย ย database: preguntasdb ย ย ย ย ย ย ย docId: 'preguntas' ย ย ย ย ย ย ย create: true ย ย ย ย ย ย ย defaults: { "preguntas": ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย [ ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย {"pregunta":"Habra dev.desdelinux.net ?",ย "r1":"si", "r2":"no", "r3":"nose", "r4":"respuesta falsa", "correcta": "3" }, ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย {"pregunta":"Quien es hagrid (harry potter) ?", "r1":"El vicedirector de la escuela", "r2":"El guardabosques", "r3":"El profesor de transformaciones", "r4":"Un prefecto", "correcta": "2"}, ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย {"pregunta":"ยฟCรบal es la capital de Islandia?", "r1":"Amsterdam", "r2":"Reykjavik", "r3":"Tiflis", "r4":"Almaty", "correcta": "2"} ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ] } ย ย ย }
Soy consciente de que el cรณdigo no se muestra como deberรญa, pero si nos fijamos veremos que tenemos un elemento preguntas, el cual con los ยป [ ] ยป especificamos que pueden haber varios (no son estรกticos) elementos; en este caso ya tendremos a 4 por defecto, 4 preguntas con sus respectivas respuestas.
Para conseguir los elementos del documento JSON, podemos especificar el identificador del documento que hemos creado (que es aDocument). Imaginemos que queremos obtener el texto de la primera pregunta:
aDocument.contents.preguntas[0].pregunta
Esta lรญnea de cรณdigo nos retorna el contenido de pregunta del documento aDocument, del elemento 0 (el primero del รญndice), que es: ยซHabra dev.desdelinux.net?ยป. Si ponemos en el รญndice el nรบmero 1, entonces seรกa la segunda pregunta.
Programando la lรณgica del juego
Bien, ahora que ya sabemos manejar un poco la base de datos donde tenemos guardado las preguntas, vamos a programar la lรณgica del juego. Primero de todo crearemos un archivo JavaScript (.js):ย Add new -> Qt -> Js File. Lo llamarรฉ logica.js.
En el archivo vamos a crear varias funciones, para importar el fichero js en nuestro documento qml:
import "logica.js" as Logica
Le asociamos el nombre Logica, por lo tanto cuando queremos llamar una funciรณn lo haremos como Logica.funcion(), como si de un objeto el cual tiene sus mรฉtodos se tratara.
De momento, para que el post no se haga muy largo, dejaremos el tiempo de la pregunta y las opciones para mรกs adelante, nos concentraremos en las preguntas y los puntos, veamos una funciรณn que haremos servir para pasar de pregunta:
function nextPregunta(num) { ย ย ย //tiempo = 0 ย ย ย pregunta.text = aDocument.contents.preguntas[num].pregunta; ย ย ย resp1.text = aDocument.contents.preguntas[num].r1; ย ย ย resp2.text = aDocument.contents.preguntas[num].r2; ย ย ย resp3.text = aDocument.contents.preguntas[num].r3; ย ย ย resp4.text = aDocument.contents.preguntas[num].r4; }
Como vemos, le pasamos como argumento el nรบmero de pregunta donde estamos y a partir de aquรญ pone las respuestas a los botones y al label la pregunta. Veamos ahora para validar si la respuesta seleccionada es correcta:
function acierto(num, opcion) { ย ย ย var acierto = false; ย ย ย var num_correcto = aDocument.contents.preguntas[num].correcta; ย ย ย if (opcion == num_correcto) acierto = true; ย ย ย return acierto; }
El cรณdigo habla por sรญ solo, en caso que la opciรณn elegida sea igual que la que nos proporciona la base de datos, entonces serรก cierta, en caso contrario no. Ahora que ya tenemos estas funciones definidas, las aplicaremos en nuestro cรณdigo qml.
Primero de todo aรฑadiremos una variable que serรก la que controle en que pregunta estamos, la llamaremos num; tambiรฉn tendremos tres variables mรกs: aciertos,fallos y puntos.
ย ย ย property int num: 0 ย ย ย property int nfallos: 0 ย ย ย property int naciertos: 0 ย ย ย property int npuntos: 0
Inicialmente estรกn todos a 0.
Ahora agregamos un onClick a todos los botones de respuestas. onClick, como dice su nombre, es un evento que pasarรก cuando se dรฉ click a dicho boton:
ย ย ย ย ย ย ย ย ย ย ย Button { ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย id: resp1 ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย text: "Respuesta 1" ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย anchors.horizontalCenter: parent.horizontalCenter ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย width: parent.width - 20 ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย onClicked: { ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย if(Logica.acierto(num,1)){ ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย num = num + 1; ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย Logica.nextPregunta(num) ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย npuntos = npuntos + 50 ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย naciertos = naciertos + 1 ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย else { ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย nfallos = nfallos + 1 ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย ย ย ย ย ย ย } ย ย ย ย ย ย ย ย ย ย ย }
Vemos que al darle click al botรณn, comprueba si es el correcto o no, en caso de que sรญ lo sea suma los puntos y pasa de pregunta, en caso contrario resta una vida.
Por รบltimo haremos que la primera pregunta se cargue cuando se cargue el componente Page:
ย ย ย Page { ย ย ย ย ย ย ย id: pageJuego ย ย ย ย ย ย ย Component.onCompleted: { ย ย ย ย ย ย ย ย ย ย ย Logica.nextPregunta(0) ย ย ย ย ย ย ย }
Veamos como ha quedado:
Voy siguiendo los pasos y funciona todo. Solo para colaborar digo que:
* No cambia el valor de los aciertos y fallos. Hay que agregar eso en cada botรณn en su evento click.
* Y que en la linea:
if(Logica.acierto(num,1)){
hay que cambiar el 1 por el numero del botรณn/respuesta.
lolbimbo, me parece interesante tu aporte. Espero nuevos tutos!!!
Gracias por compartir.
Me gusta que hayas comentado estos puntos por que no lo deje claro en el post, es mรกs, no me acorde de los puntos, los aciertos y fallos, si lo miras veras que cuando le damos al boton si que sumamos los puntos los aciertos… pero no se reflejan en el Label, eso es por que tenemos que ponerle en su propiedad text que muestre los puntos:
Label {
id: fallos
text: ยซFallos: ยป + nfallos
color: ยซredยป
}
Label {
id: aciertos
text: ยซAciertos: ยป + naciertos
}
Label {
id: puntos
text: ยซPuntos: ยป + npuntos
fontSize: ยซmediumยป
}
Igualmente lo aclarare en la 3 parte.