Problème codage MasterMind

Fermé
Shusty Messages postés 1 Date d'inscription dimanche 26 octobre 2014 Statut Membre Dernière intervention 26 octobre 2014 - 26 oct. 2014 à 16:22
fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 - 26 oct. 2014 à 17:19
Bonjour,
Je suis étudiant en première année d'informatique, et je dois coder un MasterMind pour la rentrée.
Le programme marche, mais j'ai un problème au niveau de ma fonction Analyse, qui est censée vérifier le positionnement des chiffres, quand je lance le programme, j'ai systématiquement "Blanc" d'affiché une seule fois, même quand je rentre la bonne combinaison à trouver...
Voici mon programme, merci d'avance pour votre aide ! :)

#include <stdio.h>



void Analyse () // Vérification du positionnement des nombres
{
int Noir;
int Blanc;
char noir;
char blanc;
int taille = 4;
int combinaison1[4];
int combinaison2[4];
int i;
int k;
for (i=0 ; i<4 ; i+=1)
{
if (combinaison1[i]==combinaison2[i])
{
Noir +=1;
printf ("Noir");
i+=1;
}
if (combinaison1[i]==combinaison2[k])
{

{
Blanc+=1;
printf ("Blanc");
i+=1;
}
}


}

}


void Menu ()
{
printf (" \n\n\n\n");
printf (" ===========================MASTERMIND=============================\n \n \n");
printf ("Chaque combinaison doit comporter 4 chiffres allant de 1 a 8.\n");
printf ("Blanc: Bon chiffre au mauvais emplacement.\n");
printf ("Noir: Bon chiffre au bon endroit.\n");
printf ("\n \n");
printf ("Pour commencer le jeu, tapez sur 1. \n");
}

void SaisieCombinaison (int tab[], int size)
{
char c;
int i;
int combinaison;
size = 4;
{
for (i=0 ; i<size ; i+=1)
{
scanf ("%d", &combinaison);
scanf ("%c", &c);
combinaison=tab[i];
}
}
}

int main ()
{
int i;
int Noir=0;
int Blanc;
int essais_restants=0;
int choix;
int taille1 = 4;
int taille2 = 4;
int combinaison1[4];
int combinaison2[4];
char c;
Menu();
scanf ("%d", &choix);
scanf ("%c", &c);
while (choix!=1)
{
printf ("Mauvaise valeur, veuilez tapez sur 1 si vous souhaitez commencer le jeu: \n");
scanf ("%d", &choix);
}
if (choix==1)
{
printf ("Joueur 1, veuillez entrer une combinaison a faire deviner au joueur 2.\n");
SaisieCombinaison (combinaison1, taille1);
for (i=0 ; i<25 ; i+=1)
{
printf ("\n");
}
printf ("Joueur2, a vous de jouer! Essayez de deviner la combinaison de Joueur 1: \n");
while (essais_restants<12)
{
SaisieCombinaison(combinaison2, taille2);
Analyse (combinaison1, combinaison2);
essais_restants +=1;
if (essais_restants==12)
printf("Vous avez perdu...");
if (Noir==4)
printf(" Felicitation, vous avez gagne !");
}


}
}

1 réponse

fiddy Messages postés 11069 Date d'inscription samedi 5 mai 2007 Statut Contributeur Dernière intervention 23 avril 2022 1 836
Modifié par fiddy le 26/10/2014 à 17:20
Bonjour,

scanf ("%c", &c);
J'imagine que tu fais ça pour vider le '\n'. Autant faire un simple : getchar(); sinon on se pose la question "A quoi sert ta variable c"...

printf ("Mauvaise valeur, veuilez tapez sur 1 si vous souhaitez commencer le jeu: \n");
scanf ("%d", &choix);

Pourquoi tu ne remets pas un scanf("%c", &c); ici ? Il faut respecter la même logique. Ou mieux, faire une fonction...

Dans SaisieCombinaison(), tu mets combinaison=tab[i];
Ca serait plutôt tab[i]=combinaison...
Mais autant mettre directement : scanf("%d", tab+i);

Dans SaisieCombinaison(), tu mets size = 4;
A quoi ça sert de passer la variable dans SaisieCombinaison(), si tu récris par dessus ? Je te conseille donc d'enlever cette instruction.
D'ailleurs, dans main(), pour plus de portabilité, tu pourrais mettre : SaisieCombinaison(tableau, sizeof tableau); avec tableau qui vaut combinaison1 ou 2 selon ce que tu veux faire.

for (i=0 ; i<25 ; i+=1)
{
printf ("\n");
}

A mettre plutôt dans une fonction "EffaceEcran()". Cela facilite la maintenance et la lisibilité.

if (Noir==4)
Tu ne modifies pas cette variable. Donc, cette condition n'est jamais valable. Il faut que tu envoies cette variable en paramètre de Analyse() en tant que pointeur.

N'oublie pas de mettre un '\n' avant la fin du programme pour flusher le buffer écran, ainsi que le return 0;.


Merci la prochaine fois d'utiliser la balise "code c" pour poster ton code.
Exemple :
<code c>ici tu mets ton code</code>

Cdlt,

Google is your friend
1