[debutant] Programme perso de mastermind, qu'en pensez-vous?

Programme perso de mastermind, qu'en pensez-vous? [debutant] - C - Programmation

Marsh Posté le 07-12-2007 à 17:50:04    

Bonjour,  
 
j'apprends actuellement le langage C. Et pour m'amuser un peu, j'ai code ce petit jeu du 'mastermind'. Une version simple, en mode console. Et j'aimerais connaitre vos avis sur mon code. Je tiens à préciser tout de meme, que je débute. Donc j'ai fait avec ce que je connais. J'ai notament un doute sur la fonction de saisie.
Merci de tous vos commentaires.
 
 

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define COUP_MAX    10      // Nombre de coup Maximal
  5. #define NB_CHIFFRE  5       // Nombre de chiffre dans le code
  6. #define BORNE_MAX   10      // Borne superieur du hasard
  7. // Different entrees pour le menu d'affichage
  8. #define RESULTAT    'r'
  9. #define GAGNE       'g'
  10. #define PERDU       'p'
  11. #define MENU        'm'
  12. // Fonctions externes
  13. int hasard ();
  14. void saisie (int ROW);
  15. void teste (int i, int ROW);
  16. void affichage(char mode, int ROW);
  17. void init_res ();
  18. // Variables externes
  19. int essai[COUP_MAX][NB_CHIFFRE];        // Tableau conteant les combinaisons essayees
  20. char res[COUP_MAX][NB_CHIFFRE];         // Tableau contenant les resultats de chaques combinaisons
  21. int code[NB_CHIFFRE];                   // Tableau contenant le code a decouvrir
  22. int bon;                                // Indique le nombre de chiffre correctement decode
  23. // Programme principal
  24. int main()
  25. {
  26.     int ROW;                        // Indique la ligne en cours de traitement
  27.     int coup;                       // Indique le nombre de coup joue
  28.     int i;
  29.     coup = 1;
  30.     ROW = 0;
  31.     // initialise le tableau RES
  32.     init_res ();
  33.     // Generation du code aleatoire
  34.     srand(time(NULL));
  35.     for (i = 0; i < NB_CHIFFRE; i++)
  36.         code[i] = hasard();
  37.     // Affichage du menu
  38.     affichage(MENU,0);
  39.     // Test de l'essai
  40.     do {
  41.         saisie(ROW);
  42.         bon = 0;
  43.         for (i = 0; i < NB_CHIFFRE; i++) {
  44.             teste(i,ROW);
  45.         }
  46.         affichage(RESULTAT,ROW);
  47.         ROW++;
  48.         coup++;
  49.     }
  50.     while (bon != NB_CHIFFRE && coup <= COUP_MAX);
  51.     if (bon == NB_CHIFFRE)
  52.         affichage(GAGNE,0);
  53.     else
  54.         affichage(PERDU,0);
  55.     return 0;
  56. }
  57. // FONCTION INITIALISATION DU TABLEAU RESULTAT
  58. void init_res () {
  59.     int i,j;
  60.     for (j = 0; j < COUP_MAX; j++)
  61.         for (i = 0; i < NB_CHIFFRE; i++) {
  62.             res[j][i] = '.';
  63.         }
  64. }
  65. // FONCTION HASARD
  66. int hasard() {
  67.     return rand() % BORNE_MAX;
  68. }
  69. // FONCTION DE SAISIE DE LA COMBINAISON
  70. void saisie (int ROW) {
  71.     int i;
  72.     char c;
  73.     char chaine[20];
  74.     printf("\nEntrez votre combinaison : " );
  75.     for (i = 0; (c = getchar()) != EOF && c != '\n'; i++) {
  76.         chaine[i] = c;
  77.     }
  78.     sscanf(chaine, "%d %d %d %d %d", &essai[ROW][0], &essai[ROW][1], &essai[ROW][2], &essai[ROW][3],&essai[ROW][4] );
  79. }
  80. // FONCTION TEST
  81. void teste (int i, int ROW) {
  82.     int j;
  83.     if (essai[ROW][i] == code[i]) {
  84.         bon++;
  85.         res[ROW][i] = '#';
  86.     }
  87.     else
  88.         for(j = 0; j < NB_CHIFFRE; j++)
  89.             if (essai[ROW][i] == code[j])
  90.                 res[ROW][i] = '*';
  91. }
  92. // FONCTION AFFICHAGE
  93. void affichage(char mode, int ROW) {
  94.     int i, j;
  95.     switch (mode) {
  96.         case 'r' :
  97.             system("clear" );
  98.             for (j = 0; j <= ROW; j++) {
  99.                 for (i = 0; i < NB_CHIFFRE; i++)
  100.                     printf("%d ", essai[j][i]);
  101.                 printf("\t" );
  102.                 for (i = 0; i < NB_CHIFFRE; i++)
  103.                     printf("%c ", res[j][i]);
  104.                 printf("\n" );
  105.             }
  106.             break;
  107.         case 'p' :
  108.             printf("\nPERDU, le code correct etait :\t" );
  109.             for (i = 0; i < NB_CHIFFRE; i++)
  110.                 printf("%d ", code[i]);
  111.             printf("\n\n" );
  112.             break;
  113.         case 'g' :
  114.             printf("\nGAGNE, le code etait bien :\t" );
  115.             for (i = 0; i < NB_CHIFFRE; i++)
  116.                 printf("%d ", code[i]);
  117.             printf("\n\n" );
  118.             break;
  119.         case 'm' :
  120.             printf("\t*****************************\n" );
  121.             printf("\t*                           *\n" );
  122.             printf("\t*        MASTERMIND         *\n" );
  123.             printf("\t*                           *\n" );
  124.             printf("\t*****************************\n" );
  125.             printf("\n\n" );
  126.             printf(" - Utilisez les combinaisons dans le style : a b c d e puis 'entree'\n" );
  127.             printf(" - Les nombres possibles sont compris entre 0 et 9" );
  128.             printf("\n\n" );
  129.             break;
  130.     }
  131. }


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 07-12-2007 à 17:50:04   

Reply

Marsh Posté le 08-12-2007 à 16:44:37    

Salut.

le fou a écrit :


Code :
  1. // Variables externes
  2. int essai[COUP_MAX][NB_CHIFFRE];        // Tableau conteant les combinaisons essayees
  3. char res[COUP_MAX][NB_CHIFFRE];         // Tableau contenant les resultats de chaques combinaisons
  4. int code[NB_CHIFFRE];                   // Tableau contenant le code a decouvrir
  5. int bon;                                // Indique le nombre de chiffre correctement decode



 
les variables globales, c'est le mal...
 

le fou a écrit :


Code :
  1. // FONCTION DE SAISIE DE LA COMBINAISON
  2. void saisie (int ROW) {
  3.     int i;
  4.     char c;
  5.     char chaine[20];
  6.     printf("\nEntrez votre combinaison : " );
  7.     for (i = 0; (c = getchar()) != EOF && c != '\n'; i++) {
  8.         chaine[i] = c;
  9.     }
  10.     sscanf(chaine, "%d %d %d %d %d", &essai[ROW][0], &essai[ROW][1], &essai[ROW][2], &essai[ROW][3],&essai[ROW][4] );
  11. }



 
Et pourquoi pas un simple:

Code :
  1. void saisie (int ROW, int essai[COUP_MAX][NB_CHIFFRE])
  2. {
  3.      printf("\nEntrez votre combinaison : " );
  4.      scanf("%d %d %d %d %d", &essai[ROW][0], &essai[ROW][1], &essai[ROW][2], &essai[ROW][3],&essai[ROW][4] );
  5. }


 
 
Ca a l'air de bien fonctionner quand même, je me suis même surpris à faire plusieurs parties :D

Message cité 1 fois
Message édité par ptitchep le 08-12-2007 à 16:47:54

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 08-12-2007 à 19:42:39    

ptitchep a écrit :

Salut.
les variables globales, c'est le mal...


 
Il est vrai. Une fois que j'aurais entamé le chapitre sur les pointeurs, je passerais les pointeurs en paramétres pour les fonctions.
 
 
 

ptitchep a écrit :


Et pourquoi pas un simple:

Code :
  1. void saisie (int ROW, int essai[COUP_MAX][NB_CHIFFRE])
  2. {
  3.      printf("\nEntrez votre combinaison : " );
  4.      scanf("%d %d %d %d %d", &essai[ROW][0], &essai[ROW][1], &essai[ROW][2], &essai[ROW][3],&essai[ROW][4] );
  5. }




 
Ben, de ce que j'ai lu, la fonction scanf peut poser probléme si elle est mal employé. Donc j'ai preferé utilisé getchar(). Mais je me trompe peut etre.
 

ptitchep a écrit :


Ca a l'air de bien fonctionner quand même, je me suis même surpris à faire plusieurs parties :D


 
Merci, au moins ca veut dire qu'il marche. Enfin sur linux. Puisqu'a cause de la commande : system("clear" ) , c'est jouable uniquement sur linux.  


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 08-12-2007 à 19:56:49    

le fou a écrit :


 
Il est vrai. Une fois que j'aurais entamé le chapitre sur les pointeurs, je passerais les pointeurs en paramétres pour les fonctions.
 
 
 


y'a pas besoin de pointeurs pour passer des variables en paramètre o_O
(sauf si tu veux en modifier le contenu, mais apparemment ce n'est pas justifié ici)
 

le fou a écrit :


 
Ben, de ce que j'ai lu, la fonction scanf peut poser probléme si elle est mal employé. Donc j'ai preferé utilisé getchar(). Mais je me trompe peut etre.
 


fgets() est meilleur
 

le fou a écrit :


 
Merci, au moins ca veut dire qu'il marche. Enfin sur linux. Puisqu'a cause de la commande : system("clear" ) , c'est jouable uniquement sur linux.  


system("cls" ) pour windows

Reply

Marsh Posté le 08-12-2007 à 22:54:55    

Harkonnen a écrit :


y'a pas besoin de pointeurs pour passer des variables en paramètre o_O
(sauf si tu veux en modifier le contenu, mais apparemment ce n'est pas justifié ici)
 


C'est pas faux. C'etait une premiere version. Je vais donc essayer de l'ameliorer. Merci.
 
 

Harkonnen a écrit :


fgets() est meilleur
 


D'accord, alors je vais changer.
 
 

Harkonnen a écrit :


system("cls";) pour windows


Oui, je connais. Mais comme je programme sous linux, j'utilise les commandes pour nux. De plus, j'ai lu, que de toute facon c'etait pas tres bon de faire ce genre de chose. Pour des questions de portabilité notamment.


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 09-12-2007 à 02:57:49    

le fou a écrit :


Oui, je connais. Mais comme je programme sous linux, j'utilise les commandes pour nux. De plus, j'ai lu, que de toute facon c'etait pas tres bon de faire ce genre de chose. Pour des questions de portabilité notamment.


 
Tout à fait, mais pas seulement : effacer le contenu d'une console, c'est mal.

Reply

Marsh Posté le 10-12-2007 à 12:06:04    

Elmoricq a écrit :


 
Tout à fait, mais pas seulement : effacer le contenu d'une console, c'est mal.


OK, alors je les enleves.  
 
De plus, j'ai finalement utilisé fgets suivi d'un sscanf pour recuperer les entiers, et controlés aussi ce que je recupere.


---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 10-12-2007 à 12:12:39    

[:romf]

Reply

Marsh Posté le 10-12-2007 à 18:37:02    

Bon aprés avoir lu vos remarques, et relu les régles du mastermind j'ai effectué quelques changements. Voici la nouvelle version :  

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #define COUP_MAX    12      // Nombre de coup Maximal
  5. #define NB_CHIFFRE  5       // Nombre de chiffre dans le code
  6. #define BORNE_MAX   10      // Borne superieur du hasard
  7. // Different entrees pour le menu d'affichage
  8. #define RESULTAT    'r'
  9. #define GAGNE       'g'
  10. #define PERDU       'p'
  11. #define MENU        'm'
  12. #define IN  1
  13. // Fonctions externes
  14. static void init_res (char res[COUP_MAX][NB_CHIFFRE]);
  15. static void raz_chiffre (int chiffre[2][10]);
  16. static int hasard(void);
  17. static void saisie (int ROW, int essai[COUP_MAX][NB_CHIFFRE]);
  18. static void teste (int ROW, int *p_bon,char res[COUP_MAX][NB_CHIFFRE], int code[NB_CHIFFRE], int essai[COUP_MAX][NB_CHIFFRE], int chiffre[2][10]);
  19. static void affichage(char mode, int ROW, char res[COUP_MAX][NB_CHIFFRE], int code[NB_CHIFFRE], int essai[COUP_MAX][NB_CHIFFRE]);
  20. // Programme principal
  21. int main(void)
  22. {
  23.     int essai[COUP_MAX][NB_CHIFFRE] = {{0}};            // Tableau conteant les combinaisons essayees
  24.     char res[COUP_MAX][NB_CHIFFRE];                     // Tableau contenant les resultats de chaques combinaisons
  25.     int code[NB_CHIFFRE] = {0};                         // Tableau contenant le code a decouvrir
  26.     int chiffre[2][10] = {{0,1,2,3,4,5,6,7,8,9},{0}};   // Tableau de controle des valeurs jouees
  27.     int bon;
  28.     int ROW;                        // Indique la ligne en cours de traitement
  29.     int coup;                       // Indique le nombre de coup joue
  30.     int i;
  31.     coup = 1;
  32.     ROW = 0;
  33.     // initialise le tableau RES & CODE
  34.     init_res (res);
  35.     // Generation du code aleatoire
  36.     srand(time(NULL));
  37.     for (i = 0; i < NB_CHIFFRE; i++) {
  38.         code[i] = hasard();
  39.         printf("%d ", code[i]);
  40.     }
  41.     // Affichage du menu
  42.     affichage(MENU,0,res,code,essai);
  43.     // Test de l'essai
  44.     do {
  45.         saisie(ROW,essai);
  46.         bon = 0;
  47.         teste(ROW,&bon,res,code,essai,chiffre);     // On teste le code entré
  48.         affichage(RESULTAT,ROW,res,code,essai);     // On affiche le code essaye et son resultat
  49.         raz_chiffre(chiffre);                       // On reinitialise le tableau de controle
  50.         ROW++;
  51.         coup++;
  52.     }
  53.     while (bon != NB_CHIFFRE && coup <= COUP_MAX);
  54.     if (bon == NB_CHIFFRE)
  55.         affichage(GAGNE,0,res,code,essai);
  56.     else
  57.         affichage(PERDU,0,res,code,essai);
  58.     return 0;
  59. }
  60. // FONCTION INITIALISATION DU TABLEAU RESULTAT
  61. static void init_res (char res[COUP_MAX][NB_CHIFFRE]) {
  62.     int j;
  63.     for (j = 0; j < COUP_MAX; j++) {
  64.         int i;
  65.         for (i = 0; i < NB_CHIFFRE; i++)
  66.             res[j][i] = '.';
  67.     }
  68. }
  69. // FONCTION REMISE A ZERO DU CODE TEMP
  70. static void raz_chiffre (int chiffre[2][10]) {
  71.     int i;
  72.     for (i = 0; i < 10; i++)
  73.         chiffre[1][i] = 0;
  74. }
  75. // FONCTION HASARD
  76. static int hasard(void) {
  77.     return (int)(rand()/(double)RAND_MAX * (BORNE_MAX));
  78. }
  79. // FONCTION DE SAISIE DE LA COMBINAISON
  80. static void saisie (int ROW, int essai[COUP_MAX][NB_CHIFFRE]) {
  81.     int n;
  82.     do {
  83.         char chaine[20];
  84.         printf("\nEntrez votre combinaison : " );
  85.         fgets(chaine, sizeof chaine, stdin);
  86.         n = sscanf(chaine, "%d %d %d %d %d", &essai[ROW][0], &essai[ROW][1], &essai[ROW][2], &essai[ROW][3],&essai[ROW][4] );
  87.         if (n != NB_CHIFFRE)
  88.             puts("ERREUR" );
  89.     }
  90.     while (n != NB_CHIFFRE);
  91. }
  92. // FONCTION TEST
  93. static void teste (int ROW, int *p_bon, char res[COUP_MAX][NB_CHIFFRE], int code[NB_CHIFFRE], int essai[COUP_MAX][NB_CHIFFRE], int chiffre[2][10]) {
  94.     int i,j,k;
  95.     k = 0;
  96.     /* boucle pour les valeurs presentes et bien placees*/
  97.     for (i = 0; i < NB_CHIFFRE; i++)
  98.         if (essai[ROW][i] == code[i]) {
  99.             res[ROW][k++] = '#';
  100.             chiffre[1][essai[ROW][i]] = IN;
  101.             (*p_bon)++;
  102.         }
  103.     /* boucle pour les valeurs presentes mais mal placees */
  104.     for (i = 0; i < NB_CHIFFRE; i++)
  105.         for (j = 0; j < NB_CHIFFRE; j++)
  106.             if (essai[ROW][i] == code[j] && j != i && chiffre[1][essai[ROW][i]] != IN) {
  107.                 res[ROW][k++] = '*';
  108.                 chiffre[1][essai[ROW][i]] = IN;
  109.             }
  110. }
  111. // FONCTION AFFICHAGE
  112. static void affichage(char mode, int ROW, char res[COUP_MAX][NB_CHIFFRE], int code[NB_CHIFFRE], int essai[COUP_MAX][NB_CHIFFRE]) {
  113.     int i, j;
  114.     switch (mode) {
  115.         case 'r' :
  116.              for (j = 0; j <= ROW; j++) {
  117.                 for (i = 0; i < NB_CHIFFRE; i++)
  118.                     printf("%d ", essai[j][i]);
  119.                 printf("\t" );
  120.                 for (i = 0; i < NB_CHIFFRE; i++)
  121.                     printf("%c ", res[j][i]);
  122.                 printf("\n" );
  123.             }
  124.             break;
  125.         case 'p' :
  126.             printf("\nPERDU, le code correct etait :\t" );
  127.             for (i = 0; i < NB_CHIFFRE; i++)
  128.                 printf("%d ", code[i]);
  129.             printf("\n\n" );
  130.             break;
  131.         case 'g' :
  132.             printf("\nGAGNE, le code etait bien :\t" );
  133.             for (i = 0; i < NB_CHIFFRE; i++)
  134.                 printf("%d ", code[i]);
  135.             printf("\n\n" );
  136.             break;
  137.         case 'm' :
  138.             printf("\t*****************************\n" );
  139.             printf("\t*                           *\n" );
  140.             printf("\t*        MASTERMIND         *\n" );
  141.             printf("\t*                           *\n" );
  142.             printf("\t*****************************\n" );
  143.             printf("\n\n" );
  144.             printf(" - Utilisez les combinaisons dans le style : a b c d e puis 'entree'\n" );
  145.             printf(" - Les nombres possibles sont compris entre 0 et 9" );
  146.             printf("\n\n" );
  147.             break;
  148.     }
  149. }


 
Ps : les remarques sont toujours les bienvenues. Les critiques aussi.


Message édité par le fou le 10-12-2007 à 18:38:02

---------------
Celui qui sauve une vie, sauve l'humanité (Le Talmud) - Personne n'a plus grand amour que celui de donner sa vie pour ses amis (Jean XV, 13)
Reply

Marsh Posté le 28-03-2009 à 15:40:07    

salut je voudrais créer un mode multijoueur controler par le tps un peu coe au motus. et ca me casse la tete.tu peux m'aider stp. wilbert_tsagueu@yahoo.fr

Reply

Marsh Posté le 28-03-2009 à 15:40:07   

Reply

Marsh Posté le 28-03-2009 à 15:45:51    

tu vas upper combien de topics pour que gens fassent ton boulot à ta place ?

Reply

Marsh Posté le 29-03-2009 à 12:53:19    

On va voir ce que la modération en pense :o


---------------
Si la vérité est découverte par quelqu'un d'autre,elle perd toujours un peu d'attrait
Reply

Marsh Posté le 29-03-2009 à 13:57:22    

sean_scotty a écrit :

salut je voudrais créer un mode multijoueur controler par le tps un peu coe au motus. et ca me casse la tete.tu peux m'aider stp. wilbert_tsagueu@yahoo.fr


Quand tu auras fini de upper tous les topics relatifs au Mastermind, tu pourras enfin commencer à ton algo de multijoueur controlé par IA (keywords : Minimax, Negamax, Alpha-béta...).
En attendant, un petit séjour chez les télétubbies te permettra d'approfondir ces notions.


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed