[C++] [Motus] Double boucle FOR

Fermé
Utilisateur anonyme - 10 mai 2009 à 13:41
 ge646 - 7 avril 2010 à 19:06
Bonjour les Homo Sapiens ! :-)


Je programme actuellement un petit jeu nommé Motus. Tout va bien, je me débrouille pas trop mal, mais je suis bloqué en ce moment sur la fonction des lettres mal placées.

Voici le principe :
Le mot proposé par le candidat apparait sur une grille, et le programme compare les lettres des deux mots. Les lettres bien placées sont coloriées en rouge, les lettres présentes mais mal placées sont cerclées de jaune, les autres sont coloriées en gris. Pour une lettre, on ne peut avoir au maximum que le nombre d'occurrences de cette lettre dans le mot de coloriées (soit en jaune, soit en rouge si certaines sont bien placées).



Le problème, ce sont les lettres mal placées qui n'apparaissent pas.
Le problème, c'est au niveau de la double boucle FOR.

PosMotRecherche et PosMotPropose sont tout le temps identiques.

Comment puis-je faire pour rendre ce programme fonctionnel ?
Je me casse les dents dessus. Un pot de marmelade pour celui ou celle qui voudra m'aider ! :-)



Voici ce que j'ai programmé.

#include <string>
#include <iostream>

void ComparerLettres(const std::string & MotPropose)        
{
     std::string MotRecherche = "PAPILLON";                    
     for(int posMotRecherche = 0; posMotRecherche < MotRecherche.size(); posMotRecherche++)
     {
             for(int posMotPropose = 0; posMotPropose < MotPropose.size(); posMotPropose++)
             {
                     /* lettres mal placées */
                     if((MotPropose.at(posMotRecherche) == MotRecherche.at(posMotPropose)) && (posMotPropose != posMotRecherche))
                     {
                                      std::cout << "M"; // "M" = "Mal Placé"
                                      posMotRecherche++;
                     }
                     
                     else
                     
                     /* lettres mal placées */                    
                     if((MotPropose.at(posMotRecherche) == MotRecherche.at(posMotRecherche)))
                     {
                                      std::cout << "B"; // "B" = "Bien Placé"
                                      posMotRecherche++;
                     }
                                          
                     else
                      
                     /* toutes les autres */                 
                     {
                                      std::cout << "X";
                                      posMotRecherche++;               
                     }
                     
             }
     }
     
     std::cout << std::endl << std::endl;

}



int main()
{
    std::string Proposition;
    std::cout << "Proposer un mot de 8 lettres : ";
    std::cin >> Proposition;
    ComparerLettres(Proposition);
    system("Pause");
    return 0;
}




Merci d'avance ! :o)

Cordialement.
L'Ours Paddington Brown.
A voir également:

10 réponses

mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
13 mai 2009 à 22:19
Pour le pot de marmelade je prends ;-).

Toutefois quelques petits conseils :

1) Change le system("pause") disgrâcieux par un getchar() (et inclue <cstdio>).

2) Change tes int (excepté le type de retour de main) par unsigned, ce sont des entiers positifs.

3) Change at(...) par [...] une fois que ton programme sera débuggué, c'est plus efficace. En effet contrairement à at(...) l'opérateur [...] ne contrôle pas si tu es encore dans la chaîne. Or si ton programme est correctement écrit, tu n'es jamais sensé pouvoir en sortir.

4) Pour le using namespace... pas de problème tant que tu es dans un fichier cpp, mais il ne faut pas l'utiliser dans des headers (hpp).

5) À terme le mot recherché devrait un paramètre de ta fonction (const std::string &).

Tu noteras au passage que dans ton code initial le at levait une erreur, ce qui laissait penser que tu sortais de ta chaîne. Comme les autres l'ont indiqué, c'est parce que ta variable posMotRecherche était incrémentée dans les if. En soit (si on omet le but du programme) ce n'est pas forcément gênant tant que tu restes dans ta chaîne.

Bonne chance
2
Utilisateur anonyme
14 mai 2009 à 00:05
tu chipotes lol !!
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
12 mai 2009 à 15:36
pourquoi incrémenter "posMotRecherche" dans les if, vu que c'est fait dans les for. En théorie, tu rates des lettres non ?
moi, j'aurai inversé la boucle for, j'aurai balayé le mot proposé , et à chaque lettre j'aurai regardé si elle est dans le mot recherché.
(MotPropose.at(posMotRecherche) == MotRecherche.at(posMotPropose)) ça ne serait pas plutôt
(MotPropose.at(posMotPropose) == MotRecherche.at(posMotRecherche))
1
Utilisateur anonyme
10 mai 2009 à 16:37
up

Merci d'avance ! :-)
0
Utilisateur anonyme
11 mai 2009 à 12:47
et UP ! :-)

Je continue de rechercher de mon côté.
Si je trouve la solution, je vous tiendrai au courant !

Bonne journée à tous.


Cordialement.
L'Ours Paddington Brown.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
12 mai 2009 à 13:17
Bon. Pas de résultat probant ... pour le moment ! :-)

J'ai toujours le même problème pour les lettres mal placées.


Merci d'avance !

Paddington Brown.
0
Utilisateur anonyme
12 mai 2009 à 16:31
Ouais c'est quand même bizarre que tu incrémentes...

J'aurais vu une boucle for comparant lettre à lettre (pour les biens placées), et UNE AUTRE pour les mal placées.


#include <string>
#include <iostream>

using namespace std; //ça évite de mettre std:: partout !!

void ComparerLettres(const string & MotPropose)        
{

 string MotRecherche = "PAPILLON";
 string Resultat = "XXXXXXXX";

 for(int posMotRecherche = 0; posMotRecherche < MotRecherche.size(); posMotRecherche++)
  /* lettres mal placées */                    

  if((MotPropose.at(posMotRecherche) == MotRecherche.at(posMotRecherche)))
    Resultat.at(posMotRecherche) = 'B';
  else
   for(int posMotPropose = 0; posMotPropose < MotPropose.size(); posMotPropose++)
    /* lettres mal placées */

    if(MotPropose.at(posMotRecherche) == MotRecherche.at(posMotPropose))
     Resultat.at(posMotRecherche) = 'M';

 cout << "Resultat : " << Resultat <<endl;

}

int main()
{
 string Proposition = "PHPLILHN"; //< Resultat attentu :::=> BXBMMBXB >
 //cout << "Proposer un mot de 8 lettres : ";
 //cin >> Proposition;
 ComparerLettres(Proposition);
 system("Pause");
 return 0;
}

0
Utilisateur anonyme
13 mai 2009 à 18:32
Bonjour MM. Char Snipeur et ahmet0851 !

Je tiens à vous remercier pour vos réponses claires et rapides.
Grâce à vous, j'ai pu corriger mon erreur et améliorer mon code. :-)


Il me reste à modifier quelques petites choses, et le programme sera (presque ?) opérationnel.
Je pense mettre mon programme en libre accès sur Internet.


Encore merci pour votre aide !

Bonne soirée à vous.



PS : à quel nom dois-je envoyer vos pots de marmelade ? ;-)


Amicalement.
L'Ours Paddington Brown.
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
14 mai 2009 à 00:11
Bof :-) Si le but c'est de le faire progresser autant lui donner les bonnes habitudes dès le début, non ?
0
Utilisateur anonyme
14 mai 2009 à 10:12
Oui c'est vrai =), si j'avais eu les bonnes habitudes dès le début, j'aurais passé moins d'heures derrière l'écran à chercher d'où vient l'erreur ^^
0
mamiemando Messages postés 33079 Date d'inscription jeudi 12 mai 2005 Statut Modérateur Dernière intervention 23 avril 2024 7 749
14 mai 2009 à 11:22
Donc tu vois, ce n'est pas pour chipoter, c'est pour la bonne cause ^^
0
Utilisateur anonyme
14 mai 2009 à 11:24
=) allez +1 ^^
0
# D'une gare
# D'un aéroport
# D'un stade de foot
L'une des trois réponses est juste
0
Paddington vient en train ;-)
Une gare anglaise
réponse trouvé sur wiki
https://fr.wikipedia.org/wiki/Paddington
0