Mélangeur de cartes
Un autre exemple plus abouti utilisant l'interface graphique.
L'algorithme général est le suivant (le jeu mélangé s’appellera final):
DEBUT
Initialiser le jeu de référence (sabot)
Copier le jeu sabot dans un jeu intermédiaire (intermédiaire)
POUR i=0 à 52
FAIRE
aleat=nombre aléatoire compris entre 0 et taille du jeu intermédiaire
final[i] = intermediaire[aleat]
retirer la carte aleat du jeu intermédiaire
FIN POUR
FIN
Création de l'application
- Dans QT Creator choisir Fichier/Nouveau Fichier ou Projet
- On prendra une application Qt avec Widgets
- notre application s'appellera melangecarte et sera composée d'une fenêtre mainwindow et d'un fichier de ressources cartes
Structure d'une carte
Une carte de jeu est caractérisée par :
- un nom de type QString
- un fichier d'image de type QString
- une valeur de type int
Cette structure constituera un type carte_s déclarée dans le l'entête
Interface graphique
L'interface graphique dispose de deux QLabel qui permettra de mettre en évidence le mélange des cartes et de deux boutons qui permettent de mélanger puis d'afficher séquentiellement les cartes des deux tas (cartes triées et non triées)
Les cartes sont enregistrées dans un fichier de ressources :
Pourquoi des tableaux ?
Chaque tas (sabot, intermédiaire et final) est un tableau composé de 52 cartes au maximum décrites par la structure carte_s.
le sabot et le jeu final disposent toujours de 52 cartes. Nous utiliserons un tableau statique.
Le tableau intermédiaire verra son nombre de cartes augmenter puis diminuer, il faudra donc prendre un tableau dynamique de la classe QVector
Le fichier d'entête (mainwindow.h)
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
//type de carte avec son nom, son image et sa valeur
typedef struct carte_s
{
char nom;
QString image;
int valeur;
} cartes ;
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
//void assurant le mélange des cartes
void initialisationSabot();//créé le jeu de carte
void copieTableau();
void melangerSabot();
//Déclaration des trois tableaux
carte_s sabot[52];//Sabot de cartes.
carte_s final[52]; //notre tableau final
QVector<carte_s> intermediaire; //notre tableau intermédiaire
int num_carte;//numero de la carte affichée sur la fenêtre
private slots: //slot de gestion des clics sur les boutons
void on_bouton_clicked();
void on_nextBtn_clicked();
private:
Ui::MainWindow *ui;
};
#endif // MAINWINDOW_H
Le fichier main.cpp
Classique il n'est pas à modifier
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Le fichier qui fait tout : mainwindow.cpp
#include "mainwindow.h"
#include "ui_mainwindow.h"
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
initialisationSabot(); //initialise le sabot
ui->setupUi(this);
}
//--------------------------------------------------------------------------------------------------------------------------------------------------------
MainWindow::~MainWindow()
{
delete ui;
}
//---------------------------------------------------------------------------------------------------------------------------------------------------------
void MainWindow::initialisationSabot()
{ //cette procedure affecte les propriétés des 52 carte. Une partie du code a été enlevé
char rang[13]={'1','2','3','4','5','6','7','8','9','X','V','D','R'}; // X=10, V=Valet, D=Dame, R=Roi
sabot[0].nom=rang[0];
sabot[0].image=":/cartes/Image_cartes/01.BMP";
sabot[0].valeur=1;
sabot[1].nom=rang[1];
sabot[1].image=":/cartes/Image_cartes/02.BMP";
sabot[1].valeur=2;
sabot[2].nom=rang[2];
sabot[2].image=":/cartes/Image_cartes/03.BMP";
sabot[2].valeur=3;
.............................................................
..............................................................
sabot[49].nom=rang[10];
sabot[49].image=":/cartes/Image_cartes/50.BMP";
sabot[49].valeur=10;
sabot[50].nom=rang[11];
sabot[50].image=":/cartes/Image_cartes/51.BMP";
sabot[50].valeur=10;
sabot[51].nom=rang[12];
sabot[51].image=":/cartes/Image_cartes/52.BMP";
sabot[51].valeur=10;
}
//----------------------------------------------------------------------------------------------
void MainWindow::copieTableau()
{ //cette procedure copie les cartes du sabot dans le tableau dynamique
//(append rajoute une nouvelle carte à la fin du jeu)
for (int i=0;i<52;i++)
intermediaire.append(sabot[i]);
}
//----------------------------------------------------------------------------------------------
void MainWindow::melangerSabot()
{ //une valeur aleatoire est générée qui permet de désigner une carte dans le jeu
//cette carte est affectée au jeu final puis retirée du jeu intermédiaire pour éviter les doublons
int aleatoire;
int a=0;
while (intermediaire.size()>1) //tant que le tableau dynamique n'est pas vide
{
aleatoire=rand()%intermediaire.size(); //génère un nombre entre 0 et la taille du tableau
final[a]=intermediaire[aleatoire]; //on place la valeur aléatoire
intermediaire.remove(aleatoire); //on supprime du tableau intermédiaire la valeur
a++; //enregistrement suivant
}
}
//----------------------------------------------------------------------------------------------
void MainWindow::on_bouton_clicked()
{ //enclenchement du mélange du jeu
copieTableau();//on initialise les tableaux
melangerSabot();//on melange
ui->trieeLbl->setPixmap(QPixmap(sabot[0].image.toStdString().c_str()));
qDebug(sabot[0].image.toStdString().c_str());
ui->melangeLbl->setPixmap(QPixmap(final[0].image.toStdString().c_str()));
qDebug(final[0].image.toStdString().c_str());
//on affiche les valeurs de final
num_carte=0;
}
//----------------------------------------------------------------------------------------------
void MainWindow::on_nextBtn_clicked()
{ //affiche les cartes suivantes
if (num_carte<51)
num_carte++;
else
num_carte=0;
ui->trieeLbl->setPixmap(QPixmap(sabot[num_carte].image.toStdString().c_str()));
qDebug(sabot[num_carte].image.toStdString().c_str());
ui->melangeLbl->setPixmap(QPixmap(final[num_carte].image.toStdString().c_str()));
qDebug(final[num_carte].image.toStdString().c_str());
}