Salut a tous je suis débutant en langage c et pour un projet d'algo on doit réaliser un jeu de mastermind. J'arrive à lancer mon programme mais celui ci ne marche pas correctement, par exemple quand je rentre une combinaison de chiffres non valide ( trop de chiffres) il ne fait aucune différence et indique toujours 0 pions bien placés et 0 pions mal placés. Je pense que cela vient de gets dans jeu.c qui au début était cgets mais compil impossible.
J'espère que vous pourrez m'aider.
Le code:
main.c
jeu.c
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include<conio.h> #include "jeu.h" #include "constantes.h" void main(void) // gestion de la partie { int combi_secret[NPOS]; //combinaison secrète tirée par le programme int prop[NPOS];//proposition du joueur int nbrcoup;// compte le nombre de coups joués int bpos;//nombre de chiffres exacts et bien placés int bchif;//nombre de chiffres exacts mais mal placés int i,ok=0; intro_txt(); tirage_aleatoire(combi_secret); //tirage aléatoire de la combinaison secrète nbrcoup=0; do{ while(!ok) { printf("\n Entrez une combinaison:\n"); if(combi_entree_par_joueur(&prop)) //jai rajouter le ==0 c'est que la proposition est correcte { ok=1; } else { printf("\nProposition incorecte !Entrez une autre combinaison .\n"); } } analyse_combi_saisie(prop,combi_secret,&bpos,&bchif); // on est sorti de la boucle car ok=1 > combinaison valide printf("\n%22d P %dC\n",bpos,bchif); nbrcoup++; // on incrémente le nbr d'essai } while((bpos< NPOS) && (nbrcoup <NCMAX)); //condition de sortie de la boucle if(bpos==NPOS) { printf("\nVous avez trouve la combinaison secrete en %d coups", nbrcoup); } else { printf("\nVous n'avez pas trouve en %d coups.\n", NCMAX); printf("\nLa bonne combinaison etait: "); for(i=0;i<NPOS;i++) { printf("%d",combi_secret[i]); } printf("\n\n\n"); } }
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81 void tirage_aleatoire(int tir[NPOS]) // on passe en parametres un tab de int contenant la solution: on la modifie { int i; srand(time(NULL)); //init de random for(i=0; i< NPOS; i++) { tir[i]= rand() / (RAND_MAX +1.) * NCHIF +1; //tir[i]=rand()%RAND_MAX; } } //Fonction de lecture de la proposition du joueur avec controle de validité et conversion char[]>>int [] int combi_entree_par_joueur(int prop[NPOS]) { char ch[NPOS+3]; // chaine ou sera lue la proposition du joueur:on fait de la place en + : 3 cases en plus dans chaine de caract ( [0] nbr max de caract a entrer,\0, [2]nbr caract reel de la chaine) int i; //lecture proposition du joueur dans chaine ch ch[0]=NPOS+1; // +1 car on compte en plus le \0 :: Préparation longueur max chaine lue gets(ch); //la fonction lit les 6 caractères rentrés: pas plus> SANS CGETS ca a l'air de marcher //controles if(strlen(&ch[2]) != NPOS) //fonction type: strlen(char* ) : compte le nbr de caractères de ch; or char ch[NPOS] = char* ch : tableau de char { //pas compris &ch[2] jaurai mis [1] ????? return -1; //on a pas autant de chiffres: de caract que de cases dans le jeu > entree incorecte direct } for(i=2; i<NPOS+2;i++) // car en NPOS+3 c'est \0 { if(ch[i] < '1' || ch[i]> '1'+NCHIF-1) { //val:49 return -1; //reponse invalide } } //extraction des chiffres entres au clavier : conversion char[]>> int[] for(i=0; i<NPOS;i++) { prop[i]=ch[2+i] -'0'; // on met l'essai du joueur dans int prop[] } return 0; //reponse valide } //Fonction d'analyse de la proposition du joueur: indique les chiffres exacts bien placés ou non void analyse_combi_saisie(int prop[], int combi_secret[],int bpos[], int bchif[]) { int combi_secret_BIS[NPOS]; int i,j; for(i=0;i<NPOS;i++) { combi_secret_BIS[i]=combi_secret[i]; //copie de la combinaison secrète pour ne pas la modifier } //comptage des bons chiffres exacts et bien placés *bpos=0; for(i=0;i<NPOS;i++) { if(prop[i]==combi_secret_BIS[i]) { (*bpos)++; // incremente le nbr de chiffre exact et bien placés combi_secret_BIS[i]=prop[i]=0; //alors on "supprime" cette valeur pour ne pas la recompter } } //Comptage bons chiffres mais mal placés *bchif=0; for(i=0;i<NPOS;i++) { for(j=0;j<NPOS;j++) //2eme boucle permet de se déplacer dans la combinaison secrète tiree via j , à i fixé sur la proposition du joueur { if(prop[i] != 0 && prop[i]==combi_secret_BIS[j]) // prop[i] != 0 c'est qu'on ne l'a pas compté comme exact et bien places > ok { (*bchif)++; prop[i]=combi_secret_BIS[j]=0; //alors on "supprime" cette valeur pour ne pas la recompter } } } }
Partager