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
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");
    }
}
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
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
            }
        }
    }
}