Jeu de poker

Fermé
Kadjarnn Messages postés 13 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 19 décembre 2018 - 13 déc. 2018 à 15:22
[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 - 19 déc. 2018 à 13:51
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
A voir également:

3 réponses

[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 1 097
Modifié le 14 déc. 2018 à 11:20
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
Kadjarnn Messages postés 13 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 19 décembre 2018
Modifié le 18 déc. 2018 à 10:17
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
[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 1 097
14 déc. 2018 à 15:40
Comme je le disais :

Par exemple, avec un tableau représentant toutes les cartes uniques, mélangé comme cela :

https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle
https://stackoverflow.com/questions/3343797/is-this-c-implementation-of-fisher-yates-shuffle-correct
0
[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 1 097
Modifié le 14 déc. 2018 à 16:29
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
[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 1 097
14 déc. 2018 à 17:48
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
[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 1 097
13 déc. 2018 à 17:16
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
[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 1 097
Modifié le 13 déc. 2018 à 17:42
0
Kadjarnn Messages postés 13 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 19 décembre 2018
13 déc. 2018 à 20:54
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
[Dal] Messages postés 6200 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 7 janvier 2025 1 097
Modifié le 14 déc. 2018 à 09:00
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
Kadjarnn Messages postés 13 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 19 décembre 2018
Modifié le 14 déc. 2018 à 10:52
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
Kadjarnn Messages postés 13 Date d'inscription jeudi 13 décembre 2018 Statut Membre Dernière intervention 19 décembre 2018
14 déc. 2018 à 10:09
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
courage
0