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


Structure d'une carte

Une carte de jeu est caractérisée par :

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


}