Introducción:
Ами тук имаме публикацията, която следва първа частВ тази ще се съсредоточим върху обработката на данните (въпроси) и ще започнем с логическата част на играта, в следващата ще завършим логиката и ще приложим времето и трите опции.
База данни:
За базата данни ще използваме u1db, която представлява база данни, която записва данните във формата JSON.
Първо нека видим какви данни трябва да запазим, имаме 1 въпрос (освен текста на въпроса би било хубаво да имаме идентификатор), с 4 възможни отговора, от които може да бъде само 1, следователно документът в JSON един въпрос трябва да бъде:
{ "id": 1, "pregunta": " habra dev.desdelinux.net ", "respuestas" : { r1: "si" , r2: "no" , r3: "no se sabe" , r4: "esto es una respuesta falsa" }, "correcta": 3 }
Както виждаме, ние сме структурирани във формат JSON където имаме идентификатор, низ с въпроса и r1, r2, които представляват отговор 1 и отговор 2, накрая имаме кой от отговорите е верен.
Нека да видим малко как работи U1db, първото нещо, което трябва да направим, за да използваме U1db, е да импортираме модула:
import U1db 1.0 as U1db
Декларираме базата данни:
U1db.Database {
id: aDatabase
path: "aU1DbDatabase"
}
Базите данни ще бъдат запазени като aU1DbDatabase.u1db, сега създаваме документ:
U1db.Document {
id: aDocument
database: aDatabase
docId: 'helloworld'
create: true
defaults: { "hello": "Hello World!" }
}
Където можем да видим формата {«здравей»: «нещо»}, да изпълняваме заявки, или да добавяме данни, да получаваме данни, да ги изтриваме и т.н. Имаме елемента U1db.Query.
Нека да отидем в нашето приложение и да създадем нашата база данни, както видяхме, дефинираме базата данни:
U1db.Database {id: db въпроси; път: "questionsdb.u1db"}
Добре, нека сега поставим някои елементи по подразбиране в документа на базата данни questionsdb:
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"} ] } }
Наясно съм, че кодът не се показва както трябва, но ако се вгледаме внимателно, ще видим, че имаме елемент preguntas, което с »[]» посочваме, че може да има няколко (те не са статични) елементи; в този случай ще имаме 4 по подразбиране, 4 въпроса със съответните им отговори.
За да получите елементите на документа JSON, можем да посочим идентификатора на документа, който сме създали (който е aДокумент). Нека си представим, че искаме да получим текста на първия въпрос:
aDocument.contents.questions [0] .question
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.
Програмиране на логиката на играта
Е, сега, когато знаем как да боравим с част от базата данни, където сме запазили въпросите, нека програмираме логиката на играта. На първо място ще създадем файл JavaScript (.js): Добавяне на нов -> Qt -> Js файл. Ще му се обадя logic.js.
Във файла ще създадем няколко функции, за да импортираме js файла в нашия qml документ:
импортирайте "logica.js" като Logica
Свързваме го с името Logica, затова, когато искаме да извикаме функция, ще го направим като Logica.funcion (), сякаш е обект, който има своите методи.
Засега, за да не стане твърде дълъг постът, ще оставим времето на въпроса и опциите за по-късно, ще се концентрираме върху въпросите и точките, нека видим функция, която ще използваме, за да преминем от въпрос:
функция nextQuestion (num) {// time = 0 question.text = aDocument.contents.questions [num] .question; resp1.text = aDocument.contents.questions [num] .r1; resp2.text = aDocument.contents.questions [num] .r2; resp3.text = aDocument.contents.questions [num] .r3; resp4.text = aDocument.contents.questions [num] .r4; }
Както виждаме, ние предаваме номера на въпроса там, където се намираме като аргумент и от тук той поставя отговорите на бутоните и етикета на въпроса. Нека да видим сега, за да проверим дали избраният отговор е верен:
хит на функция (num, опция) {var hit = false; var num_correcto = aDocument.contents.questions [num] .correct; ако (опция == правилен_ номер) хит = вярно; обратен удар; }
Кодът говори сам за себе си, в случай че избраната опция е същата като тази, предоставена от базата данни, тогава тя ще бъде вярна, в противен случай няма. Сега, когато имаме дефинирани тези функции, ще ги приложим в нашия qml код.
На първо място ще добавим променлива, която ще бъде тази, която контролира кой въпрос сме, ще я наречем num; Ще имаме и още три променливи: попадения, пропуски и точки.
property int num: 0 property int nfaults: 0 property int rođenja: 0 property int npoints: 0
Първоначално всички те са на 0.
Сега добавяме onClick към всички бутони за отговор. onClick, както казва името му, е събитие, което ще се случи при щракване върху бутона:
Бутон {id: resp1 text: "Response 1" anchors.horizontalCenter: parent.horizontalCenter width: parent.width - 20 onClicked: {if (Logic.certain (num, 1)) {num = num + 1; Logic.nextQuestion (num) npoints = npoints + 50 раждания = раждания + 1} else {nfaults = nfaults + 1}}}
Виждаме, че когато щракнете върху бутона, той проверява дали е правилен или не, ако е, добавете точките и преминете въпроса, в противен случай остава един живот.
Накрая ще направим първия въпрос за зареждане, когато компонентът на страницата се зареди:
Страница {id: pageGame Component.onCompleted: {Logic.nextPregunta (0)}
Нека да видим как се получи:
Следвам стъпките и всичко работи. Само за сътрудничество казвам, че:
* Не променя стойността на попаденията и пропуските. Трябва да добавите това към всеки бутон във вашето събитие за кликване.
* И това в реда:
if (Logic.acerto (num, 1)) {
променете 1 на номера на бутона / отговора.
lolbimbo, намирам вашия принос за интересен. Надявам се нови уроци !!!
Благодаря за споделянето.
Харесва ми, че сте коментирали тези точки, защото не дадох ясно да се разбере в публикацията, още повече, не помня точките, успехите и неуспехите, ако го погледнете ще видите, че когато натиснем бутона, добавяме точките успехите ... но те не са отразени в етикета, затова трябва да го поставим в свойството text, за да покажем точките:
Етикет {
id: неуспехи
текст: «Грешки:» + nгрешки
цвят: "червен"
}
Етикет {
id: удари
текст: «Посещения:» + род
}
Етикет {
id: точки
текст: «Точки:» + n точки
fontSize: "среден"
}
Ще го изясня и в част 3.