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 :

generateur de nombre aleatoire(jeu du black jack)


Sujet :

C++

  1. #1
    Candidat au Club
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut generateur de nombre aleatoire(jeu du black jack)
    Bonjour,

    Je dois écrire un code dans lequel il me faut créer une fonction qui va générer des nombres aléatoires. Le problème c'est :
    aléatoires

    -qu'elle doit utiliser des paramètres d’entrées et de sorties.

    -Elle doit afficher aléatoirement le nom d'une carte et sa valeur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    // Données utilisées par le programme:
    char Cartes[13] = { 'A', '2', '3', '4', '5', '6', '7', '8', '9', 'X', 'V', 'D', 'R' } ;
    short Valeurs[13] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10 } ;
    
    // Générateur de cartes
    
    short genererCarte( char cartes[], short valeurs[], char &carte, short &points )
    {
    Ici je ne vois pas comment faire. Je ne sais meme pas par ou commencer. Est ce que je dois declarer mo tableau ici? Comment utliser les parametres d entres et sorties??
    }

    Aussi dans le main, on doit creer un premier fichier qui affiche les 100 premieres pairse générées aleatoirement par la fonction et un deuxieme fichier qui affiche les 500 autres.

    Comment faire pour que il y en ai 100? Si on utlise le for, il comptabilise 100 fois de suite la meme valeur. Je suis COM--PLE-TE-MENT PAUMEE. Je debute a peine au fait.


    Merci pour ce qui prendrons le temps de me repondre au plus vite...

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Ce code devrait générer 100 indices aléatoires de 'Cartes' et 'Valeurs' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=0; i<100; ++i) 
    {
        int randomIndex = std::rand() % 13; // pour un tableau de taille 13
        std::cout << randomIndex << std::endl;
    }
    Si tu veux quelque chose de non-déterministe (séquences d'indices différentes d'une exécution à l'autre) tu peux utiliser std::srand d'une manière similaire (cf l'exemple du lien).

  3. #3
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Au black-jack, on ne génère pas des cartes aléatoirement, mais on bat les cartes de n paquets (ainsi, si 4*n rois sont déjà tombés, on sait qu'il ne peut pas en tomber d'autres). Je te conseille donc de générer un tableau avec tes n paquets, puis d'utiliser std::random_shuffle pour les mélanger.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  4. #4
    Candidat au Club
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par cob59 Voir le message
    Ce code devrait générer 100 indices aléatoires de 'Cartes' et 'Valeurs' :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    for (int i=0; i<100; ++i) 
    {
        int randomIndex = std::rand() % 13; // pour un tableau de taille 13
        std::cout << randomIndex << std::endl;
    }
    .
    Ok j'ai essayé d'appliquer le rand dans mon code mais je ne comprends pas pourquoi, il n'affiche que nom de la carte A et sa valeur 1. 100 fois de suite...

    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
     
    #include<iostream>
    #include<time.h>
    #include<fstream>
    using namespace std;
     
    // Générateur de cartes
     
    short genererCarte( char cartes[], short valeurs[], char &carte, short &points )
    {
    	int i =0;
     
    for (int i=0; i<13; i++)            
    {
    	rand(); }
     
     
    	carte  = cartes[i] ;
    	points = valeurs[i] ;
    	return rand() ;
    }
     
     
    int main()
     
    {
     
    	char  Cartes[13]  = { 'A', '2', '3', '4', '5', '6', '7', '8', '9', 'X', 'V', 'D', 'R' } ;
    	short Valeurs[13] = {  1,   2,   3,   4,   5,   6,   7,   8,   9,  10,  10,  10,  10  } ;
     
    	// Rendre le comportement du programme un peu plus aléatoire
    	srand( unsigned int (time( NULL ) ) ) ; 
     
    	short mesPoints ;
    	char  maCarte ;
    	short monIndice ;
     
    	monIndice = genererCarte( Cartes, Valeurs, maCarte, mesPoints ) ;
     
     
    	//Generer 100 fois
     
    for (int i=0; i<100; i++) 
    {
     
    	cout << "Les resultats sont :" << endl ;
    	cout << "     Carte  = " << maCarte << "     Points = " << mesPoints << endl ;
    }
     
     
    	//fichier carte.text
     
    ifstream fichier("carte.txt", ios::in);  // on ouvre
     
            if(fichier)
            {
     
     
                    fichier.close();//on ferme
            }
            else
                    cerr << "Impossible d'ouvrir le fichier !" << endl;
     
    	system("pause");
    	return 0;}
    Comment stocker 100 valeurs dans un fichiers?

    j

  5. #5
    Candidat au Club
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par JolyLoic Voir le message
    Au black-jack, on ne génère pas des cartes aléatoirement, mais on bat les cartes de n paquets (ainsi, si 4*n rois sont déjà tombés, on sait qu'il ne peut pas en tomber d'autres). Je te conseille donc de générer un tableau avec tes n paquets, puis d'utiliser std::random_shuffle pour les mélanger.
    Tu dois avoir raison en ce qui concerne les regles du black jack mais la premiere partie de l'exo concerne ce geenrateur de cartes. Les melanges c'est apres. Merci quand meme de l'indication.

  6. #6
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Bonjour,

    personnellement, je génèrerais dans un premier temps toutes les paires possibles dans un tableau unidimensionnel puis j'effectuerais des permutations aléatoires de ce tableau pour obtenir des tirages aléatoires. C'est très facile à mettre en place et à manipuler. Par ailleurs, je pense que tu gagnerais à stocker également les couleurs et à faire un peu de programmation objet, soit en faisant une classe "Carte" ou une classe "Jeu" correspondant à l'ensemble des cartes.

  7. #7
    Candidat au Club
    Inscrit en
    Octobre 2012
    Messages
    4
    Détails du profil
    Informations forums :
    Inscription : Octobre 2012
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par Aleph69 Voir le message
    Bonjour,

    personnellement, je génèrerais dans un premier temps toutes les paires possibles dans un tableau unidimensionnel puis j'effectuerais des permutations aléatoires de ce tableau pour obtenir des tirages aléatoires. C'est très facile à mettre en place et à manipuler. Par ailleurs, je pense que tu gagnerais à stocker également les couleurs et à faire un peu de programmation objet, soit en faisant une classe "Carte" ou une classe "Jeu" correspondant à l'ensemble des cartes.
    Bonjour Aleph69,

    je n'ai pas encore fait de programmation objet...
    Ce n'est pas possible d'obtenir des tirages aleatoires avec ce que j'ai fait en modifiant seulement certains trucs?

  8. #8
    Membre expérimenté
    Homme Profil pro
    Chercheur
    Inscrit en
    Mars 2010
    Messages
    1 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Chercheur

    Informations forums :
    Inscription : Mars 2010
    Messages : 1 218
    Points : 1 685
    Points
    1 685
    Par défaut
    Si, bien sûr, ce n'était qu'une suggestion. Au moins l'un des problèmes vient de ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    short genererCarte( char cartes[], short valeurs[], char &carte, short &points )
    {
    	int i =0;
            for (int i=0; i<13; i++)         
            {
    	      rand(); // génère un nombre aléatoire sans le stocker
            }
            // à la fin de la boucle, i=12
    	carte  = cartes[i] ;
    	points = valeurs[i] ;
    	return rand() ; // retourne finalement un nombre aléatoire, tout ce qui est écrit avant ne sert à rien sauf affectations de carte et points
    }
    Au vu des commentaires ajoutés, cela reviendrait au même d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    short genererCarte( char cartes[], short valeurs[], char &carte, short &points )
    {
            carte  = cartes[12] ;
    	points = valeurs[12] ;
    	return rand() ;
    }
    Dans un premier temps, sans t'occuper des détails du langage, essaye d'écrire correctement un algorithme en pseudo-code.

  9. #9
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 612
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 612
    Points : 30 611
    Points
    30 611
    Par défaut
    Salut,

    Même sans aller jusqu'à faire de la programmation orientée objets, il serait franchement pas mal d'au moins faire de la programmation "orientée structures".

    L'idée serait, au moins, de regrouper "ce qui va bien" ensemble

    Ainsi, une carte se caractérise par (pour le black jack):
    1. une couleur
    2. une valeur (as, valet, dame roi)
    3. le nombre de points que cela rapporte
    En mettant ces trois caractéristiques dans une structure commune, tu pourras créer un tableau contenant autant de structures que tu le veux et te balader dans ce tableau, en étant sur que, quoi qu'il arrive, tu récupéreras toujours la couleur, la valeur et le nombre de points qui correspond à chaque carte particulière.

    Ce sera, très clairement, de nature à te faciliter grandement la vie

    Maintenant, pour ce qui concerne le tirage aléatoire en lui même:

    Le principe des nombres aléatoires se réparti entre deux fonctions :
    1. une fonction qui va "initialiser" le générateur de nombres : void srand(unsigned int)
    2. une fonction qui va générer les nombres eux-même : int rand()
    Le principe de rand est de renvoyer un nombre pseudo aléatoire, c'est à dire qu'il y a, malgré tout, un algorithme derrière qui va générer les valeurs.

    Or, aussi poussé puisse être cet algorithme, il n'en reste pas moins tout aussi prédictible que n'importe quel algorithme : si tu pars d'une situation précise au moment où tu fais appel à cet algorithme, tu obtiendras toujours le même résultat

    Ainsi, il semblerait, selon tes propres constatations, si tu n'initialise pas le générateur de nombre aléatoires, qu'il renverra toujours 1

    Tu dois donc veiller à initialiser le générateur de nombres, et là, tu as deux solutions:

    La première est de l'initialiser avec une valeur clairement définie, et tu auras la certitude d'obtenir les même tirages à chaque fois que tu lanceras ton application.

    Dans certains jeux, cette solution peut etre envisageable pour s'assurer que deux parties différentes commenceront de la même manière (s'il s'agit de générer des "ennemis" de manière aléatoire, par exemple), mais il faut avouer que, dans le cas d'un jeu de cartes, ce ne serait pas vraiment l'idéal

    La deuxième est de l'initialiser avec une valeur qui changera toujours, de manière à s'assurer qu'il n'y aura jamais deux parties identiques (ou, du moins, à s'assurer que si deux parties identiques venaient à apparaitre, elles apparaissent tellement éloignées les unes des autres que nous ne pourrions sans doute pas le remarquer).

    Il se fait que l'on a une fonction qui nous renvoie, justement, un entier qui change tout le temps : la fonction qui nous permet d'obtenir l'heure système : time(NULL).

    L'idéal est donc d'initialiser (une et une seule fois !!! ) le générateur de nombre aléatoires avec la valeur renvoyée par cette fonction, au début de ton application, de manière à ce que la boucle qui fera appel au générateur de nombres aléatoires obtienne à chaque fois des valeurs différentes

    En gros, cela se ferait sans problème dans la fonction main sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    int main()
    {
        srand(time(NULL));
         /* ... */
         genererCarte(/* ... */);
         /*...*/
         return 0;
    }
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

Discussions similaires

  1. Generateur de nombre aleatoires
    Par circe dans le forum Boost
    Réponses: 0
    Dernier message: 04/01/2010, 14h39
  2. Jeu de black jack : montrer les cartes
    Par mamili dans le forum Flash
    Réponses: 1
    Dernier message: 15/12/2008, 09h24
  3. Serveur 1-N pour jeu de Black jack
    Par Salandar dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 24/02/2008, 09h03
  4. Generateur de nombre aleatoire
    Par leywan dans le forum Delphi
    Réponses: 5
    Dernier message: 21/03/2007, 18h10

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