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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

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