Bonjour ,
Pour clore mon apprentissage des bases de Qt, j'ai décidé de faire un petit jeu assez simple. Vous y avez sûrement déjà joué: vous avez les cartes, face cachée, devant vous et vous devez en retourner 2, si elles sont pareilles, vous avez gagné un point sinon vous les retournez et vous recommencez.
J'ai déjà commencé à coder la base, mais je rencontre divers problèmes que je n'arrive vraiment pas à régler (je suis débutant avec Qt aussi et c'est mon premier jeu que je fais totalement tout seul...). Les * sont là pour dire que je n'arrive pas à faire complètement cette étape.
Voici étape par étape comment fonctionne mon programme jusqu'à date:
1. Le jeu ouvre une fenêtre de type FenPrincipale qui hérite de QMainWindow. Dans le constructeur, je crée la barre de menu et je fais setCentralWidget sur un Widget qui contient un QLabel et qui ouvre une image de démarrage (qui dit bienvenu dans CartesMatchs).
2. Le joueur clique sur Partie, puis Nouvelle Partie dans la barre de menu. Cela appelle un slot perso qui commence la partie.
*3. Dans le slot, je crée 36 instances de ma classe LabelImageJeu qui hérite de QLabel et dont j'ai réécrit la fonction mousePressEvent pour pouvoir retourner mes cartes quand le joueur clique dessus(je vais expliquer plus en détails plus bas). Je veux que ces objets soient contenu dans une QList ou un QVector, car j'aurai besoin de parcourir tous mes objets plus tard. Chaque objet reçoit un nombre aléatoire entre 1 et 18 (max deux fois chaque nombre) qu'il enregistre dans un int et qui correspond à la carte qui doit être retournée quand on clique sur l'objet. Les objets sont organisés dans un QGridLayout qui est contenu dans un QWidget qui devient mon centralWidget (cela implique que je vais faire des delete pour mon ancien centralWidget).
*4. Le jeu commence et le joueur clique sur une image: la fonction mousePressEvent est appelée, on parcourt le QVector ou la QList pour voir si un des objets n'aurait pas déjà le bool retourné = true et le bool trouver = false (les deux sont initialisés à false). Si il y a 0 cas, alors on retourne la carte, on set bool retourne= true et on appelle la fonction setDerniereCarteRetourne de la FenPrincipale en lui envoyant un pointeur sur cette carte.
*5. Le joueur clique sur une autre carte, il se passe la même chose, sauf que cette fois si on a une carte déjà retourné donc c'est un autre if: on retourne la carte, set le bool retourne = true, on compare le int carte (voir numéro 3) de cet objet avec celui de la carte retournée précédemment (d'où l'intérêt du pointeur).
5.1. Si c'est pareil, on set les deux bool trouver = true et on vérifie voir si un tous les objets ont le bool trouver = true. Si oui, on appelle la fonction gagne de la FenPrincipale et on change le centralWidget pour une fenêtre où il est inscrit que vous avez gagné (donc delete des new fait dans le jeu). Sinon, on continue le jeu.
5.2. Si c'est différent, on pause le programme pour 2-3 sec et on appelle ensuite la fonction retourneCarte des deux objets pour qu'ils redeviennent avec la face cachée.
En gros c'est pas mal ça, à part des problèmes listés plus haut j'ai aussi ces problèmes: je n'arrive pas à faire que le background s'agrandit en même temps que la fenêtre (j'ai essayé une méthode, mais la fenêtre s'agrandissait toute seule sans aucun contrôle...) et je n'arrive pas à définir un background lorsque l'on joue...
Ça fait pas mal de choses, mais j'ai vraiment besoin de votre aide, car je suis désespéré là
Merci d'avance,
Sytten
mon FenPrincipale.cpp:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75 /**********Constructeur***********/ FenPrincipale::FenPrincipale() : QMainWindow() { //Initialisation d'attributs m_derniereCarte = 0; //création de la fenetre de base QWidget* zoneCentraleBase = new QWidget; QVBoxLayout* layoutImageBase = new QVBoxLayout; QLabel* labelImageBase = new QLabel(); labelImageBase->setPixmap(QPixmap(":/Images/start.jpg")); layoutImageBase->addWidget(labelImageBase); zoneCentraleBase->setLayout(layoutImageBase); /*zoneCentraleBase->setStyleSheet("background-image: url(:/Images/start.jpg);" "background-repeat: no-repeat;");*/ //création des menus QMenu *menuPartie = menuBar()->addMenu("&Partie"); QMenu *menuAide = menuBar()->addMenu("&?"); //Menu Partie QAction *actionJouer = menuPartie->addAction("Nouvelle &partie"); actionJouer->setShortcut(QKeySequence(Qt::Key_F2)); menuPartie->addSeparator(); QAction *actionOptions = menuPartie->addAction("&Options (à venir)"); actionOptions->setShortcut(QKeySequence(Qt::Key_F4)); QAction *actionStatistiques = menuPartie->addAction("&Statistiques (à venir)"); actionStatistiques->setShortcut(QKeySequence(Qt::Key_F5)); menuPartie->addSeparator(); QAction *actionQuitter = menuPartie->addAction("&Quitter"); actionQuitter->setShortcut(QKeySequence(Qt::Key_Escape)); //Menu Help QAction *actionPropos = menuAide->addAction("À propos de CartesMatchs"); actionPropos->setShortcut(QKeySequence(Qt::Key_F6)); //connections connect(actionQuitter, SIGNAL(triggered()), qApp, SLOT(quit())); connect(actionJouer, SIGNAL(triggered()), this, SLOT(nouvellePartie())); setCentralWidget(zoneCentraleBase); } /**********Lancement d'une nouvelle partie**********/ void FenPrincipale::nouvellePartie() { QList<int> nombres; srand ( time(NULL)); for(int i = 1; i < 36; i++) { nombres << i << i; } for(int i = 0; i < 36; i++) { int nombreRandom = rand()% nombres.count(); LabelImages image(nombres[nombreRandom]); nombres.removeAt(nombreRandom); listeImagesJeu.append(image); } } /**********Mettre en mémoire la dernière carte retournée**********/ void FenPrincipale::setDerniereCarte(LabelImages* derniereCarte) { m_derniereCarte = derniereCarte; }
Mon FenPrincipal.h:
mon LabelImageJeu.h:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 #ifndef FENPRINCIPALE_H #define FENPRINCIPALE_H #include "LabelImageJeu.h" #include "time.h" class FenPrincipale : public QMainWindow { Q_OBJECT public: FenPrincipale(); void setDerniereCarte(LabelImages* derniereCarte); LabelImages dernierCarte(); public slots: void nouvellePartie(); private: LabelImages* m_derniereCarte; QList<LabelImageJeu> listeImagesJeu; }; #endif // FENPRINCIPALE_H
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 #ifndef LABELIMAGEJEU_H #define LABELIMAGEJEU_H #include <QtGui> class LabelImageJeu : public QLabel { public: LabelImageJeu(int numeroImage); void mousePressEvent(QMouseEvent *event); private: bool m_trouver; bool m_voitFace; int m_numeroImage; }; #endif // LABELIMAGEJEU_H
Partager