Sunteți pe pagina 1din 24

MemoryGame

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.

Performan ajuc torului

Performanaatinsdejuctorestestabilitn
funcieintervaluldetimpulncaresencadreaz
utilizatoruldelanceputuljoculuipnlafinele
acestuia, ?i de numarul ct mai mic de Moves.
Adic, pentru obinerea unei performane ct mai

mari trebuie s se evite deschiderea aceleia?i


imaginidemaimulteori,ceeacepoatefirealizat
prin memorarea poziiei acesteia ca s se poat
revenilaeadup gsireaidenticuluiacesteia.Ca
?icriteriudeperforman??ajuc?toruluiintervine
?itimpul,rolulacestuifiindascoateneviden??
capacitatea de memorare ntrun interval de timp
ctmaimic.

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

Back to Menu are ca efect revenirea la meniul


principal, prin schimbarea strii de la
startStatelanormalState.

Go to Menu are ca efect revenirea la meniul


principalprintrecerealastareanormalState.
Exit>Qt.quit();

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"
}
}

S-ar putea să vă placă și