IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

distribution de cartes


Sujet :

C

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Par défaut distribution de cartes
    bonjour, je suis un étudiant en DUT réseaux et télécommunication et j'ai un mini projet à réaliser qui est le jeux de dame de pique en langage C. Je ne suis pas un adepte de ce langage =) et donc je rame légèrement sur ceci. Donc j'aimerai de l'aide afin de réaliser ce mini projet. Tout d'abord, j'ai fait ma SDL pour afficher les carte sur mon tapis mais :

    1- comment faire pour éviter 52 répétition des variable pour les cartes ? faire une boucle serai le mieux je pense !

    2- comment faire pour distribuer les cartes en random ?

    voila ci vous pouvez m'aidez cela serai d'une très grande aide.

    merci d'avance. Cordialement Cyril

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 499
    Par défaut
    Bonjour et bienvenue,

    Citation Envoyé par cyril85190 Voir le message
    1- comment faire pour éviter 52 répétition des variable pour les cartes ? faire une boucle serai le mieux je pense !
    Oui, une boucle for(;;). Elle fonctionne comme en Java ou un certain nombre d'autres langages (les boucles sont aussi vieilles que l'informatique mais cette syntaxe en particulier est celle du C, à la base).

    Tu peux utiliser un tableau. Exemple : « int a[10] » déclare en mémoire dix variables de type int indexées de 0 à 9. Donc « a[0] », « a[1] », « a[2 », etc. sont autant de variables différentes, comme si tu avais déclaré « a », « b », « c », etc. L'avantage, c'est que l'index au milieu peut être n'importe quelle expression évaluable comme un nombre entier naturel…*y compris une autre variable, tu peux donc écrire par exemple :

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        int i = 0;
        int a[10] = { 0 };
     
        for (i=0;i<10;i++) printf ("Valeur de la case numéro %d : %d\n",i,a[i]);

    2- comment faire pour distribuer les cartes en random ?
    Il existe la fonction rand() pour tirer des nombres au hasard. Le mieux étant ensuite de représenter chaque carte par un numéro entre 0 et 51.

  3. #3
    Membre averti Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Par défaut
    pour ton random de 52 cartes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #include <time.h>
    ....
    void main()
    {
    srand((unsigned int) time (0)); // initialisation de la fonction srand
    int numeroCarte;
     
    numeroCarte =  rand() % 52; // Tire des chiffres entre 0 et 51 soit 52 cartes
    }

  4. #4
    Membre éprouvé
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juillet 2009
    Messages
    122
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Juillet 2009
    Messages : 122
    Par défaut
    Le problème de rand pour tirer des cartes, c'est que cette fonction fonctionne comme un tirage "avec remise". Autrement dit, deux appels successifs à rand peuvent retourner le même résultat (et donc la même carte...).

    Pour le jeu de la dame de pique, toutes les cartes doivent être distribuées. Il faudrait plutôt tirer une permutation aléatoire des 52 cartes et les distribuer dans l'ordre permuté. Ce n'est qu'une option parmi d'autres...

  5. #5
    Membre averti Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Par défaut
    Ou alors il suffit de mettre à la fin la case du tableau tirer .... et de retirer 1 au rand() à chaque fois .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     void DecalerUneCase(short indice) /* indice = Numero_De_La_Case_A_Mettre_a_La_Fin*/ 
    {
     
       for (i = 1; i < TailleDuTableau ; i++ , indice++)
       {
     
           Tab[indice] = Tab[indice+1]; /* On passe à la valeure Tab[X] du tableau la valeur Tab[X+1]*/
       }
    }
    ET :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    void main()
    {
    TirageCarte(i);
    /*{
       numeroCarte = rand() % i ;
    return numeroCarte;
    }*/
     
    DecalerUneCase(X);  
    i--;  
     
    }

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Par défaut
    ok merci je vais essayé tout cela je vous tien au courant. merci encore de votre aide

  7. #7
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Par défaut
    bonjour, donc voila j'ai un autre problème mais avec la SDL .

    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
     while (continuer)
          {
          SDL_WaitEvent(&event);
          switch(event.type)
          {
            case SDL_QUIT:
                continuer = 0;
                break;
     
            case SDL_MOUSEBUTTONUP:
            if (event.button.button == SDL_BUTTON_RIGHT)
                break;
     
                continuer=0;
          }
          } 
     
          SDL_FreeSurface(imageDeFond); /* On libère la surface */
          SDL_Quit();
    j'aimerai lorsque j'appui sur l'image cela m'enmène sur un autre menu.

    si vous voulez plus d'information je vous metterai plus de mon programme.

    merci d'avance. Cordialement Cyril

  8. #8
    Membre averti Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    typedef struct
    {
        int menu;
        int game;
        int option;
        int quit;
     
    }MENU;
    dans le main:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    MENU menu;
     
        menu.menu = 1;
        menu.option = 0;
        menu.game = 0;
        menu.quit = 0;
     
        while(menu.quit == 0)
        {
            menu_principal(&menu);
            option(&menu);
            game(&menu);
        }

    Puis dans tes fonctions :
    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
     
    void menu_principal(MENU *menu)
    {
         while(menu->menu == 1)
         {
         /* code
         si on clique sur fermer exit(0);
         si on clique sur le bouton jouer menu->menu = 0; menu->game =1;
         ects*/
         }
    }
     
    //Et dans game:
     
    void game(MENU *menu)
    {
         while(menu->game == 1)
         {
         /* code
         si on clique sur fermer exit(0);
         si on clique sur le bouton retour menu principal menu->menu = 1; menu->game =0;
         ects*/
         }
    }
     
    void options(MENU *menu)
    {
         while(menu->options == 1)
         {
         /* code
         si on clique sur fermer exit(0);
         si on clique sur le bouton options, menu->menu = 0; menu->options =1;
         ects*/
         }
    }
    Merci à Kannagi pour ce code qui m'avais bien aidé

  9. #9
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Par défaut
    merci de ta réponse mais je ne vais pas changer mon programme car c'est un peux compliqué pour moi ^^. je vous met mon programme complet pour que vous puissiez comprendre.

    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
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
     
    void pause()
    {
        int continuer = 1;
        SDL_Event event;
     
        while (continuer)
        {
            SDL_WaitEvent(&event);
            switch(event.type)
            {
                case SDL_QUIT:
                    continuer = 0;
            }
        }
    }
     
    int main(int argc, char *argv[])
    {
          SDL_Surface *ecran = NULL, *imageDeFond = NULL, *jouer = NULL, *damepique = NULL, *pique1 = NULL, *titredame = NULL, *quitter = NULL;
          SDL_Rect positionFond, positionjouer, positiondamepique, positionpique1, positiontitredame, positionquitter;
          SDL_Event event;
          int continuer = 1;
     
          positionFond.x = 0;
          positionFond.y = 0;
          positionjouer.x = 280;
          positionjouer.y = 270;
          positiondamepique.x = 500;
          positiondamepique.y = 380;
          positionpique1.x = 80;
          positionpique1.y = 350;
          positiontitredame.x = 230;
          positiontitredame.y = 50;
          positionquitter.x = 350;
          positionquitter.y = 425;
     
          SDL_Init(SDL_INIT_VIDEO);
          ecran = SDL_SetVideoMode(722, 608, 32, SDL_HWSURFACE);
     
          SDL_WM_SetCaption("Chargement d'images en SDL", NULL);
     
          imageDeFond = IMG_Load("menu.jpg");                         /* Chargement d'une image Bitmap dans une surface */
          SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);   /* On blitte par-dessus l'écran */
     
          jouer = IMG_Load("jouer.jpg");
          SDL_BlitSurface(jouer, NULL, ecran, &positionjouer);
     
          damepique = IMG_Load("dame_pique.jpg");
          SDL_BlitSurface(damepique, NULL, ecran, &positiondamepique);
     
          pique1 = IMG_Load("pique1.jpg");
          SDL_BlitSurface(pique1, NULL, ecran, &positionpique1);
     
          titredame = IMG_Load("titre_dame.jpg");
          SDL_BlitSurface(titredame, NULL, ecran, &positiontitredame);
     
          quitter = IMG_Load("quitter.jpg");
          SDL_BlitSurface(quitter, NULL, ecran, &positionquitter);
     
          SDL_Flip(ecran); //mise à jour de l'écran
     
          while (continuer)
          {
          SDL_WaitEvent(&event);
          switch(event.type)
          {
            case SDL_QUIT:
                continuer = 0;
                break;
     
            case SDL_MOUSEBUTTONUP:
            if (event.button.button == SDL_BUTTON_RIGHT)
                break;
     
                continuer=0;
          }
          } 
     
          SDL_FreeSurface(imageDeFond); /* On libère la surface */
          SDL_Quit();
     
          return EXIT_SUCCESS;
    }
    j'aimerai pouvoir cliquer sur "Jouer maintenant" et arriver sur une autre interface graphique. voila j'éspère que cela va vous aidez.

    merci d'avance Cyril

  10. #10
    Membre averti Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Par défaut
    Il y a pas grand chose à changer pour ça....
    c'est la seule solution que je connais ..

  11. #11
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Par défaut
    bonjour, donc j'ai réussi ma SDL . mais maintenant j'ai le problème pour distribuer les cartes , certes j'ai eu des explications aux dessus mais je n'est pas compris ^^. J'aimerai faire un distribution de mes cartes en SDL sur mon plateau, mes cartes je les est nommées 00,01,02,03,04,...,51.

    voila un morceau de mon programme auquel j'aimerai le rattacher :

    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
    #include <stdio.h>
    #include <stdlib.h>
    #include <SDL/SDL.h>
    #include <SDL/SDL_image.h>
     
     
    int afficherDistribution()
    {
     
        SDL_Surface *ecran = NULL, *imageDeFond = NULL, *cartes1 = NULL;
        SDL_Rect positionFond, positioncartes1;
     
        positionFond.x = 0;
        positionFond.y = 0;
     
        SDL_Init(SDL_INIT_VIDEO);
        ecran = SDL_SetVideoMode(700, 700, 32, SDL_HWSURFACE);
     
        SDL_WM_SetCaption("Chargement d'images en SDL", NULL);
     
        imageDeFond = IMG_Load("plateau.jpg");                      /* Chargement d'une image Bitmap dans une surface */
        SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);   /* On blitte par-dessus l'écran */
     
        SDL_Flip(ecran); //mise à jour de l'écran
     
        pause();
     
        SDL_FreeSurface(imageDeFond); /* On libère la surface */
        SDL_Quit();
     
            return EXIT_SUCCESS;
    merci d'avance de votre aide, Cyril.

  12. #12
    Membre averti Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Par défaut
    Bah tu as juste à faire un:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SDL_BlitSurface(carte[X] , NULL, ecran, &positionCarte[x]);
    Je vois pas où il y a une difficulté là

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Par défaut
    bonjour, =) je suis désolé je ne vois pas comment faire avec ta fonction que tu m'a donné. il faut que je déclare toute les cartes pour la SDL ? car je veux distribuer mes carte en SDL.

    Ceci est mon plataeu :

    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
    int afficherDistribution()
    {
     
        SDL_Surface *ecran = NULL, *imageDeFond = NULL, *cartes1 = NULL;
        SDL_Rect positionFond, positioncartes1;
     
        positionFond.x = 0;
        positionFond.y = 0;
     
        SDL_Init(SDL_INIT_VIDEO);
        ecran = SDL_SetVideoMode(700, 700, 32, SDL_HWSURFACE);
     
        SDL_WM_SetCaption("Chargement d'images en SDL", NULL);
     
        imageDeFond = IMG_Load("plateau.jpg");                      /* Chargement d'une image Bitmap dans une surface */
        SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);   /* On blitte par-dessus l'écran */
     
        SDL_Flip(ecran); //mise à jour de l'écran
     
        pause();
     
        SDL_FreeSurface(imageDeFond); /* On libère la surface */
        SDL_Quit();
     
            return EXIT_SUCCESS;       
    }
    et j'aimerai un fonction qui distribue les cartes mais avec mes images de cartes.

    merci d'avance, Cyril.

  14. #14
    Membre averti Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Par défaut
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unsigned short TirageCarte(unsigned short i) // i = 52 dans ton cas
    {
      unsigned short numeroCarte = 0;
      numeroCarte = rand() % i ;
    return numeroCarte;
    }
    2)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void DecalerUneCase(unsigned short indice) /* indice = Numero_De_La_Case_A_Mettre_a_La_Fin*/ 
    {
     
       for (i = 1; i < 52  ; i++ , indice++)
       {
     
           Tab[indice] = Tab[indice+1]; /* On passe à la valeure Tab[X] du tableau la valeur Tab[X+1]*/
       }
    }
    et ta fonction :
    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
    int afficherDistribution()
    {
     unsigned short i=52 , numCarte=0;
        SDL_Surface *cartes[52] = {0} , *ecran=NULL, *imageDeFond = NULL;
    
       SDL_Rect positionFond, positionCarte[52];
      imageDeFond = IMG_Load("plateau.jpg");  
      cartes[1]=SDL_LoadBMP("AS de COEUR.bmp");
      cartes[2] =.... etc
    
     
        positionFond.x = 0;
        positionFond.y = 0;
     
        SDL_Init(SDL_INIT_VIDEO);
        ecran = SDL_SetVideoMode(700, 700, 32, SDL_HWSURFACE);
     
        SDL_WM_SetCaption("Chargement d'images en SDL", NULL);
        SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond); 
      
     SDL_BlitSurface(cartes[numCarte=TirageCarte(i)] , NULL, ecran, &positionCarte[Se_que_tu_veux ]); 
       DecalerUneCase(numCarte);
        SDL_Flip(ecran); //mise à jour de l'écran
           
        pause();
                      
        SDL_FreeSurface(imageDeFond); /* On libère la surface */
        SDL_Quit();
        
            return EXIT_SUCCESS;       
    }

  15. #15
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Par défaut
    merci à toi royal380 de ton aide =).

    J'ai fait comme tu as dit mais lorsque je clique sur "Donner les cartes" et bien j'ai aucun cartes qui s'affiche, mais lorsque que je remplace le i dans la fonction
    TirageCarte et bien il m'affiche un carte mais pas au hasard.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    unsigned short TirageCarte(unsigned short i) // i = 52 dans ton cas
    {
      unsigned short numeroCarte = 0;
      numeroCarte = rand() % 2 ;
      return numeroCarte;
    }
    lorsque je met rand ()% 2 et bien cela m'affiche l'As de carreau car mon As de carreau correspond au "0" en JPG, le 2 de carreau au "1", ...

    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
    unsigned short TirageCarte(unsigned short i)        // i = 52 dans ton cas
    {
      unsigned short numeroCarte = 0;
      numeroCarte = rand() % 2;
      return numeroCarte;
    }
     
     
    void DecalerUneCase(unsigned short indice)        /* indice = Numero_De_La_Case_A_Mettre_a_La_Fin*/ 
    {
         int i;
         char Tab[52];
     
       for (i = 1; i < 52  ; i++ , indice++)
       {
     
           Tab[indice] = Tab[indice+1];               /* On passe à la valeure Tab[X] du tableau la valeur Tab[X+1]*/
       }
    }
     
    int afficherDistribution()
    {
        unsigned short i=52 , numCarte=0;
        SDL_Surface *cartes[52] = {0} , *ecran=NULL, *imageDeFond = NULL;
        SDL_Rect positionFond, positionCarte[52];
     
        SDL_Init(SDL_INIT_VIDEO);
        ecran = SDL_SetVideoMode(700, 700, 32, SDL_HWSURFACE);
     
        positionFond.x = 0;
        positionFond.y = 0;
        positionCarte[0].x = 100;
        positionCarte[0].y = 100;
     
        SDL_WM_SetCaption("Dame de Pique", NULL);
     
        imageDeFond = IMG_Load("images/plateau.jpg");
        SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);
     
        cartes[1] = IMG_Load("images/0.jpg");
        cartes[2] = IMG_Load("images/1.jpg");
        cartes[3] = IMG_Load("images/2.jpg");
        cartes[4] = IMG_Load("images/3.jpg"); 
        cartes[5] = IMG_Load("images/4.jpg");
        cartes[6] = IMG_Load("images/5.jpg");; 
        cartes[7] = IMG_Load("images/6.jpg");
        cartes[8] = IMG_Load("images/7.jpg");
        cartes[9] = IMG_Load("images/8.jpg"); 
        cartes[10] = IMG_Load("images/9.jpg");
     
        SDL_BlitSurface(cartes[numCarte=TirageCarte(i)] , NULL, ecran, &positionCarte[0]); 
        DecalerUneCase(numCarte);
     
        SDL_Flip(ecran); //mise à jour de l'écran
     
        pause();
     
        SDL_FreeSurface(imageDeFond); /* On libère la surface */
        SDL_Quit();
     
            return EXIT_SUCCESS;       
    }
    Je cherche comment faire pour avoir une carte prise au sort et l'afficher mais j'aimerai le faire 13 fois et quelles soit côte à côte.

    Merci d'avance Cyril

  16. #16
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Qu'est-ce que c'est que cette fonction ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void DecalerUneCase(unsigned short indice) /* indice = Numero_De_La_Case_A_Mettre_a_La_Fin*/ 
    {
       int i;
       char Tab[52];    
       for (i = 1; i < 52  ; i++ , indice++)
       {
           Tab[indice] = Tab[indice+1]; /* On passe à la valeure Tab[X] du tableau la valeur Tab[X+1]*/
       }
    }
    1- Au mieux, cette fonction ne fait rien que perdre du temps :
    Elle ne modifie qu'un tableau local, même pas initialisé donc qui en plus contient n'importe quoi. Ceci ne modifie rien en dehors de la fonction qui n'a aucun effet de bord.

    2- De toute façon, elle fait planter le programme sauf dans un cas :
    La boucle for est exécutée 51 fois , donc l'indice du tableau Tab va varier de "valeur initiale de indice" à "valeur initiale de indice"+50+1 ce qui ne laisse comme possibilité pour ne pas dépasser les 52 éléments de Tab que "valeur initiale de indice" == 0. Sinon, ça plante.

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2011
    Messages : 8
    Par défaut
    bonjour donc voila mon programme à pas trop mal avancé =), mais j'ai un problème. j'ai fait un serveur qui envoie aléatoirement 13 numéros (chaque numéro correspond a une carte) à 4 joueurs. Donc j'affiche en SDL les cartes que reçoivent les joueurs mais cela ne fonction pas.

    ceci est une partie de mon programme : la distribution des cartes en SDl mais je ne vois pas ou cela cloche.

    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
    int afficherDistribution(CARTE jeu[13])
     
    {
        unsigned short numCarte=0;
        SDL_Surface *cartes[13] = {0} , *ecran=NULL, *imageDeFond = NULL;
        SDL_Rect positionFond, positionCarte[13];
     
        SDL_Init(SDL_INIT_VIDEO);
        ecran = SDL_SetVideoMode(700, 700, 32, SDL_HWSURFACE);
        int j,i;
        char images[20];
     
        positionFond.x = 0;
        positionFond.y = 0;
        positionCarte[0].x = 200;
        positionCarte[0].y = 300;
     
        SDL_WM_SetCaption("Dame de Pique", NULL);
     
        imageDeFond = IMG_Load("images/plateau.jpg");
        SDL_BlitSurface(imageDeFond, NULL, ecran, &positionFond);
     
        for (j=0;j<13;j++)
        { 
     
            sprintf(images,"images/%d.jpg",jeu[j].numero);
            cartes[j] = IMG_Load(images);  
            SDL_BlitSurface(cartes[j], NULL, ecran, &positionCarte[j]); 
            positionCarte[j++].x = positionCarte[j].x + 50;
            positionCarte[j++].y =  positionCarte[j].y;
        }
     
        SDL_Flip(ecran); //mise à jour de l'écran
     
        pause();
     
        SDL_FreeSurface(imageDeFond); /* On libère la surface */
        SDL_Quit();
     
            return EXIT_SUCCESS;       
    }
    j'aimerai afficher mes 13 cartes que je reçois par le serveur et les mettre côtes à côtes.
    Si vous voulez plus de renseignement dit le moi =).

    Merci d'avance Cyril.

  18. #18
    Membre averti Avatar de royal380
    Homme Profil pro
    Apprenti Ingénieur
    Inscrit en
    Mai 2011
    Messages
    56
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Apprenti Ingénieur

    Informations forums :
    Inscription : Mai 2011
    Messages : 56
    Par défaut
    Je n'ai pas le temps de regarder tout de suite mais pour répondre a Diogene,

    Qu'est-ce que c'est que cette fonction ?
    C'était en gros une idée pour réaliser un tirage sans remise, maintenant j'ai pas jamais dit que ce que j'avais écris marchait, à lui de faire 2, 3 modifs pour que ça fonctionne

  19. #19
    Inactif  
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 123
    Par défaut idée
    Bonjour,
    Si vous voulez je peux vous proposer une distribution de cartes en random.

    L'idée de base est que le random n'est qu'un générateur de nombres pseudo-aléatoires. Cela signifie que le random n'est pas équilibré, que les cartes données ne sont pas toutes equivalentes par rapport à celles non choisies.
    Le mieux pour distribuer les cartes, c'est de faire ceci:
    • un mélange des cartes en random() : cela veut dire une permutation de deux cartes prises au hasard et cela multiplié par un nombre assez grand, 1000 par exemple.
    • une chaîne statique, ABCDEFG...jusqu'à 52 caractères (prenez les minuscules avec).
    • mélanger vous-même cette chaine et indiquez la en dur dans votre programme
    • tirez au hasard dans cette chaîne
    • le i-ème caractère obtenu dans la chaîne est le i-ème caractère dans le tableau des cartes

    Il y a bien entendu, une multitude de variantes.

Discussions similaires

  1. distribution de carte aléatoire
    Par philoupe dans le forum Débuter
    Réponses: 6
    Dernier message: 20/06/2011, 18h34
  2. Réponses: 0
    Dernier message: 05/02/2008, 11h41
  3. Réponses: 1
    Dernier message: 19/05/2007, 22h30
  4. Programme de distribution de cartes
    Par charleshbo dans le forum C++
    Réponses: 1
    Dernier message: 10/02/2006, 16h43

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo