Jeu de poker

Kadjarnn Messages postés 13 Statut Membre -  
[Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   -
Bonjour a tous
Enfait je suis entrain de créé un programme qui simule une partie de poker avec 32 cartes j'ai créé un typedef struc pour stoker le variable couleur et le signe
De même j'ai créé une fonction pour genere le 32 carte .
Mon probleme se situé au niveau de la création d'un jeu de carte pour la partie enfaite j'ai affecte a un tableau de typedef la fonction que j'ai créer dans une boucle mais le probleme pendat l'affichage j'ai des doublons de même carte j'ai vous demende un aide svp car cela ca fait plusieurs jour que j'ai suis bloque

3 réponses

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    OK, c'est donc un exercice.

    Dans ton énoncé
    enrjeux32
    contient ton jeu de 32 cartes. D'abord, crée ce tableau avec toutes les cartes dans l'ordre des couleurs et des valeurs. A ce stade, ton paquet de cartes est complet, mais il n'est pas encore correctement initialisé car il n'est donc pas mélangé.

    Puis, mélange ton paquet (avec l'algorithme de Yates-shuffle, par exemple, qui opère des permutations successives aléatoirement). Dès lors, pour tirer une carte au hasard, il te suffira de prendre les cartes une par une dans l'ordre du tableau. Avec cette méthode, pas besoin d'un champ supplémentaire.

    Tu auras alors un paquet de cartes
    enrjeux32
    avec lequel il te suffit de piocher pour tirer une carte (comme dans un jeu réel avec un vrai donneur).

    Ainsi, pour faire un tirage de 5 cartes, tu prends juste successivement les cartes aux indices 0, 1, 2, 3, 4 du tableau
    enrjeux32
    et tu les copies dans
    enrTabMonJeu
    .

    Tu peux copier ou affecter des
    struct
    de même type avec
    =
    .

    Si tu dois piocher la carte suivante sur le paquet, tu prend la carte à l'indice 5 du tableau
    enrjeux32
    , etc.

    N.B.
    Note que j'ai juste survolé ton code, et qu'il ne compile pas en raison des nombreuses erreurs de syntaxe (majuscules aux mots clefs du C notamment) et de son caractère incomplet.
    2
    1. Kadjarnn Messages postés 13 Statut Membre
       
      Merci de ta reponse Dal
      Ducoup avant de remplir mon tableu j'ai doit melager le carte et puis les affecte a pon tableau mais comment on sait si aura pas de doublons

      Voila aussi la fonction qui genere le carte

      void InitJeu32(TCarte enrTabCarte32[], int iTaille){
       int iBcl;
       for (iBcl = 0; iBcl<8; iBcl++){
        enrTabCarte32[iBcl].mcCoul = 'H';
        enrTabCarte32[iBcl + 8].mcCoul = 'C';
        enrTabCarte32[iBcl + 16].mcCoul = 'P';
        enrTabCarte32[iBcl + 24].mcCoul = 'T';
        enrTabCarte32[iBcl].miValeur = iBcl + 7;
        enrTabCarte32[iBcl + 8].miValeur = iBcl + 7;
        enrTabCarte32[iBcl + 16].miValeur = iBcl + 7;
        enrTabCarte32[iBcl + 24].miValeur = iBcl + 7;
       }
       enrTabCarte32[7].miValeur = 1;
       enrTabCarte32[15].miValeur = 1;
       enrTabCarte32[23].miValeur = 1;
       enrTabCarte32[31].miValeur = 1;
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Si tu veux savoir ce que je ferai, voilà quelques observations :
      - personnellement, je n'aime pas les
      typedef
      et quand je peux m'en passer je ne les utilise pas car cela masque la véritable nature du type (maintenant, si tu dois les utiliser car c'est un devoir, fais le)
      - les noms de types et les noms de variables ou de tableaux me paraissent compliqués et ne me parlent pas du tout (même observation)
      - j'utiliserai des tableaux pour établir la liste des couleurs et des valeurs (en respectant l'ordre de valeur, afin d'utiliser ce tableau pour faciliter ensuite l'évaluation de la main)
      - j'utiliserai la notation internationale pour la désignation du nom des cartes et de leur couleur, car celle que tu utilises n'est familière ni en France, ni ailleurs (maintenant, si tu dois l'utiliser car c'est un devoir, fais le)
      - je construirai le jeu pour un paquet de 52 cartes, parce que je n'aime pas les jeux à 32 cartes (même remarque)
      - et donc j'utiliserai le mélange de Fisher-Yates en m'inspirant de l'une de ses implémentations

      Cela peut alors se faire comme cela :

      #include <stdio.h>
      #include <stdlib.h>
      #include <time.h>
      
      #define MAX_NAMES 13
      char names[MAX_NAMES] = { 
          '2', '3', '4', '5', '6', '7', '8', 
          '9', 'T', 'J', 'Q', 'K', '1' }; 
      #define MAX_SUITS 4
      char suits[MAX_SUITS] = {  'h', 'd', 'c', 's' };
      
      struct card {
          char name;
          char suit;
      };
      
      #define MAX_CARDS (MAX_NAMES * MAX_SUITS)
      struct card deck[MAX_CARDS];
      
      static int rand_int(int n) {
          int limit = RAND_MAX - RAND_MAX % n;
          int rnd;
      
          do {
              rnd = rand();
          } while (rnd >= limit);
          return rnd % n;
      }
      
      void create_and_shuffle_deck(struct card * deck) {
          /* create */
          int i = 0;
          for (int suit = 0; suit < MAX_SUITS; suit++)
              for (int name = 0; name < MAX_NAMES; name++) {
                  deck[i].name = names[name];
                  deck[i].suit = suits[suit];
                  i++;
              }
          /* shuffle */
          struct card tmp;
          for (int i = MAX_CARDS - 1; i > 0; i--) {
              int j = rand_int(i + 1);
              tmp = deck[j];
              deck[j] = deck[i];
              deck[i] = tmp;
          }
      }
      
      int main(void) {
          srand(time(NULL));
          create_and_shuffle_deck(deck);
          printf("The deck contains:\n");
          for (int i = 0; i < MAX_CARDS; i++)
              printf("%c%c, ", deck[i].name, deck[i].suit);
          printf("\n");
      
          return 0;
      }

      Donne, par exemple :

      $ gcc -Wall 35747480.c
      $ ./a.out
      The deck contains:
      Th, 3d, 1h, 2h, 8s, 2c, 4c, 8d, Qc, Js, 9d, 6c, 3c, 5c, Kc, 8h, 9s, 1c, 3h, Tc, 2s, 2d, 5h, 6h, Ts, 3s, 4d, 4h, 6s, Kh, 1s, 6d, Jh, 7h, 9h, Ks, Qs, Kd, Qd, 5d, 9c, 5s, 7s, Jc, Jd, 4s, 8c, Td, Qh, 7c, 7d, 1d,
      $

      Dal
      0
    3. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Note aussi que dans un programme un peu sérieux, on n'utiliserai pas
      rand
      , mais d'autres moyens de mieux générer le hasard, mais je ne me suis pas lancé là dedans pour que tu puisses plus facilement reproduire un fonctionnement à adapter pour ton programme :-)
      0
  2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    Salut Kadjarnn,

    Cela dépend de tes structures de données existantes.

    Si tu as une structure de données qui te permet de stocker les 32 cartes, une façon de faire est d'insérer une variable en tant que membre de la struct pour chacune des 32 cartes, par exemple
    int distribuee;
    qui indiquera si la carte a déjà été distribuée ou pas. Si c'est le cas et que tu tombes dessus, tu refais un tirage aléatoire jusqu'à ce que tu tombes sur une carte non encore distribuée.

    Il y a d'autres façons de faire, avec d'autres façons de représenter les cartes ou le jeu de cartes mélangé.

    Dal
    0
    1. Kadjarnn Messages postés 13 Statut Membre
       
      Merci de votre réponse
      Donc faut que j'ai créer une variable dans ma structure mais si jfait cela j'ai doit ajoute un autre tableaux pour stoker mes valeur?
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      Peux-tu poster ton code pour que l'on comprenne comment tu représentes et stockes ton jeu de cartes et les cartes distribuées aux joueurs et t'aider à partir de ta façon de le faire ?

      Autrement, je peux te montrer comment, moi, je le ferais, sans avoir besoin de rajouter un champ de statut de distribution, en utilisant un tableau représentant le jeu de carte mélangé.
      0
    3. Kadjarnn Messages postés 13 Statut Membre
       
      Voila mon programme la fonction Void initjeu32( TCarte enrtabcarte32[ ], int iTaille) elle me genere le 32 carte

      #define TAILLE 5
      
      #define SIZE 32
      Type defstruct{
      
      Char mcCouleur;
      Int  mivaluer;
      }TCarte;
      
      Void initjeu32( TCarte enrtabcarte32[ ], int iTaille);
      
        
      
      
      Void main (void){
      TCarte enrtabmonjeu[TAILLE];
      TCarte enrjeux32[SIZE];
       
      Int ibcl=0;
      Int ival=0;
      
      Srand((int)time(NULL));
      
      For(ibcl=0;ibcl<TAILLE;ibcl++){
      
      Ival=rand()%32;
      
      enrtabmonjeu[ibcl].mivaleur= TCarte enrjeux32[ival].mivaleur,
      
      enrtabmonjeu[ibcl].mcCouleur TCarte enrjeux32[ival].mcCouleur
      
      }
      For(ibcl=0;ibcl<TAILLE;ibcl++){
      
      Printf(" carte numero %i= %c %i\n",ibcl, enrtabmonjeu[ibcl].mcCouleur, enrtabmonjeu[ibcl].mivaleur);
      
      }
      
      
      
      Type defstruct{
      
      Char mcCouleur;
      Int  mivaluer;
      }TCarte;
      
      Void initjeu32( TCarte enrtabcarte32[ ], int iTaille);


      EDIT : Ajout des balises de code (la coloration syntaxique).
      Explications disponibles ici : ICI

      Merci d'y penser dans tes prochains messages.
      0
    4. Kadjarnn Messages postés 13 Statut Membre
       
      Toi tu aurait fait comment ? Pasque dans mon cahier des charge il me demende de créer un autre tableau ou jvais stoker le carte et de decale par la suite ce tableau pour ecrase la case ou ma carte a été stoker
      0