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 :

Tirage des plaques : le compte est bon


Sujet :

C++

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 2
    Par défaut Tirage des plaques : le compte est bon
    Bonjour,

    Je suis un novice en programmation et j'essaye de 'créer' un jeu le compte est bon sur C++.
    Le but du jeu étant de trouver un nombre compris entre 100 et 999 à l'aide de 6 autres chiffres/nombres inscrits sur des "plaques".
    Il y a 28 plaques avec pour valeurs : 1; 1; 2; 2; 3; 3; 4; 4; 5; 5; 6; 6; 7; 7; 8; 8; 9; 9; 10; 10; 25; 25; 50; 50; 75; 75; 100; 100.
    J'ai réussi à tirer le nombre à trouver sans trop de problèmes, mais pour le tirage des plaques, je bloque totalement. :/
    J'essaye donc tirer aléatoirement 6 plaques parmis 28 sans retirer la même plaque deux fois.

    Voici ce que j'ai fais qui me permet de tirer 6 plaques, mais le problème, c'est que ça n'empeche pas une plaque d'être retirée plusieurs fois.

    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
     
    #include <iostream>
    #include <stdlib.h>
    #include <time.h>
    using namespace std;
     
    struct plaques
    {
     int valeur;
     bool tire;
    }
    plaq[27];
    int i;
    int P1;
    int P2;
    int P3;
    int P4;
    int P5;
    int P6;
    int tab[28] = {1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9, 10, 10, 25, 25, 50, 50, 75, 75, 100, 100};
     
    void init()
    {
     for (i = 0; i < 27; i++) 
     {
      plaq[i].valeur = tab[i];
      plaq[i].tire = false;
     }
    }
    void main()
    {
     srand (time (NULL));
     P1 = rand() % 27;
     plaq[P1].valeur = tab[P1];
     plaq[P1].tire = true;
     cout<<plaq[P1].valeur<<endl;
     
     
     P2 = rand() % 27;
     plaq[P2].valeur = tab[P2];
     plaq[P2].tire = true;
     cout<<plaq[P2].valeur<<endl;
     
     
     P3 = rand() % 27;
     plaq[P3].valeur = tab[P3];
     plaq[P3].tire = true;
     cout<<plaq[P3].valeur<<endl;
     
     
     P4 = rand() % 27;
     plaq[P4].valeur = tab[P4];
     plaq[P4].tire = true;
     cout<<plaq[P4].valeur<<endl;
     
     
     P5 = rand() % 27;
     plaq[P5].valeur = tab[P5];
     plaq[P5].tire = true;
     cout<<plaq[P5].valeur<<endl;
     
     
     P6 = rand() % 27;
     plaq[P6].valeur = tab[P6];
     plaq[P6].tire = true;
     cout<<plaq[P6].valeur<<endl;
     
     
     
    system("pause");
    }
    On m'a conseillé d'utiliser une boucle for pour éviter à chaque fois d'utiliser P1,P2,P3,etc. Mais je me perd totalement dans les variables quand j'essaye de le faire.

    Bref je suis un peu perdu, j'espère que vous pourrez m'aider, merci d'avance ^^

    Matt

    edit: j'utilise visual c++ 2010 express

  2. #2
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Il conviendrait d'utiliser un vector plutot qu'un set.

    Par ailleurs, tes plaques ont plusieurs propriétés:
    Chacune est une entité. Il y a la "première plaque marquée 1" et la "seconde plaque marquée 1". Ces deux plaques sont distinctes, et distinctes d'une "troisième plaque marquée 1".
    Elles portent une valeur.

    De la, j'en déduis qu'il serait intéressant d'avoir une classe Plaque bien faite (regarde ce qui parle d'entité dans notre faq)
    ou si vraiment tu es allergique aux classes (ce qu'il va falloir combattre un peu), au minimum pouvoir faire la distinction entre la plaque et son numéro.

    Dans le jeu, on ne tire pas des nombres, mais des plaques.
    Une solution souvent proposer: avoir un set<?> des plaques déjà tirées.

    Une solution bien plus simple est de faire une collection des plaques, de la détrier (shuffle), et de prendre les premiers éléments

  3. #3
    Membre actif
    Inscrit en
    Juin 2013
    Messages
    18
    Détails du profil
    Informations forums :
    Inscription : Juin 2013
    Messages : 18
    Par défaut
    Bonjour,
    avant le tirage tu initialise tab avec les 28 valeurs

    pour le premier tirage tu tire un nombre aléatoire entre 0 et 28 : P1
    tu initialise la premiere plaque
    après tu rajoute
    pour le deuxième tirage tu tire un nombre entre 0 et 27 : P2 (les 27 premières valeurs de tab son les 27 valeurs non tirées)
    tu initialise la szcinde plaque
    après tu rajoute
    et ainsi de suite

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Du point de vue de la logique C++ la réponse de Leternel est meilleure (c'est celle qui utilise le mieux les caractéristiques du langage) mais pour l'économie de moyens, celle de tinofutinofu est plus prometteuse. Je me permets de mélanger les deux:

    en supposant qu'on ait créé une fonction randomInt(low, high) qui renvoie un int entre low (compris) et high (exclus):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    std::vector<int> plaques = {1,1,2 ... ,100};
    const int nbplaques  = plaques.size();
     
    std::vector<int> chosenPlaques;
     
    for (unsigned i = 0; i < 6; ++i) {
      int idx = randomInt(0, nbplaques-i);
      chosenPlaques.push_back(plaques[idx]);
      std::swap(plaques[idx], plaques[nbplaques-i-1]); // on pousse la plaque choisie à la fin, là où elle ne pourra plus être choisie.
    }
    si on veut réinitialiser plaques, il suffit de le trier:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::sort(plaques.begin(), plaques.end());

  5. #5
    Membre Expert Avatar de Astraya
    Homme Profil pro
    Consommateur de café
    Inscrit en
    Mai 2007
    Messages
    1 048
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Consommateur de café
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 1 048
    Par défaut
    Salut,

    Une solution toute simple qui est un mélange de tout ce qu'il y a au dessus je pense...

    1 - créer un tableau [codeinline] unsigned int plaque[28] = {1,1,2 ... ,100};[codeinline]
    2 - shuffle le tabeau http://www.cplusplus.com/reference/algorithm/shuffle/
    3 - fait ta boucle de 0 à 27 comme on te la proposé.
    4 - recommence une partie en allant au 2.

    pas besoin de plus.

    Après je me demande... si c'est le compte est bon comme pour le jeu télévisé.. ce n'est pas du tout l'algorithme à adapter

  6. #6
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Si tu « shuffles » le tableau, autant prendre les six premières plaques : elles sont déjà aléatoires.

    Sinon, la solution de stendhal666 ne va pas assez loin : elle copie les entités. Il faut soit :
    - les déplacer vers un nouveau vecteur, et les enlever du vecteur précédent
    - les mettre à la fin comme il le fait (en fait, plutôt au début, cf suite), et considérer que les tuiles choisies sont… les 6 premières de la liste, une fois les 6 permutation (choix) effectués.

  7. #7
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par white_tentacle Voir le message
    Sinon, la solution de stendhal666 ne va pas assez loin : elle copie les entités. Il faut soit :
    - les déplacer vers un nouveau vecteur, et les enlever du vecteur précédent
    - les mettre à la fin comme il le fait (en fait, plutôt au début, cf suite), et considérer que les tuiles choisies sont… les 6 premières de la liste, une fois les 6 permutation (choix) effectués.
    Ah la la... whitetentacle dans ses oeuvres! Copier 6 int c'est pas la mort quand même... enfin j'imagine que c'est comme peek(), tu n'aimes pas!
    C'est vrai que déplacer les plaques retenues au début fait gagner quelques copies mais en revanche tu perds en généralité: tu ne peux plus écrire par exemple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    auto chosenPlaques = choosePlaques(plaques);
    for (auto p : chosenPlaques) {
      std::cout << p << ' ';
    }
    mais dois faire référence à une constante avec une boucle explicite:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    choosePlaques(plaques);
    for (unsigned i = 0; i < nbChosenPlaques; ++i) { etc. }

  8. #8
    Membre Expert
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Par défaut
    Citation Envoyé par stendhal666 Voir le message
    Ah la la... whitetentacle dans ses oeuvres! Copier 6 int c'est pas la mort quand même...
    Arf, j’aurais dû être plus explicite, tu m’as compris de travers . Vu le niveau de l’OP, je ne me préoccupe pas trop de ce genre de détails. Non, ce qui me gêne plus, c’est qu’il faut faire un choix :
    - soit on décide que les plaques sont juste des valeurs. Alors on modélise mal le problème et on va au devant de problèmes si on est inattentif
    - soit on décide que les plaques sont des entités. Alors dans ce cas, elles sont uniques en on n’a pas le droit de les copier

    Dans ta solution, tu fais un mix des deux. Ce sont des entités, mais tu les copies quand même. C’est vraiment ça qui, conceptuellement, me pose problème.

    Sinon, à la réflexion, en approche naïve, dans le tableau de résultat, je stockerai les indices des plaques déjà tirées, sans jamais modifier le tableau initial des plaques. Pour être sûr de ne jamais retirer deux fois la même plaque, il faut effectivement tirer entre 0 et 27 - nbtirés, et corriger l’indice ainsi obtenu avec ce qui a déjà été tiré.

  9. #9
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2015
    Messages : 2
    Par défaut Merci ^^
    Bonsoir, merci à tous pour vos réponses, elles m'ont beaucoup aidées.
    J'ai réussi à faire ce que je voulais grâce à votre aide, voici à quoi ça ressemble.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    for (p=0;p<6;p++)
    	{
    	i = rand()%(27-p);
    	a = tab[27-p];
    	tab[27-p] = tab[i];
    	tab[i] = a;
    	cout <<tab[27-p]<< ", ";
    	}
    Je m'attaque maintenant au opérations avec mes plaques. Je veux donc donner la possibilité à l'utilisateur de taper ces calculs, et donc mon programme les vérifirai.
    Mais je suis une fois de plus un peu embourbé, je me permet donc de poser quelques questions ^^

    Est il possible de vérifier si une variable est égale à une variable parmis plusieurs? (Si x= a ou b ou c par exemple)
    Est ce que + - * /sont considérés commes des caractères?
    Et enfin, est il possible de vérifier un caractère? Par exemple Si y = + ou y = /

    Dîtes le moi si je pose trop de questions, je m'en rend pas trop compte, je suis pas un habitué de forums ^^.
    Je vous remercie d'avance.

    Matt

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 449
    Par défaut
    Est il possible de vérifier si une variable est égale à une variable parmi plusieurs? (Si x= a ou b ou c par exemple)
    Oui, il suffit juste de l'écrire.

    if(x==a || x==b||x==c){...}

    Est ce que + - * /sont considérés commes des caractères?
    Oui, comme tout ce qui passe par la console.

    Et enfin, est il possible de vérifier un caractère? Par exemple Si y = + ou y = /
    Oui, il suffit juste de l'écrire.

    if(y=='+' || y=='/'){...}

    Pour les questions, le forum est là pour donner un coup de mains quand on a des difficultés.
    Mais cela ne remplacera pas la lecture d'un bon cours C++.
    Donc lisez un bon cours.

  11. #11
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2013
    Messages : 610
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Nitrose Voir le message
    Je m'attaque maintenant au opérations avec mes plaques. Je veux donc donner la possibilité à l'utilisateur de taper ces calculs, et donc mon programme les vérifirai.
    Mais je suis une fois de plus un peu embourbé, je me permet donc de poser quelques questions ^^
    C'est un bon projet mais attention, c'est plus difficile qu'il n'y paraît. Il faut gérer les priorités des opérateurs, les règles d'associativité, les parenthèses... mais également les interactions avec l'utilisateur, la gestion des erreurs (que fais-tu si tu reçois "5+*2"?) et j'en passe.

    Il se trouve qu'il y a un code bien fait et accessible sur le forum, en C++, qui a bizarrement été écrit pour répondre à un "défi fonctionnel": http://www.developpez.net/forums/d38...s/#post2356000 Donc si tu es bloqué, tu peux y jeter un oeil...

Discussions similaires

  1. Jeu "Le compte est bon" avec récursivité
    Par elvis54 dans le forum Général Java
    Réponses: 1
    Dernier message: 19/11/2008, 07h50
  2. [Jeu "Le Compte est Bon"] Recherche algorithme
    Par Chriss21 dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 29/10/2005, 16h10

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