Mastermind

Fermé
Baki1976 Messages postés 1 Date d'inscription mardi 6 février 2018 Statut Membre Dernière intervention 7 février 2018 - Modifié le 11 févr. 2018 à 16:45
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 - 11 févr. 2018 à 19:39
Bonjour,
J'ai écris un programme mastermind en langage c++ mais j'ai des problèmes avec une fonction et j'aimerais que vous m'aidiez à regler ce problème.
Voici mon code:

#include <iostream>
#include <ctime>

// pour les nombres aléatoires
#include <random>
#include <cstring> // strlen

using namespace std;

// Couleur au hasard
std::uniform_int_distribution<int> distribution;
std::default_random_engine generateur(time(NULL)); /* NOT using std::random_device since not


* all compilers seems to support it :-( */

char tirer_couleur()
{
  static const char* const couleurs = ".RGBCYM";
  static const int nb = strlen(couleurs) - 1;

  return couleurs[distribution(generateur,
                               std::uniform_int_distribution<int>::param_type {0, nb})];
}

char poser_question()
{
  char lu(' ');
  cout << "Entrez une couleur : ";
  cin >> lu;
  return lu;
}

char lire_couleur()
{
  char lu(poser_question());
  while (not couleur_valide(lu)) {
    cout << "'" << lu << "' n'est pas une couleur valide." << endl;
    cout << "Les couleurs possibles sont : ., R, G, B, C, Y ou M." << endl;
    lu = poser_question();
  }
  return lu;
}

void afficher_couleurs(char c1, char c2, char c3, char c4)
{
  cout << ' ' << c1 << ' ' << c2 << ' ' << c3 << ' ' << c4;
}

void afficher(int nb, char c)
{
  while (nb-- > 0) {
    cout << c;
  }
}

void afficher_coup(char c1, char c2, char c3, char c4,
                   char r1, char r2, char r3, char r4)
{
  afficher_couleurs(c1, c2, c3, c4);
  cout << " : ";
  afficher_reponses(c1, c2, c3, c4,
                    r1, r2, r3, r4);
  cout << endl;
}

void message_gagne(int nb_coups)
{
  cout << "Bravo ! Vous avez trouvé en " << nb_coups << " coups." << endl;
}

void message_perdu(char c1, char c2, char c3, char c4)
{
  cout << "Perdu :-(" << endl;
  cout << "La bonne combinaison était : ";
  afficher_couleurs(c1, c2, c3, c4);
  cout << endl;
}

bool couleur_valide(char c)
{
    if(c == '.' || c == 'R' || c == 'G' || c == 'B' || c == 'C' || c == 'Y' || c == 'M')
    {
        return true;
    }
    else
    {
        return false;
    }
}

bool verifier(char& c1, char &c2, int &score)
{
    if(c1 == c2)
    {
        score++;
        c2 = 'x';
        return true;

    }
    else
    {
        return false;
    }
}

void apparier(char c1_test, char &c1_reference, char &c2_reference, 
                          char &c3_reference, int &score)
{
    bool compar1(true);
    bool compar2(true);

    compar1 = verifier(c1_test, c1_reference, score);
    if(compar1 == false)
    {
        compar2 = verifier(c1_test, c2_reference, score);
        if(compar2 == false)
        {
            verifier(c1_test, c3_reference, score);
        }
    }
}

void afficher_reponses(char c1, char c2, char c3, char c4,
                       char r1, char r2, char r3, char r4)
{
    int nb(0) ;
    int nb1(0) ;
    char c(' ') ;
    int score(0) ;

    /**Pour les couleurs bien placéés et identiques*/

    verifier(c1, r1, nb);
    verifier(c2, r2, nb);
    verifier(c3, r3, nb);
    verifier(c4, r4, nb);

        c = '#' ;
    afficher(nb, c);

    /**Pour les couleurs identiques mal placées*/

    if(c1 != r1)
        apparier(c1, r2, r3, r4, score);
    if(c2 != r2)
        apparier(c2, r1, r3, r4, score);
    if(c3 != r3)
        apparier(c3, r1, r2, r4, score);
    if(c4 != r4)
        apparier(c4, r1, r2, r3, score);

    c = '+' ;
    afficher(score, c);

    /**Pour les couleurs distinctes*/

    nb1 = 4 - (nb + score) ;
    c = '-' ;
    afficher(nb1, c);
}

bool gagne(char c1, char c2, char c3, char c4,
           char r1, char r2, char r3, char r4)
{
    bool reponse(true) ;

    if(c1 == r1 && c2 == r2 && c3 == r3 && c4 == r4)
        reponse = true ;
    else
        reponse = false ;

    return reponse ;
}

void jouer(int coup_max = 8)
{
    int nbre(0) ;

    /**Combinaison de réference à deviner*/

    char r1 = tirer_couleur();
    char r2 = tirer_couleur();
    char r3 = tirer_couleur();
    char r4 = tirer_couleur();
    char c1(' ') ,c2(' ') , c3(' '), c4(' ');

     do
     {
         /**Demande des couleurs*/

         c1 = lire_couleur();
         c2 = lire_couleur();
         c3 = lire_couleur();
         c4 = lire_couleur();

         /**affichage du coup*/

         afficher_coup(c1, c2, c3, c4, r1, r2, r3, r4);
         nbre++;
     }while(!gagne(c1, c2, c3, c4, r1, r2, r3, r4) && (nbre < coup_max));

     if(gagne(c1, c2, c3, c4, r1, r2, r3, r4))
        message_gagne(nbre);
     else
        message_perdu(r1, r2, r3, r4);
}


int main()
{
  jouer();
  return 0;
}

Mon problème se situe dans la fonction afficher reponse ci dessous plus précisement dans la partie pour les couleurs identiques mal placées dans laquelle j'ai un problème sur le test avant l'appareillage.

void afficher_reponses(char c1, char c2, char c3, char c4,
                       char r1, char r2, char r3, char r4)
{
    int nb(0) ;
    int nb1(0) ;
    char c(' ') ;
    int score(0) ;

    /**Pour les couleurs bien placéés et identiques*/

    verifier(c1, r1, nb);
    verifier(c2, r2, nb);
    verifier(c3, r3, nb);
    verifier(c4, r4, nb);

        c = '#' ;
    afficher(nb, c);

    /**Pour les couleurs identiques mal placées*/

    if(c1 != r1)
        apparier(c1, r2, r3, r4, score);
    if(c2 != r2)
        apparier(c2, r1, r3, r4, score);
    if(c3 != r3)
        apparier(c3, r1, r2, r4, score);
    if(c4 != r4)
        apparier(c4, r1, r2, r3, score);

    c = '+' ;
    afficher(score, c);

    /**Pour les couleurs distinctes*/

    nb1 = 4 - (nb + score) ;
    c = '-' ;
    afficher(nb1, c);
}


Aidez moi à regler le problème.



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

Merci d'y penser dans tes prochains messages.

2 réponses

JeCherche24 Messages postés 46 Date d'inscription samedi 10 février 2018 Statut Membre Dernière intervention 19 février 2018 5
11 févr. 2018 à 16:33
Bonjour,

Je pense que le titre "fonction langage c++" permettrait d'accrocher les bonnes personnes car ce n'est pas un problème de mastermind.
0
Whismeril Messages postés 19025 Date d'inscription mardi 11 mars 2003 Statut Contributeur Dernière intervention 19 avril 2024 929
11 févr. 2018 à 18:31
Non, c’est pas le titre qui fait qu’il n’a pas de réponse.
  • D’abord, il a posté un code sans couleur, ce qui est pénible à lire. Ceux qui répondent étant bénévoles, il faut leur donner envie de lire. 245 lignes pénibles, ça ne donne pas envie.
  • Baladur13 a édité sa question, pour y ajouter la couleur et un petit encars pour rappeler la procédure. C’est plus lisible, mais néanmoins, il reste 245 lignes à lire.
  • Ensuite, la description de son problème est noyée dans le code, ligne 216.
  • Et quand on a fait l’effort de trouver sa description, ben c’est pas super clair
    Mon problème se situe dans la fonction afficher reponse ci dessous plus précisement dans la partie pour les couleurs identiques mal placées dans laquelle j'ai un problème sur le test avant l'appareillage.


Bref, il y a tous les ingrédients pour que personne ne réponde.
Au moins le titre previens qu’il s’agit d’un mastermind, parce sinon sa description serait encore plus surréaliste.

Et moins je t’ai répondu juste pour le plaisir, car C++, c’est pas mon truc
0
Dalfab Messages postés 706 Date d'inscription dimanche 7 février 2016 Statut Membre Dernière intervention 2 novembre 2023 101
11 févr. 2018 à 19:39
Bonjour,

Quand une couleur a été vue à la bonne place, il faut 'oublier' à la fois la couleur cible et la couleur jouée avant de compter les mal placées.
Les tests
if ( c1 != r1 ) ...
sont là pour cela, mais
r1
à été remplacé par
'x'
précédemment et l'appairage est toujours vérifié car on a toujours
c1 != r1
.
On peut écrire
	if ( 'x' != r1 )
		apparier( c1, r2, r3, r4, score );
	if ( 'x' != r2 )
		apparier( c2, r1, r3, r4, score );
	if ( 'x' != r3 )
		apparier( c3, r1, r2, r4, score );
	if ( 'x' != r4 )
		apparier( c4, r1, r2, r3, score );
Il existe des moyens plus 'lisible' pour implémenter cela.
0