У цій другій частині ми побудуємо логіку програми (щоб краще побачити та проаналізувати код, щоб поглянути на нього повністю, і я розміщу його під постом), але перед цим нам потрібно буде встановити бібліотеки sqlite3, які ми будемо використовувати для збереження запитань та відповідей на них:
sudo apt-get install libsqlite3-dev
Після встановлення бібліотек нам знадобиться лише "використання Sqlite;" щоб мати можливість використовувати sqlite у vala.
Нам потрібно буде створити таблицю, яка містить:
Питання
Відповідь 1
Відповідь 2
Відповідь 3
Відповідь 4
правильно
приклад:
Pregunta = es desdelinux un buen blog?
Відповідь1 = що блогу не існує
Відповідь2 = ні
Відповідь3 = так
Відповідь4 = привіт
як ми всі знатимемо правильну відповідь 2 (хороший - 3)
правильно = 3
Щоб створити таблицю та обробити її, нам потрібно знати sql (ви можете шукати його в улюбленій пошуковій системі), оператор для створення таблиці:
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);
Гаразд, отримайте запитання (відсортоване випадково):
SELECT pregunta, respuesta1, respuesta2, respuesta3, respuesta4, correcto FROM preguntas ORDER BY RANDOM()
Відкриття бази даних:
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 ());
}
Якщо у нас його вже не створено (перший раз, коли ми запускаємо код), він створить сам.
Створіть таблицю та вставте запитання:
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); } } }
Переконайтесь, що помилки немає:
if (ec! = Sqlite.OK) {stderr.printf ("Помилка:% s \ n", errmsg); повернення -1; }
Ми створимо 6 рядків, які допоможуть нам призначити запитання та відповіді.
приватний рядок p; приватний рядок r1; приватний рядок r2; приватний рядок r3; приватний рядок r4; приватний рядок c;
Розміщення запитання (яке ми отримуємо з test.db) за допомогою SELECT:
private void bd_select_questions () {string query = "ВИБІР запитання, відповіді1, відповіді2, відповіді3, відповіді4, виправлення ІЗ запитань ЗАМОВИТИ НА СЛУЧАЙНИЙ ()"; int rc = db.prepare_v2 (запит, -1, вихід stmt, нуль); int cols = stmt.column_count (); rc = stmt.step (); int col; if (rc == Sqlite.ROW) {for (col = 0; col <cols; col ++) {рядок txt = stmt.column_text (col); якщо (col == 0) {p = txt; } інакше якщо (col == 1) {r1 = txt; } інакше якщо (col == 2) {r2 = txt; } інакше якщо (col == 3) {r3 = txt; } інакше якщо (col == 4) {r4 = txt; } ще {c = txt; } // друк ("% s =% s \ n", stmt.column_name (col), txt); }}}
Поставте питання до графічних елементів:
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);
}
Оцініть:
private void puntua () {
this.punts = this.punts + 50;
this.puntos.set_label(this.punts.to_string());
}
Спробуйте, якщо відповідь правильна:
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");
});
Логіка часу, як ми бачили в попередньому дописі, нам потрібно лише додати if, який підтверджує, що час, якщо він досягне 1, ми даємо відповідь як неправильну:
Компілювати (ми додаємо –pkg sqlite3)
valac -v lol.vala --pkg gtk+-3.0 --pkg sqlite3
Створення трьох кнопок (50%, Freeze, Pass):
Ми створюємо новий горизонтальний Gbox і додаємо до нього три кнопки, додаємо цей Gbox до вже створеного нами:
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);
Повний код: http://paste.desdelinux.net/4882
Щиро дякую за підручник, дуже цікавий для нас, хто хоче розпочати з чогось простого, мені знадобиться додаткова допомога у частині створення таблиць даних. Ура
Дуже добре! Добре пояснені та детально. Дякуємо за дані. (і)
Дякую людино! Дуже цікавий як перший.
Було б непогано побачити різні додаткові екземпляри, коментарі до типу (ті спливаючі вікна) або меню (наберіть ті панелі, які відображаються в елементарній або оболонці gnome) ...
Правда дуже добра.
Ми читаємо: =)