En esta segunda parte construiremos la lógica de la aplicación (para ver y analizar el código mejor mirarlo completo que lo pondré abajo del post), pero antes de eso necesitaremos instalar las librerías sqlite3 que usaremos para poder guardar las preguntas y sus respectivas respuestas:
sudo apt-get install libsqlite3-dev
Una ves instaladas las librerías solo necesitaremos un «using Sqlite;» para poder usar sqlite en vala.
Necesitaremos crear una Tabla que contenga:
Pregunta
Respuesta1
Respuesta2
Respuesta3
Respuesta4
correcta
ejemplo:
Pregunta = es desdelinux un buen blog?
Respuesta1 = no existe ese blog
Respuesta2 = no
Respuesta3 = si
Respuesta4 = hola
como todos sabremos la respuesta correcta es la 2 (na la buena es la 3)
correcta = 3
Para crear la tabla y manejarla necesitaremos saber sentencias sql (podéis buscarlo en vuestro buscador favorito), sentencia para crear la tabla:
CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);
Insertar preguntas … :
INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('es desdelinux un buen blog', 'no es ningun blog', 'no', 'si', 'hola', 3);
Bien ahora obtener una pregunta (ordenadas de forma random) :
SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()
Abriendo la base de datos:
int ec = Sqlite.Database.open ("test.db", out db);
if (ec != Sqlite.OK) {
stderr.printf ("Can't open database: %d: %s\n", db.errcode (), db.errmsg ());
}
En caso que no la tengamos ya creada (primera vez que ejecutamos el código) se creara sola.
Crear la tabla y inserir preguntas:
private void bd () { string errmsg; // Abre la base de datos / Crea la base de datos int ec = Sqlite.Database.open ("test.db", out db); if (ec != Sqlite.OK) { stderr.printf ("Can't open database: %d: %s\n", db.errcode (), db.errmsg ()); } if (!FileUtils.test ("test.db", FileTest.IS_REGULAR)) { string query = """ CREATE TABLE preguntas ( pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT ); INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('es desdelinux un buen blog', 'no es ningun blog', 'no', 'si', 'hola', 3); INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('5+5', '25', '10', '3', '5', 2); """; ec = db.exec (query, null, out errmsg); if (ec != Sqlite.OK) { stderr.printf ("Error: %s\n", errmsg); } } }
Comprobar que no hay error:
if (ec != Sqlite.OK) { stderr.printf ("Error: %s\n", errmsg); return -1; }
Crearemos 6 string que nos ayudaran a hacer la asignación de preguntas y respuestas.
private string p; private string r1; private string r2; private string r3; private string r4; private string c;
Colocando una pregunta (que obtenemos de test.db) con un SELECT:
private void bd_select_preguntas () { string query = "SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()"; int rc = db.prepare_v2 (query, -1, out stmt, null ); int cols = stmt.column_count(); rc = stmt.step (); int col; if ( rc == Sqlite.ROW ) { for (col = 0; col < cols; col++) { string txt = stmt.column_text(col); if(col == 0){ p = txt; } else if(col == 1){ r1 = txt; } else if(col == 2){ r2 = txt; } else if(col == 3){ r3 = txt; } else if(col == 4){ r4 = txt; } else{ c = txt; } //print ("%s = %s\n", stmt.column_name (col), txt); } } }
Colocar la pregunta a los elementos graficos:
private void next_pregunta () {
this.pregunta.set_label(this.p);
this.resposta1.set_label(this.r1);
this.resposta2.set_label(this.r2);
this.resposta3.set_label(this.r3);
this.resposta4.set_label(this.r4);
}
Puntuar:
private void puntua () {
this.punts = this.punts + 50;
this.puntos.set_label(this.punts.to_string());
}
Tratar si es correcta la respuesta:
private void correcto (string cor) {
if (this.c == cor) {
this.puntua ();
this.bd_select_preguntas ();
this.next_pregunta();
}
else{
//incorrecto
}
}
resposta1.clicked.connect (() => {
this.correcto("1");
});
resposta2.clicked.connect (() => {
this.correcto("2");
});
resposta3.clicked.connect (() => {
this.correcto("3");
});
resposta4.clicked.connect (() => {
this.correcto("4");
});
Lógica del tiempo, como ya vimos en el anterior post solo tenemos de añadir un if que compruebe que el tiempo si este llega a 1 damos como incorrecta la respuesta :
Compilar (le añadimos –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3
Creando tres botones (50%, Congelar, Pasar):
Creamos un nuevo Gbox horizontal y le añadimos los tres botones, añadimos este Gbox al que ya teníamos creado:
this.box2 = new Gtk.Box (Gtk.Orientation.HORIZONTAL, 0);
var button1 = new Gtk.Button.with_label ("50%");
var button2 = new Gtk.Button.with_label ("congelar");
var button3 = new Gtk.Button.with_label ("passar");
this.box2.pack_start(button1);
this.box2.pack_start(button2);
this.box2.pack_start(button3);
Código completo: http://paste.desdelinux.net/4882
Muchas gracias por el tutorial, muy interesante para los que queremos empezar con algo sencillo, necesitaría mas ayuda con la parte de creación de las tablas de datos. saludos
Muy bueno! Bien explicado y detallado. Gracias por la data. (y)
Gracias man! Interesantísimo como el primero.
Estaría bueno ver las diversas instancias complementarias, tipo comentarios (esos tipo pop ups) o menues (tipo los de los paneles que salen en elementary o gnome-shell)…
La verdad, muy bueno.
Nos leemos :=)