mastermind en C - C - Programmation
Marsh Posté le 07-01-2012 à 10:21:55
fia123 a écrit : Bonjour à tous, |
Salut
Bravo pour ton orthographe presque irréprochable. Comparé à ce que certains niaiseux écrivent ici, ça fait déjà plaisir à lire.
Bon maintenant voyons ce code...
fia123 a écrit :
|
Bon ben j'ai mis en rouge tout ce qui ne va pas dans ton code. Certaines erreurs ne sont pas la cause de ce que ça ne marche pas mais toutes sont préjudiciables à plus ou moins long terme.
Ensuite c'est bien de découper en fonctions mais pourquoi ne faire que la moitié du travail ? Faut essayer de repérer les phases importantes et les attribuer à des fonctions dédiées. Par exemple je verrais bien une fonction dédiée à la phase de comparaison du jeu et de la solution...
Marsh Posté le 08-01-2012 à 01:06:51
Sve@r,
Merci pour ta réponse très claire et détaillée, seulement depuis la publication de mon message j'ai considérablement changé mon code et maintenant il fonctionne bien. Le voici :
Code :
|
Si tu pouvais me donner ton avis et me dire si il est préférable que je change certaines partie de mon code, ce serait vraiment super (je tiens à re-préciser qu'il fonctionne correctement mais il n'est certainement pas parfait).
Marsh Posté le 08-01-2012 à 03:06:05
fia123 a écrit : Sve@r, |
Il fonctionne oui. Mais "correctement"...
1) Concernant ton commentaire à propos de ma remarque: ta boucle principale affiche un menu. De ce menu on peut afficher les règles. Et les règles réaffichent les règles. Et les règles réaffichent les règles. Et etc etc. Pourtant tu as appris le principe d'imbrication des fonctions. Si une fonction A appelle une fonction B qui appelle une fonction C alors ensuite la C doit remonter vers la B qui remonte vers la A. Donc tu dis "tu ne vois pas ..." mais tu n'as rien fait pour "voir".
Rajoute printf("Fin de fonction\n" ) à la dernière ligne de la fonction "regles()" puis lance ton programme. Tape "2" pour avoir les règles puis, de là, tape encore cinq ou six fois "2" avant de taper "0". Là ca réaffichera le menu (bien inutilement d'ailleurs puisque ensuite la fonction se terminera et la boucle du main() réaffichera le menu) mais j'espère que là tu "verras" ce qui ne va pas...
2) Concernant les valeurs 42 et 46 ta réponse est vraiment crétine. Je te demande pourquoi tu initialises avec 42 et 46 et tu me réponds "j'initialise avec 42 et 46" !!!
3) pour vérifier que la réponse est acceptable c'est quoi tout ce micmac avec verif++ et verif-- ? Considère qu'elle l'est par défaut puis vérifie avec une boucle s'il y a un élément qui ne va pas. A la fin de la boucle, si ton verif est resté dans le même état qu'au début de la boucle ça veut dire que la réponse est acceptable.
4) je ne vois pas trop à quoi sert le tableau "controle". Si tu veux vérifier qu'il n'y a pas de "N" dans la case "resultat[x]" ben va regarder la valeur de cette case !!!
5) t'as rien fait de mes remarques dans les lignes 100, 144, 171 et surtout 204 de mon premier post
6) concernant le fflush(stdin) tu le supprimes. Mais chaque fois que tu utilises scanf() pour faire saisir un nombre (%d ou %f), un caractère (%x) alors tu rajoutes un fgetc(stdin) juste après. Mais si tu fais saisir une chaine (%s) alors surtout pas. Ce fgetc() sert à supprimer le '\n' représentant l'appui sur la touche <entrée> qui n'est pas vidé de stdin dans les 3 cas précités. Car quoi qu'il en soit tu appuies toujours sur cette touche à chaque saisie mais si scanf() attend un nombre ou un caractère alors cette touche appuyée reste dans stdin. Et si scanf() attend une chaine alors cette touche est intégrée à la chaine saisie.
Et si tu veux remplacer scanf (qui signifie "saisie formatée" et que ce que tape un humain est tout sauf formaté) par un outil de saisie plus robuste, alors essaye de tester et de t'inspirer de ce petit bout de code
Code :
|
Sinon pour le reste ben c'est encore brouillon mais ça peut attendre...
Marsh Posté le 08-01-2012 à 15:01:13
Sve@r, dans la table ascii, 42 correspond à "*" et 46 à "." je l'ai mis dans mon commentaire si tu regardes bien, j'initialise mon tableau avec des "*" et des ".".
Les "*" sont remplacés par les combinaisons que rentre le joueur, et les "." sont remplacés par les pions noirs ou blancs. Donc ma réponse n'étais pas "crétine". Pour ce qui est du reste, je te remercie toujours autant pour tes réponses détaillées, je vais modifier mon code ce soir. Merci.
Marsh Posté le 08-01-2012 à 16:56:09
fia123 a écrit : Sve@r, dans la table ascii, 42 correspond à "*" et 46 à "." je l'ai mis dans mon commentaire si tu regardes bien, j'initialise mon tableau avec des "*" et des ".". |
Mais si ta réponse était crétine parce que tu ne sais pas lire entre les lignes. Je cherchais par cette motivation faite à ton amour propre que tu déduises de mes autres commentaires ce que j'aurais aimé que tu comprennes toute seule (me démontrant ainsi que tu savais aussi te servir de ta tête). Je sais bien que 42 et 46 représentent les caractères '*' et '.' mais pourquoi n'utilises-tu justement pas cette notation standard '*' et '.' ? Je t'avais pourtant signalé la chose en ligne 244 dans mon premier post !!!
En plus aujourd'hui tu travailles en ascii mais que se passera-t-il si demain tu travailles en utf-8 ? Tu crois que 42 et 46 auront la même signification ?
Marsh Posté le 05-01-2012 à 15:19:23
Bonjour à tous,
Pour mon projet de programmation, je dois réaliser le mastermind en C, je l'ai terminé et il n'y a pas d'erreur de compilation, seulement c'est impossible de gagner, quelque soit la combinaison que l'on rentre, le programme n'indique aucun point blanc ni noir, et je ne comprend pas d'où vient l'erreur .. Si quelqu'un pouvait m'éclairer et me dire quelle partie du code est incorrecte, ce serait vraiment sympa