Documente Academic
Documente Profesional
Documente Cultură
Memory Game
Memory Game
Autor:BbluPetru
MemoryGame esteunjoc,careeraprezent by
default petelefoaneleNokiaanilor'902000,care
esteorganizatpemaimultenivelededificultate.
Ideea jocului este s se deschid pe rnd cte o
imaginedintrore eaformat dinmaimulteimagini.
Deschidereaconsecutivadouaimaginicenucoincid
ducelanchidereaacestora.Memornduseimaginile
deschise anterior se pune drept scop deschiderea
consecutivaadouaimaginicesuntidentice,astfel
acestea ramn deschise realiznduse o pereche.
Joculseterminaatuncicndafostdeschis toat
reeaua.
Performanaatinsdejuctorestestabilitn
funcieintervaluldetimpulncaresencadreaz
utilizatoruldelanceputuljoculuipnlafinele
acestuia, ?i de numarul ct mai mic de Moves.
Adic, pentru obinerea unei performane ct mai
Organizareapenivelededificultate
MemoryGameesteorganizatpemaimultenivele
de dificultate, n cazul de fa: Easy, Medium ?i
Hard. Principiul care st la baza organizrii pe
acesteniveleestedimensiuneareeleideimagini.
Cu ct mai multe elemente conine reeaua cu att
cre?teniveluldedificultate.
Delacesapornit.SurseWeb.
Sursa:
http://www.developer.nokia.com/Community/Wiki/A_QML_Memory_Game_Tutorial
Principiuldebaz alorganizriicoduluin
pagin?ialelementelorQMLaleaplica?ieiaufost
preluatenmarepartedinsursaindicatmaisus.
FunciilejavadinfiierulmyScript.jsaufost
preluate din aceast surs, ulterior modificate,
pentru ca jocul s poat fi organizat pe cele 3
nivelededificultate.
Ceenoufa desursaweb?
IdeeajoculuiMemoryGame,dinsursaweb,a
fost pstrat, n schimb utilizatorului i sa dat
libertatea de a alege nivelul de dificultate la
careardoris joace.Deasemenea,utilizatorului
i este pus la dispoziie un cronometru i un
contoralnumaruluideimaginiaccesate.Lafinalul
joculuiesten?tiin?atdetimpulctajucat?ide
numrul de mutri, apoi poate s revin la meniul
principalprinapsareabutonuluiGotoMenu.
n fi?ierul Button.qml a fost definit
elementulButton,cuscopuldeafiscrismaipuin
cod n cadrul fi?ierului Menu.qml, dar ?i a
aplicaiei.
Designul ?i definirea elementului de baz? a
reelei (Gridului) au fost modificate, pentru a
mbuntiaplicaiadinpunctdevedereestetic.
Descriereexecu ie
Meniul principal al aplicaiei conine patru
butoane:Easy,Medium,Hard?iExit.
Mainmenu
Accesareabutoanelor:
EasyprinsemnalulstartEasySignal()sencepe
joculdenivelEasy.
MediumstartMediumSignal()nivelMedium
HardstartHardSignal()nivelHard
ListingCod
main.cpp
#include<QtGui/QApplication>
#include<QtDeclarative/QDeclarativeView>
#include<QtDeclarative/QDeclarativeContext>
#include<QDeclarativeEngine>
intmain(intargc,char**argv){
QApplicationapp(argc,argv);
QDeclarativeViewview;
view.setSource(QUrl::fromLocalFile("content/test2.qml"));
QObject::connect(view.engine(),SIGNAL(quit()),&app,SLOT(quit()));
view.show();
returnapp.exec();
}
mainwindow.h
#ifndefMAINWINDOW_H
#defineMAINWINDOW_H
#include<QtGui/QMainWindow>
classMainWindow:publicQMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget*parent=0);
~MainWindow();
};
#endif//MAINWINDOW_H
mainwindow.cpp
#include"mainwindow.h"
MainWindow::MainWindow(QWidget*parent)
:QMainWindow(parent)
{
}
MainWindow::~MainWindow()
{
}
myScript.js
functioninit(nr){
moves=0
card1=1
card2=1
parCount=0
miliseconds=0
remaining=nr/2
}
functionstartGame(nr){
init(nr)
for(vari=0;i<nr;i++){
grid.children[i].state="back"
}
main.state='startState';
console.log("Thegameisbegginning");
randomize(nr);
}
functionrandomize(nr){
if(nr==8){
sortedArray=['0','1','2','3','0','1','2','3']
}
if(nr==16){
varsortedArray=
['0','1','2','3','4','5','6','7','0','1','2','3','4','5','6','7']
}
if(nr==30){
varsortedArray=
['0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','0','1','2','3',
'4','5','6','7','8','9','10','11','12','13','14']
}
vardate=newDate()
varmils=date.getMilliseconds()
for(vari=0;i<nr;i++){
varlocated=false
while(!located){
varrandomnumber=Math.floor((Math.random()*mils)%nr)
varcontent=sortedArray[randomnumber]
if(content!=''){
grid.children[i].num=content
sortedArray[randomnumber]=''
located=true;
}
}
}
}
functionopen(index){
moves++
grid.children[index].state=""
if(card1==1){
card1=index
}
else{
if(index==card1)return
card2=index
grid.enabled=false
closeTimer.start()
}
}
functionvalidatePar(){
varparNumber1=grid.children[card1].num
varparNumber2=grid.children[card2].num
varstate="back"
//Ifcardsareequaltheyareremoved
if(parNumber1==parNumber2){
state="open"
remaining//onelesscardtofind
}
grid.children[card1].state=state
grid.children[card2].state=state
//restablishinitialvalues
card1=1
card2=1
grid.enabled=true
parCount++
if(remaining==0){
main.state="finishState"
console.log("GameFinished")
}
}
functioncalculateElapsedTime(){
miliseconds+=1000
vardate=newDate(miliseconds)
varseg=date.getUTCSeconds()
seg=seg>9?seg:'0'+seg
varmins=date.getUTCMinutes()
mins=mins>9?mins:'0'+mins
elapsedTimeText.text=mins+":"+seg
}
test2.qml
importQtQuick1.0
import"myScript.js"asScript
Rectangle{
id:main
width:800
height:660
color:"darkgreen"
propertyintcard1
propertyintcard2
propertyintparCount
propertyintmiliseconds//milisecondselapsedonthegame
propertyintremaining
propertyintnr
propertyintmoves:0
Text{
id:timeText
text:"Time:"
...
}
Timer{
id:elapsedTimer
interval:1000
running:false
onTriggered:Script.calculateElapsedTime()
repeat:true
}
Text{
id:movesText
text:"Moves:"+moves
...
}
Button{
id:menuButton
text:"BacktoMenu"
radius:3
anchors.bottom:parent.bottom
anchors.right:parent.right
visible:false
onClicked:{main.state="normalState"}
}
Menu{
id:menu
onStartEasySignal:{
nr=8;
Script.startGame(nr);
}
onStartMediumSignal:{
nr=16;
Script.startGame(nr);
}
onStartHardSignal:{
nr=30;
Script.startGame(nr);
}
}
Grid{
id:grid
columns:{
if(nr==8||nr==16)
4
else
6
}
...
Repeater{
model:nr
Tile{image:"pics/"+num+".png"
angle:180
yAxis:1
onSelect:Script.open(index)
}
}
}
EndGame{
id:endGame
visible:false
}
Timer{
id:closeTimer
interval:800
onTriggered:Script.validatePar()
}
states:[
State{
name:"normalState"
PropertyChanges{
}
...
},
State{
name:"startState"
...
},
State{
name:"finishState"
...
}
}
Button.qml
importQtQuick1.0
Rectangle{
signalclicked
propertystringtext
id:container
width:200
height:60
radius:10
border.width:4
border.color:"red"
gradient:Gradient{
GradientStop{
position:0.0
color:"red"
}
GradientStop{
position:1.0
color:"darkred"
}
}
Text{
id:containerText
text:container.text
anchors.centerIn:parent
color:"white"
font.bold:true
font.pointSize:20
MouseArea{
id:buttonMouseArea
anchors.fill:parent
onClicked:container.clicked()
}
}
Tile.qml//Sursahttp://doc.qt.nokia.com/QML Flipable
Flipable{
id:container
propertyaliasimage:frontImage.source
propertyboolflipped:true
propertyintxAxis:0
propertyintyAxis:0
propertyintangle:0
propertystringnum:'0'
signalselect
width:front.width;height:front.height
front:Image{id:frontImage;smooth:true;}
back:Image{source:"pics/back.png";smooth:true}
state:"back"
Element
MouseArea{
id:containerArea
anchors.fill:parent
onClicked:{
container.select()
}
}
transform:Rotation{
id:rotation;origin.x:container.width/2;origin.y:container.height/2
axis.x:container.xAxis;axis.y:container.yAxis;axis.z:0
}
states:[State{
name:"back";when:container.flipped
PropertyChanges{target:rotation;angle:container.angle}
},
State{
name:"open"
PropertyChanges{
target:rotation;angle:0
}
PropertyChanges{
target:containerArea
enabled:false
}
}
]
transitions:Transition{
ParallelAnimation{
NumberAnimation{target:rotation;properties:"angle";duration:200
}
SequentialAnimation{
NumberAnimation{target:container;property:"scale";to:0.75;
duration:200}
NumberAnimation{target:container;property:"scale";to:1.0;
duration:200}
}
}
}
}
Menu.qml
importQtQuick1.0
Item{
id:menu
width:450
height:350
anchors.centerIn:parent
signalstartEasySignal
signalstartMediumSignal
signalstartHardSignal
Rectangle{
id:menuRect
anchors.fill:parent
color:"white"
radius:10
Column{
id:menuButtons
anchors.centerIn:parent
spacing:15
Button{
id:startEasyButton
text:"Easy"
onClicked:{menu.startEasySignal();}
}
...
Button{
id:exitButton
text:"Exit"
onClicked:Qt.quit()
}
}
}
}
EndGame.qml
importQtQuick1.0
Rectangle{
width:450
height:350
anchors.centerIn:parent
radius:10
Text{
anchors.horizontalCenter:parent.horizontalCenter
anchors.top:parent.top
anchors.topMargin:60
text:"YourTime:"+elapsedTimeText.text
font.pointSize:20
color:"darkred"
Text{
anchors.horizontalCenter:parent.horizontalCenter
anchors.top:parent.top
anchors.topMargin:90
text:"Moves:"+moves
font.pointSize:20
color:"darkred"
Button{
id:endButton
anchors.centerIn:parent
text:"GotoMenu"
onClicked:main.state="normalState"
}
}