Comparer deux tableau en C (master mind)

Résolu/Fermé
mari_94 Messages postés 6 Date d'inscription vendredi 20 avril 2018 Statut Membre Dernière intervention 18 novembre 2018 - Modifié le 20 avril 2018 à 14:41
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 - 20 avril 2018 à 15:54
Bonjour, j'aurai besoin d'aide pour un projet en informatique !

Dans ce projet il est question de créer un jeu : le master mind.
Mais voila je me retrouve coincée pour comparer la combinaison de couleur générée au hasard par l'ordi (tableau p )et la combinaison que le joueur entre (tableau t ).
Les couleurs sont représentées par des chiffres.

Le but étant de compter combien il y a de pions bien ou mal placés, l eplus dur étant de ne pas comparer les valeurs deux fois.

Voici ce que j'ai fait concernant la fonction "comparer", mais elle ne m'affiche malheureusement pas le bon résultat...

Pouvez-vous m'expliquer ce qui ne va pas s'il vous plait ?
Merci pour votre aide!!






#include<stdio.h>

int comparer (int n, int t[], int p[]) {
int i;
int j;
int bp; /* bien placé */
int mp; /* mal placé */
bp=0;
mp=0;

for (i=0;i<n-1;i++) {

        if (t[i]==p[i]) { bp=bp+1; }

       for (j=0;j<n;j++) { if (t[i]==p[j]&&(j!=i)) {mp++;}
        } }
       printf("il y a %d pions bien place\n",bp);

        printf("il y a %d de pions mal place ",mp);
}
A voir également:

1 réponse

[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 20 avril 2018 à 11:51
Salut mari_94,

Une façon de faire est, lorsque tu as traité une position, d'utiliser un "drapeau", c'est à dire une annotation ou un marquage, de façon à ne pas la traiter de nouveau.

Par exemple, si tes couleurs sont représentées par des entiers naturels, tu pourrais mettre -1 à l'emplacement traité, ou changer ce nombre en nombre négatif, ce qui te permettra de reconnaître et sauter les emplacements ainsi marqués lors de tes vérifications suivantes.

Note aussi que si un pion est bien placé, cela ne sert à rien de reparcourir les pions du début pour les vérifier par rapport à celui-là, qui est, par définition, traité. La 2ème boucle
for
imbriquée ne devrait s'exécuter que si le test "bien placé ?" échoue (donc avec un
else
après ce
if
). Si le pion est bien placé, tu le notes en incrémentant ta variable et tu places ton drapeau sur cet emplacement, et tu passes au pion suivant, c'est tout.

Dal
0
mari_94 Messages postés 6 Date d'inscription vendredi 20 avril 2018 Statut Membre Dernière intervention 18 novembre 2018
Modifié le 20 avril 2018 à 14:41
Merci Dal pour ta réponse,
donc si j'ai bien compris :

for (i=0;i<n-1;i++) {

        if (t[i]==p[i]) { bp++; <underline>t[i]=-1</underline>; } 

<underline>else</underline> {

       for (j=0;j<n;j++) { if (t[i]==p[j]&&(j!=i)) {mp++;}
        }}}
0
mari_94 Messages postés 6 Date d'inscription vendredi 20 avril 2018 Statut Membre Dernière intervention 18 novembre 2018
20 avril 2018 à 12:14
j'ai essayé avec t={8,2,4,1} et p={1,2,8,4}, en compilant il m'affiche :
"1 pions bien placé" ( donc ok)
mais "2 pions mal placés" alors qu'il y en a 3...
je ne comprend pas pourquoi
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 20 avril 2018 à 13:48
Je n'ai pas testé ton code ni vraiment réfléchit à ton algorithme. Je te donne une manière de savoir où tu en est des positions traitées.

Cependant tu devrais marquer les emplacements traités dans p, plutôt que t (ou dans les deux, mais cela complexifie sans que cela soit vraiment nécessaire). Dans le else, tu ne testes pas si l'emplacement que tu examines a déjà été traité. Tu ne te sers donc pas du marqueur. Tu dois aussi marquer dans cette partie la position traitée dans les deux tableaux.

je pense aussi qu'il faudrait probablement faire deux passes... ou tester que les pions en avant de i ne sont pas des pions bien placés sur leurs positions avant d'en déduire que la position en question peut être comptée pour ton décompte "mal placés".
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
20 avril 2018 à 14:04
aussi, ta première boucle s'arrête à
i<n-1
, tu ne testes donc jamais la dernière proposition.
0
[Dal] Messages postés 6198 Date d'inscription mercredi 15 septembre 2004 Statut Contributeur Dernière intervention 13 décembre 2024 1 096
Modifié le 20 avril 2018 à 14:33
En deux passes, cela sera plus facile :

- tu traites d'abord les pions bien placés : une seule boucle suffit, en marquant les pions traités dans p et t

- ensuite, tu traites les pions mal placés, c'est à dire que : pour chaque couleur restante dans t, tu dénombres les couleurs existantes non traitées dans p, en marquant là aussi les pions traités dans p et t

Sur cette partie, il te faudra deux boucles imbriquées. Comme tu y compares des couleurs restantes, il ne faudra pas oublier d'exclure les positions déjà marquées comme traitées, histoire que les -1 ne soient pas comparés à tort.
0