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());


}