Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1434 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1654750
le fou
Forza Massallia
Posté le 07-12-2007 à 17:50:04  profilanswer
 

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)
mood
Publicité
Posté le 07-12-2007 à 17:50:04  profilanswer
 

n°1654996
ptitchep
Posté le 08-12-2007 à 16:44:37  profilanswer
 

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
n°1655033
le fou
Forza Massallia
Posté le 08-12-2007 à 19:42:39  profilanswer
 

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)
n°1655038
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 08-12-2007 à 19:56:49  profilanswer
 

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

n°1655093
le fou
Forza Massallia
Posté le 08-12-2007 à 22:54:55  profilanswer
 

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)
n°1655142
Elmoricq
Modérateur
Posté le 09-12-2007 à 02:57:49  profilanswer
 

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.

n°1655767
le fou
Forza Massallia
Posté le 10-12-2007 à 12:06:04  profilanswer
 

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)
n°1655769
Elmoricq
Modérateur
Posté le 10-12-2007 à 12:12:39  profilanswer
 

[:romf]

n°1656083
le fou
Forza Massallia
Posté le 10-12-2007 à 18:37:02  profilanswer
 

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)
n°1866975
sean_scott​y
Posté le 28-03-2009 à 15:40:07  profilanswer
 

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

mood
Publicité
Posté le 28-03-2009 à 15:40:07  profilanswer
 

n°1866977
Profil sup​primé
Posté le 28-03-2009 à 15:45:51  answer
 

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

n°1867063
esox_ch
Posté le 29-03-2009 à 12:53:19  profilanswer
 

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
n°1867073
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 29-03-2009 à 13:57:22  profilanswer
 

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)

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
problème programme TableauCherche qq'un qui voudrais réécrire mon programme JAVA (ou en Windev)
[Oracle - Débutant] Exporter le résultat d'une requête dans un fichierDébutant html - Insertion d'image & navigateurs
Probleme porgramme VBcréation programme pour piloter le port parallèle
temps de réponse d'un programmeProgramme en Maple
html / php problème débutantProbleme boucle (debutant) Urgennttttttt
Plus de sujets relatifs à : [debutant] Programme perso de mastermind, qu'en pensez-vous?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR