Hello les gens =)
Ma prof de dev m'ayant donné comme devoir de grosbill pour les vacances (ouais parce-qu'elle veut quand-même un peu me tester vu que que je suis en avance sur les autres en preums année de bts) de faire un mastermind, j'ai réussi à pondre un algo dans les deux jours qui ont suivi. Jusque là ça va, juste mindfuck à souhait, par contre le problème vient lorsque je code tout ça.
Pour un mastermind à cinq pions, je demande à chaque joueur, de saisir une chaine de caractère que je vérifie afin qu'elle corresponde au format voulu (une chaine de caractère où chaque caractère est un pion d'une couleur donnée). Quand le joueur qui doit chercher le code saisit sa proposition, elle est encore une fois vérifiée, puis on compare dans deux boucles imbriquées (une correspondant à l'incrémentation du code à trouver, et une correspondant au code saisi), et à chaque couleur, si elle est bien placée (au même endroit dans les deux tableaux), elle est validée directement dans la chaîne saisie, sinon elle est laissée telle quelle en espérant que sont tour vienne au prochain cycle, ou, si la couleur n'est pas répertoriée, la boule en question est marquée comme fausse.
Seulement voilà, outre cet algo tout simple, j'ai un soucis au niveau de la vérification : le premier cycle est foireux : la chaine de caractères correspondant au code à trouver disparaît puis réapparaît (oui oui, j'ai même mis un printf pour vérifier ce que je dis, dans le premier cycle de double for imbriqués, la chaine à trouver disparaît puis revient comme par magie au deuxième cycle).
Moralité : j'ai un jeu interminable parce-que j'ai un des cycles de vérification qui disparaît.
Je poste le code au cas où :
#include
#include <stdio.h>
#include "mmind.h"
using namespace std;
int main()
{
char mind[5] = {0, 0, 0, 0, 0}; //Code à trouver
char prpt[5] = {0, 0, 0, 0, 0}; //Code saisi par le joueur
char colors[7] = {0, 0, 0, 0, 0, 0, 0}; //Tableau contenant le nombre de boules de chacune des 7 couleurs
unsigned char found, good, notfound; //Nombre de boules placées, trouvées et inconnues.
unsigned char i, n;
bool err, playing; //Booléens de test de jeu et d'erreurs de saisie.
err = true; //On déclare qu'il-y-a une erreur pour entrer dans la boucle suivante
while (err == true) //Boucle tant qu'il-y a une erreur de saisie.
{
scanf("%s", mind); //On saisit le code à trouver et à vérifier
printf("\n%s", mind); //puis on l'affiche pour debug.
colors = {0, 0, 0, 0, 0, 0, 0}; //On réinitialise le nombre de boules de chaque couleur
err = false; //On declare qu'il n'y-a aucune erreur, si une erreur est détectée on affecte
for (i 0 ; i < 5 ; i ++) //la variable et on repart dans la boucle)
{ //Dans cette boucle on vérifie chacun des 5 caractères du code.
switch (mind[i])
{
case 'B':
B++; //Pour chacune des couleurs, on incrémente le nombre de boules de la couleur
break; //correspondante dans le tableau colors[]
case 'R':
R++;
break;
case 'N':
N++;
break;
case 'V':
V++;
break;
case 'J':
J++;
break;
case 'O':
O++;
break;
case 'G':
G++;
break;
default:
err = true; //Le caractère courant n'a pas été reconnu, c'est une erreur.
break;
}
}
if (err) printf("\nErreur\n");
else printf("\nAucune erreur, code valide\n");
}
playing true; //La partie commence à partir de cet instant3
/*Saisie du deuxième joueur
*/
while (playing == true) //Boucle tant que la partie est déclarée en cours
{
err = true; //On commence par déclarer une erreur pour rentrer dans la boucle suivante
while (err == true) //La boucle s'arrête quand il n'y a plus d'erreur.
{
scanf("%s", &prpt); //Le joueur saisit son code
err = false; //On déclare qu'il n'y a pas d'erreur pour pouvoir en mettre une plus tard.
for (i = 0 ; i < 5 ; i ++)
{
switch (prpt[i])
{
case 'B':
break;
case 'R':
break;
case 'N':
break;
case 'V':
break;
case 'J':
break;
case 'O':
break;
case 'G':
break;
default:
err = true;
break;
}
}
if (err) printf("\nErreur, reessayez : ");
}
for (n = 0 ; n < 5 ; n++)
{
for (i = 0 ; i < 5 ; i++)
{
printf("\ni=%d ; %c | n=%d ; %c", i, prpt[i], n, mind[n]);
switch (prpt[i])
{
case 'B':
if (mind[i] == 'B' && n == i) prpt[i]=1;
else if (B 0) prpt[i] 0;
break;
case 'O':
if (mind[n] == 'O' && n == i) prpt[i]=1;
else if (O 0) prpt[i] 0;
break;
case 1:
printf("Correspondance deja trouvee");
break;
case 0:
printf("Aucune correspondance trouvee");
break;
default:
printf("Undefined");
break;
/* Compléter vérification */
}
}
}
notfound = 0;
found = 0;
good = 0;
for(i = 0 ; i <5 ; i++)
{
switch(prpt[i])
{
case 0: notfound++;
break;
case 1: found++;
break;
default :good++;
break;
}
}
printf("\nTrouves : %d ; Bons : %d ; Faux : %d", found, good, notfound);
}
print("\nPartie Terminee");
return 0;
}
Je confirme, c'est très, très crade, et le switch correspondant à la vérification des couleurs est tronqué volontairement (du coup y-a que le bleu B et le orange O qui marchent).
Voilà, jdois faire partie d'un cas d'école, un effet de bord ou je ne sais quoi ^^">
Merci d'avance =)