Tässä toisessa osassa rakennamme sovelluksen logiikan (jotta voimme nähdä ja analysoida koodin paremmin tarkastellakseni sitä kokonaisuudessaan, että laitan sen viestin alle), mutta ennen sitä meidän on asennettava sqlite3-kirjastot, joita käytämme voidaksemme tallentaa kysymykset ja vastaukset niihin:
sudo apt-get install libsqlite3-dev
Kun kirjastot on asennettu, tarvitsemme vain "käyttäen Sqlite;" pystyä käyttämään sqlite valassa.
Meidän on luotava taulukko, joka sisältää:
kysymys
Vastaus 1
Vastaus 2
Vastaus 3
Vastaus 4
oikea
esimerkiksi:
Pregunta = es desdelinux un buen blog?
Vastaus1 = kyseistä blogia ei ole olemassa
Vastaus2 = ei
Vastaus3 = kyllä
Vastaus4 = hei
koska me kaikki tiedämme oikean vastauksen on 2 (hyvä on 3)
oikea = 3
Taulukon luomiseksi ja sen käsittelemiseksi meidän on tiedettävä sql (voit etsiä sitä suosikkihakukoneestasi), lause taulukon luomiseksi:
CREATE TABLE preguntas (pregunta TEXT, respuesta1 TEXT, respuesta2 TEXT, respuesta3 TEXT, respuesta4 TEXT, correcto INT);
Lisää kysymyksiä…:
INSERT INTO preguntas (pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto) VALUES ('es desdelinux un buen blog', 'no es ningun blog', 'no', 'si', 'hola', 3);
Ok, nyt saat kysymyksen (lajiteltu satunnaisesti):
SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()
Tietokannan avaaminen:
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 ());
}
Jos meillä ei ole sitä jo luotu (ensimmäisen kerran suoritamme koodin), se luo itsensä.
Luo taulukko ja lisää kysymyksiä:
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); } } }
Tarkista, ettei virheitä ole:
if (ec! = Sqlite.OK) {stderr.printf ("Virhe:% s \ n", virhe); paluu -1; }
Luomme 6 merkkijonoa, jotka auttavat meitä tekemään kysymyksiä ja vastauksia.
yksityinen merkkijono p; yksityinen merkkijono r1; yksityinen merkkijono r2; yksityinen merkkijono r3; yksityinen merkkijono r4; yksityinen merkkijono c;
Kysymyksen (jonka saamme test.db: ltä) sijoittaminen SELECTilla:
private void bd_select_questions () {merkkijono kysely = "VALITSE kysymys, vastaus1, vastaus2, vastaus3, vastaus4, korjaa kysymyksistä Tilauksen satunnaisuus ()" int rc = db.prepare_v2 (kysely, -1, out stmt, null); int cols = keskimääräinen sarakemäärä (); rc = stmt.step (); int col; jos (rc == Sqlite.ROW) {for (col = 0; col <cols; col ++) {merkkijono txt = stmt.column_text (col); jos (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; } // tulosta ("% s =% s \ n", stmt.column_name (col), txt); }}}
Laita kysymys graafisiin elementteihin:
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);
}
Hinta:
private void puntua () {
this.punts = this.punts + 50;
this.puntos.set_label(this.punts.to_string());
}
Kokeile, onko vastaus oikea:
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");
});
Aikalogiikka, kuten näimme edellisessä viestissä, meidän on lisättävä vain, jos se vahvistaa, että annamme vastauksen virheellisenä ajan, jos se saavuttaa 1:
Käännä (lisäämme –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3
Kolmen painikkeen luominen (50%, Freeze, Pass):
Luomme uuden vaakasuoran Gbox-levyn ja lisätään kolme painiketta, lisätään tämä Gbox jo luomaamme:
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);
Koko koodi: http://paste.desdelinux.net/4882
Paljon kiitoksia opetusohjelmasta, erittäin mielenkiintoinen niille meistä, jotka haluavat aloittaa jollakin yksinkertaisella. Tarvitsisin lisää apua tietotaulukoiden luomisessa. Kippis
Oikein hyvä! Hyvin selitetty ja yksityiskohtainen. Kiitos tiedoista. (ja)
Kiitos, kaveri! Erittäin mielenkiintoinen ensimmäisenä.
Olisi hyvä nähdä erilaiset täydentävät instanssit, tyyppikommentit (tällaiset ponnahdusikkunat) tai valikot (kirjoita paneelien elementit, jotka näkyvät alkeis- tai tonttu-kuoressa) ...
Totuus, erittäin hyvä.
Luemme: =)