[C] Tri d'un jeu de cartes

Lab7 -  
mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,

J'essaie de faire un programme qui affiche toutes les cartes d'un jeu de carte. J'affiche mes cartes, je les brasse, tout ca va bien. Mais lorsque je veux retrier mes cartes, gros problèmes!!! Mes cartes sont trié par couleurs (coeur,carreau,pique,trèfle), mais les valeurs sont toute mélanger soit : 2 2 2 2 3 3 3 3 4 4 4 4 etc. Alors si quelqu'un peux m'aider. Voici le Code:
//------------------------------------------------------------------------------
//   Nom       : Carte.c
//   Auteur    : Frédérick Lebel
//   Date      : 21/03/2006
//   But       : Manipuler un jeu de cartes
//   Remarques : ...
//------------------------------------------------------------------------------

#include <conio.h>
#include <stdlib.h>
#include <ctype.h>
#include <windows.h>


#define AFFICHE 'A'
#define BRASSE 'B'
#define CLOCHE '\a'
#define TRI 'T'
#define FIN 27


enum Couleur {Coeur=3, Carreau, Trefle, Pique};
enum Valeur {Deux=2, Trois, Quatre, Cinq, Six, Sept, Huit, Neuf, Dix, Valet, Dame, Roi, As};
struct Carte {
    enum Valeur valeur;
    enum Couleur couleur;
};


void fullscreen(void);
void initialiseJeu(struct Carte jeu []);
void afficheJeu(struct Carte jeu []);
void brasseJeu(struct Carte jeu []) ;
void triJeu(struct Carte jeu []) ;
int menu(void) ;

int main(int argc, char* argv[])
{
    struct Carte carte, jeuCarte[52];
    int choix;

    fullscreen();
    randomize();
    initialiseJeu(jeuCarte);
    do {
        choix = menu();
            switch(choix) {
                case AFFICHE : putch(choix);
                               getch();
                               clrscr();
                               afficheJeu(jeuCarte);
                               getch();
                               break;
                case BRASSE  : putch(choix);
                               getch();
                               brasseJeu(jeuCarte);
                               break;
                case TRI     : putch(choix);
                               getch();
                               triJeu(jeuCarte);
                               break;
                case FIN     : break;
                default      : putch(CLOCHE);
            }
    } while (choix != FIN);
    //afficheJeu(jeuCarte);
    //system("pause");
    return 0;
}
void initialiseJeu(struct Carte jeu []) {
    int i = 0;
    enum Couleur c;
    enum Valeur v;
    for(c = Coeur;c <= Pique;c++)
    {
        for(v = Deux;v <= As;v++)
        {
            jeu[i].couleur = c;
            jeu[i].valeur = v;
            i++;
        }
    }
}
void afficheJeu(struct Carte jeu []) {
    int i = 0;
    enum Couleur c;
    enum Valeur v;

    for(c = Coeur;c <= Pique;c++)
    {
    /*  if(jeu[i].couleur==Coeur || jeu[i].couleur==Carreau)
            textcolor(RED);
        else
            textcolor(BLACK);  */
        for(v = Deux;v <= As;v++)
        {
            switch(jeu[i].valeur)
            {
                case Valet: cprintf("%3c",'J');
                    break;
                case Dame: cprintf("%3c",'D');
                    break;
                case Roi: cprintf("%3c",'R');
                    break;
                case As: cprintf("%3c",'A');
                    break;
                default : cprintf("%3d",jeu[i].valeur);
                    break;
            }
            cprintf("%c",jeu[i].couleur);
            i++;
        }
        cputs("\n\r");
    }
}

void brasseJeu(struct Carte jeu []) {
      struct Carte c;
      int i, j;
      for(i=0; i<52;i++){
            j= random(52);
            c= jeu[i];
            jeu[i] = jeu[j];
            jeu[j] = c;
      }
}
void triJeu(struct Carte jeu []) {
    int i   = 0;
    int j   = 0;
    int tmp = 0;
    int permut;

    permut = 1;
    for(i = 0 ; (i < 4) && permut==1; i++)
    {
        permut = 0;
        for(j = 1 ; j < 13 ; j++)
        {
            if(jeu[j].couleur < jeu[j-1].couleur)
            {
                tmp = jeu[j-1].couleur;
                jeu[j-1].couleur = jeu[j].couleur;
                jeu[j].couleur = tmp;
                permut = 1;
            }
            else if(jeu[j].valeur < jeu[j-1].valeur)
            {
                tmp = jeu[j-1].valeur;
                jeu[j-1].valeur = jeu[j].valeur;
                jeu[j].valeur = tmp;
                permut = 1;
            }

        }
    }

}
int menu(void) {
    int touche;

    clrscr();
    gotoxy(33,5);
    cputs("Jeu de Cartes");
    gotoxy(25,10);
    cputs("Affiche le jeu de cartes");
    cputs("(A)");
    gotoxy(25,15);
    cputs("Brasse le jeu de cartes");
    cputs("(B)");
    gotoxy(25,20);
    cputs("Tri le jeu de cartes");
    cputs("(T)");
    gotoxy(25,25);
    cputs("Fin du programme");
    cputs("(Esc)");
    gotoxy(35,40);
    cputs("Choix:");
    touche = toupper(getch());
    return touche;
}
void fullscreen(void) {
    keybd_event(VK_MENU,0x38,0,0);
    keybd_event(VK_RETURN,0x1c,0,0);
    keybd_event(VK_RETURN,0x1c,KEYEVENTF_KEYUP,0);
    keybd_event(VK_MENU,0x38,KEYEVENTF_KEYUP,0);
    window(0,0,80,50);
}

//------------------------------------------------------------------------------
A voir également:

1 réponse

mamiemando Messages postés 33778 Date d'inscription   Statut Modérateur Dernière intervention   7 884
 
Je pense que le mieux serait d'utiliser la fonction qsort, qui prend en paramètre un pointeur sur une fonction définissant la relation d'ordre définissant la notion de jeu trié.

http://www.hmug.org/man/3/qsort.php

Dans ton cas les void * sont en fait des (struct Carte *).

Bonne chance
0