Partage
  • Partager sur Facebook
  • Partager sur Twitter

Reproduire le jeu Undercover dans la console

problème d'attribution des rôles aux joueurs

    9 novembre 2022 à 14:40:36

    Bonjour à toutes et à tous,

    Le week-end passé j'ai découvert un jeu sur téléphone qui se nomme Undercover qu'on peut aussi retrouver sur le net : https://uc.hashcode.dev/

    Le code source et les règles peuvent être retrouvées ici : https://github.com/Shaance/Undercover

    Le contexte étant posé je cherche à reproduire ce jeu dans la console et je bloque à l'étape d'attribution des rôles aux joueurs (tout les rôles ne sont pas pourvus et certains rôles écrasent des rôles pré-existants.

    Sortie de console :

    Combien de joueurs sont de la partie ? [3 min, 20 max]
    6
    6 Joueurs
    ___________
    3 Civils
    2 Undercover
    1 Mr. White
    Voulez-vous rajouter un personnage (Non : 0)?0
    Enlever un joueur ? (Non : 0)0
    On garde la configuration initiale
    Donnez le nom du joueur 1
    Maxime
    Donnez le nom du joueur 2
    Georges
    Donnez le nom du joueur 3
    Jonnathan
    Donnez le nom du joueur 4
    Myriam
    Donnez le nom du joueur 5
    Caroline
    Donnez le nom du joueur 6
    Sarah
    Voici le nom du joueur 1 : Maxime
    Voici le nom du joueur 2 : Georges
    Voici le nom du joueur 3 : Jonnathan
    Voici le nom du joueur 4 : Myriam
    Voici le nom du joueur 5 : Caroline
    Voici le nom du joueur 6 : Sarah
    Pseudo : Maxime Role :
    Pseudo : Georges Role :
    Pseudo : Jonnathan Role :
    Pseudo : Myriam Role : Civilsover
    Pseudo : Caroline Role : Undercover
    Pseudo : Sarah Role : Civilsite

    Process returned 0 (0x0)   execution time : 33.936 s
    Press any key to continue.

    Code :

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <string.h>
    #include <stdbool.h>
    
    int main (int argc, char** argv)
    {
        srand(time(NULL));
        int joueurHasard = 0;
    
        struct Joueurs
    {
        char pseudo[100];
        char role[100];
        bool ingame;
    }joueurs[20] = {NULL};
    
        double nbjoueurs = 0;
        printf("Combien de joueurs sont de la partie ? [3 min, 20 max]\n");
        scanf("%lf", &nbjoueurs);
    
        char joueur[] = "Joueur", civils[] = "Civils", undercover[] = "Undercover", mrwhite[] = "Mr. White";
        int tailleCivils = sizeof(civils), tailleUndercover = sizeof(undercover), tailleMrWhite = sizeof(mrwhite);
    
        double nbcivils = 0, nbundercover = 0, nbmrwhite = 0;
        if (nbjoueurs>=3 && nbjoueurs<=20)
        {
        printf("%0.lf Joueurs\n___________\n", nbjoueurs);
        nbcivils=ceil(nbjoueurs/2);
        printf("%0.lf Civils\n",nbcivils);
        if(nbjoueurs<11)
            nbmrwhite=1;
        else if(nbjoueurs>=11 && nbjoueurs<17)
            nbmrwhite=2;
        else
            nbmrwhite=3;
        nbundercover=nbjoueurs-nbcivils-nbmrwhite;
        printf("%0.lf Undercover\n", nbundercover);
        printf("%0.lf Mr. White\n", nbmrwhite);
    
        bool rajout, supression, rajoutUndercover, rajoutMrwhite;
        printf("Voulez-vous rajouter un personnage (Non : 0)?");
        scanf("%d", &rajout);
        if (rajout)
        {
            printf("Rajouter un Undercover ? (Non : 0)");
            scanf("%d", &rajoutUndercover);
            if(rajoutUndercover && nbmrwhite>0)
            {
                nbundercover++;
                nbmrwhite--;
                printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                printf("%0.lf Civils\n",nbcivils);
                printf("%0.lf Undercover\n", nbundercover);
                printf("%0.lf Mr. White\n", nbmrwhite);
            }
            else if (!rajoutUndercover)
            {
                printf("Rajouter un Mr.White ? (Non : 0)");
                scanf("%d", &rajoutMrwhite);
                if (rajoutMrwhite && nbundercover>0)
                {
                nbmrwhite++;
                nbundercover--;
                printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                printf("%0.lf Civils\n",nbcivils);
                printf("%0.lf Undercover\n", nbundercover);
                printf("%0.lf Mr. White\n", nbmrwhite);
                }
            }
        }
        else if (!rajout)
        {
            printf("Enlever un joueur ? (Non : 0)");
            scanf("%d", &supression);
            if (supression)
            {
                printf("Supprimer un Undercover ? (Non : 0)");
                scanf("%d", &rajoutUndercover);
            if (rajoutUndercover && nbundercover>0)
            {
                nbundercover--;
                nbcivils++;
                printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                printf("%0.lf Civils\n",nbcivils);
                printf("%0.lf Undercover\n", nbundercover);
                printf("%0.lf Mr. White\n", nbmrwhite);
            }
            else if (!rajoutUndercover)
            {
                printf("Supprimer un Mr.White ? (Non : 0)");
                scanf("%d", &rajoutMrwhite);
                if (rajoutMrwhite && nbmrwhite>0 && nbundercover>0)
                {
                    nbmrwhite--;
                    nbcivils++;
                    printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                    printf("%0.lf Civils\n",nbcivils);
                    printf("%0.lf Undercover\n", nbundercover);
                    printf("%0.lf Mr. White\n", nbmrwhite);
                }
            }
        }
        else
            {
                printf("On garde la configuration initiale\n");
            }
        }
            else
            {
                printf("On ne change pas la configuration initiale\n");
            }
    
        for(int i=0; i<nbjoueurs; i++)
        {
            printf("Donnez le nom du joueur %d\n",i+1);
            scanf("%s", &joueurs[i].pseudo);
        }
        for(int i=0; i<nbjoueurs; i++)
        {
            printf("Voici le nom du joueur %d : %s\n", i+1, joueurs[i].pseudo);
        }
    
    //Attribuer un role par joueurs dans la partie (civils, undercover, mr.white)
        int aleatoire = (rand() % (int)nbjoueurs); //Tire un nombre entre 0 et nbjoueurs
        int aleatoire2 = (rand() % (int)nbjoueurs); //Tire un nombre entre 0 et nbjoueurs
    
    for(int i=0; i<nbcivils+1; i++)
        for(int j=0; j<tailleCivils; j++)
    {
    if(joueurs[aleatoire].role[j] == NULL)
    {
        joueurs[aleatoire].role[j] = civils[j];
    }
    else if(joueurs[aleatoire2].role[j] == NULL)
    {
        joueurs[aleatoire2].role[j] = civils[j];
    }
    else if(joueurs[aleatoire].role[j] != NULL && joueurs[aleatoire2].role[j] != NULL)
    {
        i++;
    }
    else
    {
        i--;
    }
    }
        int aleatoire3 = (rand() % (int)nbjoueurs); //Tire un nombre entre 0 et nbjoueurs
        int aleatoire4 = (rand() % (int)nbjoueurs); //Tire un nombre entre 0 et nbjoueurs
    for(int i=0; i<nbundercover+1; i++)
        for(int j=0; j<tailleUndercover; j++)
    {
    if(joueurs[aleatoire3].role[j] == NULL)
    {
        joueurs[aleatoire3].role[j] = undercover[j];
    }
    else if(joueurs[aleatoire4].role[j] == NULL)
    {
        joueurs[aleatoire4].role[j] = undercover[j];
    }
    else if(joueurs[aleatoire3].role[j] != NULL && joueurs[aleatoire4].role[j] != NULL)
    {
        i++;
    }
    else
    {
        i--;
    }
    }
    
        int aleatoire5 = (rand() % (int)nbjoueurs); //Tire un nombre entre 0 et nbjoueurs
        int aleatoire6 = (rand() % (int)nbjoueurs); //Tire un nombre entre 0 et nbjoueurs
    for(int i=0; i<nbmrwhite+1; i++)
        for(int j=0; j<tailleMrWhite; j++)
    {
    if(joueurs[aleatoire5].role[j] == NULL)
    {
        joueurs[aleatoire5].role[j] = mrwhite[j];
    }
    else if(joueurs[aleatoire6].role[j] == NULL)
    {
        joueurs[aleatoire6].role[j] = mrwhite[j];
    }
    else if(joueurs[aleatoire5].role[j] != NULL && joueurs[aleatoire6].role[j] != NULL)
    {
        i++;
    }
    else
    {
        i--;
    }
    }
    for(int i=0; i<nbjoueurs; i++)
    {
    printf("Pseudo : %s Role : %s\n", joueurs[i].pseudo, joueurs[i].role);
    }
    //Attribuer les cartes aux joueurs (ouvrir un .txt, lire une ligne au hasard, chaque ligne étant composée de 2 mots de signification proche (ex : Chat, Chien || Fast & furious, Need for Speed))
    //Le premier mot étant le mot majoritaire (à attribuer aux civils) et le second mot minoritaire (à attribuer aux undercover), les Mr.White n'ont pas de mots.
    
    //À chaque tour on propose un mot et à la fin du tour chaque joueur vote pour éliminer un joueur à la majorité (but : éliminer les undercover et surtout Mr.White)
    //Si Mr.White est éliminé il doit donner son avis sur le mot majoritaire, s'il est exact il gagne, autrement les Civils gagnent.
    
    }
        //Fin du programme
        else
        {
            printf("Nombre de joueurs invalide");
            exit(EXIT_FAILURE);
        }
    
        return 0;
    }
    

    Quelqu'un peut-il m'aider ?

    Merci d'avance :)

    • Partager sur Facebook
    • Partager sur Twitter
      9 novembre 2022 à 15:57:59

      Tu commences à faire des code conséquent, il serait donc temps de lire les warning et de les corriger ! (il y en a tout de même 25).

      Penses aussi a indenter ton code correctement, il sera plus facile à lire pour tout le monde. 

      • Partager sur Facebook
      • Partager sur Twitter
      ...
        9 novembre 2022 à 17:17:47

        Salut S kO,

        Pour copier une chaîne C dans une autre utilise strcpy() ou strncpy() au lieu de copier les char un par un (ces fonctions n'oublient pas de copier le '\0' final...).

        Plutôt que copier une chaîne tu pourrais créer un enum représentant chaque type de rôle et copier un enum.

        enum roles { CIVIL, UNDERCOVER, MR_WHITE };

        Cela se copie avec l'opérateur = simplement (c'est un type entier : CIVIL vaut 0, UNDERCOVER 1, MR_WHITE 2), et tu pourras ainsi utiliser les enum dans la suite de ton jeu, dans des switch / case par exemple, utiliser l'opérateur d'égalité == pour vérifier commodément si un joueur appartient à tel ou tel rôle, etc., et si tu as besoin d'afficher des chaînes de caractères, tu peux toujours te faire un tableau de chaînes comme ceci :

        const char * str_role[] = {
                [CIVIL]      = "Civil",
                [UNDERCOVER] = "Undercover",
                [MR_WHITE]   = "Mr. White"
        };

        et pour afficher "Civil" tu pourras faire printf("%s\n", str_role[CIVIL]);

        Ton problème est aussi que tu ne parviens pas à attribuer aléatoirement 3 rôles d'un premier type, 2 rôles d'un second et un rôle d'un troisième dans un tableau de 6 sans répétition et sans trous. Pour cela, le mieux est de raisonner à l'envers : tu remplis ton tableau de tous les rôles à attribuer dans l'ordre afin de t'assurer que tous les rôles sont attribués pour le nombre prévu, puis tu les mélanges aléatoirement en faisant des permutations.

        Voilà un exemple :

        #include <stdio.h>
        #include <stdlib.h>
        #include <time.h>
        #include <stdbool.h>
        
        enum roles { CIVIL, UNDERCOVER, MR_WHITE };
        const char * str_role[] = {
                [CIVIL]      = "Civil",
                [UNDERCOVER] = "Undercover",
                [MR_WHITE]   = "Mr. White"
        };
        
        struct Joueurs {
                char pseudo[100];
                enum roles role;
                bool ingame;
        } joueurs[20] = { '\0' };
        
        
        int main(void) {
                /* simulation données de départ, initialiser srand(), etc. */
                srand(time(NULL));
                int nbjoueurs = 6;
                int nbcivils = 3;
                int nbundercover = 2;
                int nbmrwhite = 1;
        
                /* on attribue les rôles exhaustivement */
                int j = 0;
                for (int i = 0; i < nbcivils; i++)
                        joueurs[j++].role = CIVIL;
                for (int i = 0; i < nbundercover; i++)
                        joueurs[j++].role = UNDERCOVER;
                for (int i = 0; i < nbmrwhite; i++)
                        joueurs[j++].role = MR_WHITE;
                /* puis on mélange les rôles
                 * https://fr.wikipedia.org/wiki/M%C3%A9lange_de_Fisher-Yates
                 */
                for (int i = nbjoueurs - 1; i >= 1; i--) {
                        int j = rand() % (i + 1);
                        enum roles temp = joueurs[i].role;
                        joueurs[i].role = joueurs[j].role;
                        joueurs[j].role = temp;
        
                }
        
                for (int i = 0; i < nbjoueurs; i++)
                        printf("Joueur %d - rôle %s\n", i, str_role[joueurs[i].role]);
        
                return 0;
        }

        Cela donne :

        $ gcc -Wall -Wextra undercover.c
        $ ./a.out 
        Joueur 0 - rôle Undercover
        Joueur 1 - rôle Mr. White
        Joueur 2 - rôle Undercover
        Joueur 3 - rôle Civil
        Joueur 4 - rôle Civil
        Joueur 5 - rôle Civil
        

        -
        Edité par Dlks 9 novembre 2022 à 17:42:19

        • Partager sur Facebook
        • Partager sur Twitter
          9 novembre 2022 à 17:55:36

          Hello,

          Il y a aussi un problème avec les scanf() pour une variable de tpe bool: il n'existe pas (à ma connaissance) de format pour le type bool, et par expérience je sais que le format %d n'est pas correct.

          Edit: j'ai retrouvé le programme qui posait problème:

          #include <stdio.h>
          #include <stdbool.h>
           
          int main (void) {
          	bool cont;
          //	int cont;
          	double tot_time=0.;
          	int pt=0;
          	do {
          		pt++;
          		int speed,distance;
          		printf("Pour aller du point %d au point %d,\n",pt,pt+1);
          		printf("\t- donnez votre vitesse : ");
          		scanf("%d", &speed);
          		printf("\t- donnez le nombre de kilomètres: ");
          		scanf("%d", &distance);
          		tot_time+=(double)distance/speed;
          		printf("Avez-vous d'autres etapes du parcours a une vitesse differente ? Oui = 1, Non = 0 ? ");
          		scanf("%d",&cont);
          	} while(cont);
          	printf("Le temps total du trajet sera de %d heures %d minutes\n",(int)tot_time,(int)((tot_time-(int)tot_time)*60));
          
          	return 0;
          }

          Lorsque cont est de type bool, si la réponse à la question "ajouter" est 1, pt est remis 0 et le programme affiche toujours "pour aller du point 1 au point 2"

          Et gcc signale le problème:

          d.c:19:11: warning: format '%d' expects argument of type 'int *', but argument 2 has type '_Bool *' [-Wformat=]
             scanf("%d",&cont);
                     ^
          

          -
          Edité par edgarjacobs 9 novembre 2022 à 18:15:28

          • Partager sur Facebook
          • Partager sur Twitter

          On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

            9 novembre 2022 à 19:16:24

            Merci rouIoude je vais essayer de régler ces warnings et indenter mon code.

            Encore un énorme merci Dlks tes propositions sont toujours pertinentes c'est agréable d'y voir plus clair avec ton recul.
            Je vais travailler ça et revenir quand j'aurai tout intégré.

            Effectivement je n'arrivait pas à gérer le nombre unique aléatoire et après avoir fouillé sur le net j'étais en train de corriger la condition mais je devais encore gérer la copie du rôle :

            for(int i=0; i<nbCivils; i++)
            {
                int aleatoire;
                int j;
                do {
                    aleatoire = (rand() % nbJoueurs); //Tire un nombre entre 0 et nbjoueurs
                    printf("Nb aleatoire : %d\n", aleatoire);
                for (j = 0 ; j < tailleCivils ; j++)
                {
                    joueurs[aleatoire].role[i] = civils[j];
                    if (joueurs[aleatoire].role[j] == joueurs[aleatoire].role[i])
                    break;
                }
                }
                while ( j < i );
            }

            Je vais faire comme tu me propose passer par l'énum pour attribuer un numéro de rôle et faire un strcpy pour copier la chaine.

            J'aime bien l'idée du mélange de Fisher-Yates l'incrémentation est efficace pour mélanger les indices du tableau.

            edgarjacobs c'était pour un ancien programme ça si je ne m'abuse, pour l'instant je n'ai pas affecter le bool ingame à un scanf

            • Partager sur Facebook
            • Partager sur Twitter
              9 novembre 2022 à 19:40:06

              S kO a écrit:

              edgarjacobs c'était pour un ancien programme ça si je ne m'abuse, pour l'instant je n'ai pas affecter le bool ingame à un scanf

              Non, pas à ce booléen-là. Mais lignes 44, 48, 61, 76, 80 et 93 tu fais un scanf() avec des variables de type bool !

              Et tu ferais bien de corriger toutes les warnings:

              s.c: In function 'main':
              s.c:9:11: warning: implicit declaration of function 'time' [-Wimplicit-function-declaration]
                   srand(time(NULL));
                         ^~~~
              s.c:9:11: warning: conversion to 'unsigned int' from 'int' may change the sign of the result [-Wsign-conversion]
              s.c:17:17: warning: initialization makes integer from pointer without a cast [-Wint-conversion]
               }joueurs[20] = {NULL};
                               ^~~~
              s.c:17:17: note: (near initialization for 'joueurs[0].pseudo[0]')
              s.c:44:13: warning: format '%d' expects argument of type 'int *', but argument 2 has type '_Bool *' [-Wformat=]
                   scanf("%d", &rajout);
                           ^
              s.c:48:17: warning: format '%d' expects argument of type 'int *', but argument 2 has type '_Bool *' [-Wformat=]
                       scanf("%d", &rajoutUndercover);
                               ^
              s.c:61:21: warning: format '%d' expects argument of type 'int *', but argument 2 has type '_Bool *' [-Wformat=]
                           scanf("%d", &rajoutMrwhite);
                                   ^
              s.c:76:17: warning: format '%d' expects argument of type 'int *', but argument 2 has type '_Bool *' [-Wformat=]
                       scanf("%d", &supression);
                               ^
              s.c:80:21: warning: format '%d' expects argument of type 'int *', but argument 2 has type '_Bool *' [-Wformat=]
                           scanf("%d", &rajoutUndercover);
                                   ^
              s.c:93:21: warning: format '%d' expects argument of type 'int *', but argument 2 has type '_Bool *' [-Wformat=]
                           scanf("%d", &rajoutMrwhite);
                                   ^
              s.c:118:17: warning: format '%s' expects argument of type 'char *', but argument 2 has type 'char (*)[100]' [-Wformat=]
                       scanf("%s", &joueurs[i].pseudo);
                               ^
              s.c:132:31: warning: comparison between pointer and integer
               if(joueurs[aleatoire].role[j] == NULL)
                                             ^~
              s.c:136:37: warning: comparison between pointer and integer
               else if(joueurs[aleatoire2].role[j] == NULL)
                                                   ^~
              s.c:140:36: warning: comparison between pointer and integer
               else if(joueurs[aleatoire].role[j] != NULL && joueurs[aleatoire2].role[j] != NULL)
                                                  ^~
              s.c:140:75: warning: comparison between pointer and integer
               else if(joueurs[aleatoire].role[j] != NULL && joueurs[aleatoire2].role[j] != NULL)
                                                                                         ^~
              s.c:154:32: warning: comparison between pointer and integer
               if(joueurs[aleatoire3].role[j] == NULL)
                                              ^~
              s.c:158:37: warning: comparison between pointer and integer
               else if(joueurs[aleatoire4].role[j] == NULL)
                                                   ^~
              s.c:162:37: warning: comparison between pointer and integer
               else if(joueurs[aleatoire3].role[j] != NULL && joueurs[aleatoire4].role[j] != NULL)
                                                   ^~
              s.c:162:76: warning: comparison between pointer and integer
               else if(joueurs[aleatoire3].role[j] != NULL && joueurs[aleatoire4].role[j] != NULL)
                                                                                          ^~
              s.c:177:32: warning: comparison between pointer and integer
               if(joueurs[aleatoire5].role[j] == NULL)
                                              ^~
              s.c:181:37: warning: comparison between pointer and integer
               else if(joueurs[aleatoire6].role[j] == NULL)
                                                   ^~
              s.c:185:37: warning: comparison between pointer and integer
               else if(joueurs[aleatoire5].role[j] != NULL && joueurs[aleatoire6].role[j] != NULL)
                                                   ^~
              s.c:185:76: warning: comparison between pointer and integer
               else if(joueurs[aleatoire5].role[j] != NULL && joueurs[aleatoire6].role[j] != NULL)
                                                                                          ^~
              s.c:23:10: warning: unused variable 'joueur' [-Wunused-variable]
                   char joueur[] = "Joueur", civils[] = "Civils", undercover[] = "Undercover", mrwhite[] = "Mr. White";
                        ^~~~~~
              s.c:10:9: warning: unused variable 'joueurHasard' [-Wunused-variable]
                   int joueurHasard = 0;
                       ^~~~~~~~~~~~
              s.c:7:15: warning: unused parameter 'argc' [-Wunused-parameter]
               int main (int argc, char** argv)
                             ^~~~
              s.c:7:28: warning: unused parameter 'argv' [-Wunused-parameter]
               int main (int argc, char** argv)
                                          ^~~~
              



              -
              Edité par edgarjacobs 9 novembre 2022 à 19:42:16

              • Partager sur Facebook
              • Partager sur Twitter

              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                10 novembre 2022 à 15:14:49

                Bien vu edgarjacobs merci, j'ai réglé tout les warnings sauf celui là :
                s.c|23|warning: implicit declaration of function 'time'; did you mean 'true'? [-Wimplicit-function-declaration]|

                Je suis quelque peu bloqué au niveau ligne 248 car Mr. White ne peut pas commencer à jouer vu qu'il n'a pas de mots, mais si je l'exclu il ne joue jamais.

                #include <stdio.h>
                #include <stdlib.h>
                #include <math.h>
                #include <string.h>
                #include <stdbool.h>
                #define TAILLE_MAX 100
                
                enum roles { CIVIL, UNDERCOVER, MR_WHITE };
                const char * str_role[] = {
                        [CIVIL]      = "Civil",
                        [UNDERCOVER] = "Undercover",
                        [MR_WHITE]   = "Mr. White"
                };
                
                struct Joueurs {
                        char pseudo[100];
                        enum roles role;
                        bool ingame;
                } joueurs[20] = { '\0' };
                
                int main (int argc, char** argv)
                {
                    srand(time(NULL));
                    int joueurHasard = 0;
                
                    double nbjoueurs = 0;
                    printf("Combien de joueurs sont de la partie ? [3 min, 20 max]\n");
                    scanf("%lf", &nbjoueurs);
                
                    double nbcivils = 0, nbundercover = 0, nbmrwhite = 0;
                    if (nbjoueurs>=3 && nbjoueurs<=20)
                    {
                    printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                    nbcivils=ceil(nbjoueurs/2);
                    printf("%0.lf Civils\n",nbcivils);
                    if(nbjoueurs<11)
                        nbmrwhite=1;
                    else if(nbjoueurs>=11 && nbjoueurs<17)
                        nbmrwhite=2;
                    else
                        nbmrwhite=3;
                    nbundercover=nbjoueurs-nbcivils-nbmrwhite;
                    printf("%0.lf Undercover\n", nbundercover);
                    printf("%0.lf Mr. White\n", nbmrwhite);
                
                    int rajout, supression, rajoutUndercover, rajoutMrwhite;
                    printf("Voulez-vous rajouter un personnage (Non : 0)?");
                    scanf("%d", &rajout);
                    if (rajout)
                    {
                        printf("Rajouter un Undercover ? (Non : 0)");
                        scanf("%d", &rajoutUndercover);
                        if(rajoutUndercover && nbmrwhite>0)
                        {
                            nbundercover++;
                            nbmrwhite--;
                            printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                            printf("%0.lf Civils\n",nbcivils);
                            printf("%0.lf Undercover\n", nbundercover);
                            printf("%0.lf Mr. White\n", nbmrwhite);
                        }
                        else if (!rajoutUndercover)
                        {
                            printf("Rajouter un Mr.White ? (Non : 0)");
                            scanf("%d", &rajoutMrwhite);
                            if (rajoutMrwhite && nbundercover>0)
                            {
                            nbmrwhite++;
                            nbundercover--;
                            printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                            printf("%0.lf Civils\n",nbcivils);
                            printf("%0.lf Undercover\n", nbundercover);
                            printf("%0.lf Mr. White\n", nbmrwhite);
                            }
                        }
                    }
                    else if (!rajout)
                    {
                        printf("Enlever un joueur ? (Non : 0)");
                        scanf("%d", &supression);
                        if (supression)
                        {
                            printf("Supprimer un Undercover ? (Non : 0)");
                            scanf("%d", &rajoutUndercover);
                        if (rajoutUndercover && nbundercover>0)
                        {
                            nbundercover--;
                            nbcivils++;
                            printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                            printf("%0.lf Civils\n",nbcivils);
                            printf("%0.lf Undercover\n", nbundercover);
                            printf("%0.lf Mr. White\n", nbmrwhite);
                        }
                        else if (!rajoutUndercover)
                        {
                            printf("Supprimer un Mr.White ? (Non : 0)");
                            scanf("%d", &rajoutMrwhite);
                            if (rajoutMrwhite && nbmrwhite>0 && nbundercover>0)
                            {
                                nbmrwhite--;
                                nbcivils++;
                                printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                printf("%0.lf Civils\n",nbcivils);
                                printf("%0.lf Undercover\n", nbundercover);
                                printf("%0.lf Mr. White\n", nbmrwhite);
                            }
                        }
                    }
                    else
                        {
                            printf("On garde la configuration initiale\n");
                        }
                    }
                        else
                        {
                            printf("On ne change pas la configuration initiale\n");
                        }
                
                    for(int i=0; i<nbjoueurs; i++)
                    {
                        printf("Donnez le nom du joueur %d\n",i+1);
                        scanf("%s", &joueurs[i].pseudo);
                    }
                
                /* on attribue les rôles exhaustivement */
                        int j = 0;
                        for (int i = 0; i < nbcivils; i++)
                                joueurs[j++].role = CIVIL;
                        for (int i = 0; i < nbundercover; i++)
                                joueurs[j++].role = UNDERCOVER;
                        for (int i = 0; i < nbmrwhite; i++)
                                joueurs[j++].role = MR_WHITE;
                        /* puis on mélange les rôles
                         * https://fr.wikipedia.org/wiki/M%C3%A9lange_de_Fisher-Yates
                         */
                        for (int i = nbjoueurs - 1; i >= 1; i--) {
                                int j = rand() % (int)nbjoueurs;
                                enum roles temp = joueurs[i].role;
                                joueurs[i].role = joueurs[j].role;
                                joueurs[j].role = temp;
                
                        }
                
                        for (int i = 0; i < nbjoueurs; i++)
                                printf("Joueur %s - role %s\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                //OK JUSQUE LA
                
                FILE* fichier = NULL;
                    fichier = fopen("undercover.txt", "w+");
                    if (fichier != NULL)
                    {
                        int nombreDeLignes = 3;
                        char motPrincipal1[] = "Chat", motSecondaire1[] = "Chien", motPrincipal2[] = "Fast_&_Furious", motSecondaire2[] = "Need_for_speed", motPrincipal3[] = "Faucon", motSecondaire3[] = "Aigle";
                        int taillemotPrincipal1 = sizeof(motPrincipal1), taillemotSecondaire1 = sizeof(motSecondaire1), taillemotPrincipal2 = sizeof(motPrincipal2), taillemotSecondaire2 = sizeof(motSecondaire2), taillemotPrincipal3 = sizeof(motPrincipal3), taillemotSecondaire3 = sizeof(motSecondaire3);
                
                        fprintf(fichier,"%s %s\n", motPrincipal1, motSecondaire1);
                        fprintf(fichier,"%s %s\n", motPrincipal2, motSecondaire2);
                        fprintf(fichier,"%s %s\n", motPrincipal3, motSecondaire3);
                
                        char lireMotPrincipal1[taillemotPrincipal1], lireMotSecondaire1[taillemotSecondaire1], lireMotPrincipal2[taillemotPrincipal2], lireMotSecondaire2[taillemotSecondaire2], lireMotPrincipal3[taillemotPrincipal3], lireMotSecondaire3[taillemotSecondaire3];
                        rewind(fichier);
                        fscanf(fichier, "%s %s", &lireMotPrincipal1, &lireMotSecondaire1);
                        fscanf(fichier, "%s %s", &lireMotPrincipal2, &lireMotSecondaire2);
                        fscanf(fichier, "%s %s", &lireMotPrincipal3, &lireMotSecondaire3);
                
                        int random = (rand() % nombreDeLignes)+1;
                
                        if(random == 1)
                        {
                        for (int i = 0; i <nbjoueurs; i++)
                        {
                            if (str_role[joueurs[i].role] == "Civil")
                                {
                                    system("pause");
                                    printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal1);
                                }
                            if (str_role[joueurs[i].role] == "Undercover")
                                {
                                    system("pause");
                                    printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire1);
                                }
                            if (str_role[joueurs[i].role] == "Mr. White")
                                {
                                    system("pause");
                                    printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                }
                        }
                        }
                        else if(random == 2)
                        {
                            for (int i = 0; i <nbjoueurs; i++)
                        {
                            if (str_role[joueurs[i].role] == "Civil")
                                {
                                    system("pause");
                                    printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal2);
                                }
                            if (str_role[joueurs[i].role] == "Undercover")
                                {
                                    system("pause");
                                    printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire2);
                                }
                            if (str_role[joueurs[i].role] == "Mr. White")
                                {
                                    system("pause");
                                    printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                }
                        }
                        }
                        else if(random == 3)
                        {
                            for (int i = 0; i <nbjoueurs; i++)
                        {
                            if (str_role[joueurs[i].role] == "Civil")
                                {
                                    system("pause");
                                    printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal3);
                                }
                            if (str_role[joueurs[i].role] == "Undercover")
                                {
                                    system("pause");
                                    printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire3);
                                }
                            if (str_role[joueurs[i].role] == "Mr. White")
                                {
                                    system("pause");
                                    printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                }
                        }
                        }
                        else
                        {
                            printf("Hors random");
                        }
                        //JUSQUE LA OK
                        char proposition[] = "";
                        for(int i=0; i<nbjoueurs; i++)
                        {   //Mr. White ne peut pas commencer le tour car il n'a pas de mot
                            joueurs[i].ingame = true;
                            if(joueurs[0].role != MR_WHITE && joueurs[i].ingame)
                            {
                                printf("%s fait une proposition en rapport avec le mot :\n", joueurs[i].pseudo);
                                scanf("%s", &proposition);
                                printf("%s propose le mot %s\n", joueurs[i].pseudo, proposition);
                            }
                            else
                            {
                                //printf("Ne peut pas jouer en premier\n");
                            }
                            //Ne fonctionne pas, même si Mr. White est le joueur 1 il arrive a jouer en premier..
                        }
                        //À chaque tour on propose un mot et à la fin du tour chaque joueur vote pour éliminer un joueur à la majorité (but : éliminer les undercover et surtout Mr.White)
                        //Si Mr.White est éliminé il doit donner son avis sur le mot majoritaire, s'il est exact il gagne, autrement les Civils gagnent.
                        fclose(fichier);
                    }
                    else
                    {
                        printf("Impossible d'ouvrir le fichier undercover.txt");
                    }
                }
                    //Fin du programme
                    else
                    {
                        printf("Nombre de joueurs invalide");
                        exit(EXIT_FAILURE);
                    }
                
                    return 0;
                }

                Bon w-e de 3 jours à vous :)

                • Partager sur Facebook
                • Partager sur Twitter
                  10 novembre 2022 à 16:20:44

                  S kO a écrit:

                  Bien vu edgarjacobs merci, j'ai réglé tout les warnings sauf celui là :
                  s.c|23|warning: implicit declaration of function 'time'; did you mean 'true'? [-Wimplicit-function-declaration]|

                  #include <time.h>
                  Il en reste encore 20 ?


                  • Partager sur Facebook
                  • Partager sur Twitter
                  ...
                    10 novembre 2022 à 20:16:49

                    1) comme l'écrit rouloude, encore beaucoup de warnings à régler.

                    2) plantage assuré un de ces jours ligne 243: d'abord, pas besoin d'esperluette, ensuite proposition a une taille de zéro octet.

                    -
                    Edité par edgarjacobs 10 novembre 2022 à 20:17:17

                    • Partager sur Facebook
                    • Partager sur Twitter

                    On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                      11 novembre 2022 à 20:51:06

                      rouIoude a écrit:

                      S kO a écrit:

                      Bien vu edgarjacobs merci, j'ai réglé tout les warnings sauf celui là :
                      s.c|23|warning: implicit declaration of function 'time'; did you mean 'true'? [-Wimplicit-function-declaration]|

                      #include <time.h>

                      Il en reste encore 20 ?


                      Je viens de m'apercevoir que ce code
                      #include <stdio.h>
                      
                      int main(void) {
                      	char str[64];
                      	scanf("%s",&str);        // faux, pas de &
                      	puts(str);
                      	
                      	return(0);
                      }

                      compilé comme ceci

                      gcc file.c

                      ne donne aucun warning !

                      @S kO: il faut au minimum les options de compilation suivantes

                      -Wall -Wextra

                      pour gcc

                      Edit: et j'ajouterais aussi

                      -std=c11 -Wunused

                      -
                      Edité par edgarjacobs 11 novembre 2022 à 23:36:34

                      • Partager sur Facebook
                      • Partager sur Twitter

                      On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                        15 novembre 2022 à 16:57:23

                        Je n'utilise pas la console pour compiler edgarjacobs et actuellement je n'ai plus de warnings :

                        ||=== Build file: "no target" in "no project" (compiler: unknown) ===|
                        ||=== Build finished: 0 error(s), 0 warning(s) (0 minute(s), 0 second(s)) ===|

                        Cependant je n'ai toujours pas trouvé comment mélanger les positions des joueurs (même en me basant sur la proposition de Dlks) de sorte que Mr.White ne puisse pas débuter le premier tour de jeu (car il n'a pas de mot attribué).

                        Je suis donc passé sur ce détail et ai continué la suite cependant j'ai encore d'autres blocages, lorsque j'élimine un joueur en faisant passer son bool ingame à false ce sont tout les joueurs qui sont éliminés.
                        Puis lors du test de comparaison entre le joueur à éliminer et Mr.White ça merdouille aussi bref globalement toute la fin est à revoir mais je ne sais pas comment procéder.

                        #include <stdio.h>
                        #include <stdlib.h>
                        #include <math.h>
                        #include <string.h>
                        #include <stdbool.h>
                        #include <time.h>
                        #define TAILLE_MAX 100
                        
                        enum roles { CIVIL, UNDERCOVER, MR_WHITE };
                        const char * str_role[] = {
                                [CIVIL]      = "Civil",
                                [UNDERCOVER] = "Undercover",
                                [MR_WHITE]   = "Mr. White"
                        };
                        
                        struct Joueurs {
                                char pseudo[100];
                                enum roles role;
                                int position[20];
                                bool ingame;
                        } joueurs[20] = { '\0' };
                        
                        int main (int argc, char** argv)
                        {
                            srand(time(NULL));
                            int joueurHasard = 0;
                        
                            double nbjoueurs = 0;
                            printf("Combien de joueurs sont de la partie ? [3 min, 20 max]\n");
                            scanf("%lf", &nbjoueurs);
                        
                            double nbcivils = 0, nbundercover = 0, nbmrwhite = 0;
                            if (nbjoueurs>=3 && nbjoueurs<=20)
                            {
                            printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                            nbcivils=ceil(nbjoueurs/2);
                            printf("%0.lf Civils\n",nbcivils);
                            if(nbjoueurs<11)
                                nbmrwhite=1;
                            else if(nbjoueurs>=11 && nbjoueurs<17)
                                nbmrwhite=2;
                            else
                                nbmrwhite=3;
                            nbundercover=nbjoueurs-nbcivils-nbmrwhite;
                            printf("%0.lf Undercover\n", nbundercover);
                            printf("%0.lf Mr. White\n", nbmrwhite);
                        
                            int rajout, supression, rajoutUndercover, rajoutMrwhite;
                            printf("Voulez-vous rajouter un personnage (Non : 0)?");
                            scanf("%d", &rajout);
                            if (rajout)
                            {
                                printf("Rajouter un Undercover ? (Non : 0)");
                                scanf("%d", &rajoutUndercover);
                                if(rajoutUndercover && nbmrwhite>0)
                                {
                                    nbundercover++;
                                    nbmrwhite--;
                                    printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                    printf("%0.lf Civils\n",nbcivils);
                                    printf("%0.lf Undercover\n", nbundercover);
                                    printf("%0.lf Mr. White\n", nbmrwhite);
                                }
                                else if (!rajoutUndercover)
                                {
                                    printf("Rajouter un Mr.White ? (Non : 0)");
                                    scanf("%d", &rajoutMrwhite);
                                    if (rajoutMrwhite && nbundercover>0)
                                    {
                                    nbmrwhite++;
                                    nbundercover--;
                                    printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                    printf("%0.lf Civils\n",nbcivils);
                                    printf("%0.lf Undercover\n", nbundercover);
                                    printf("%0.lf Mr. White\n", nbmrwhite);
                                    }
                                }
                            }
                            else if (!rajout)
                            {
                                printf("Enlever un joueur ? (Non : 0)");
                                scanf("%d", &supression);
                                if (supression)
                                {
                                    printf("Supprimer un Undercover ? (Non : 0)");
                                    scanf("%d", &rajoutUndercover);
                                if (rajoutUndercover && nbundercover>0)
                                {
                                    nbundercover--;
                                    nbcivils++;
                                    printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                    printf("%0.lf Civils\n",nbcivils);
                                    printf("%0.lf Undercover\n", nbundercover);
                                    printf("%0.lf Mr. White\n", nbmrwhite);
                                }
                                else if (!rajoutUndercover)
                                {
                                    printf("Supprimer un Mr.White ? (Non : 0)");
                                    scanf("%d", &rajoutMrwhite);
                                    if (rajoutMrwhite && nbmrwhite>0 && nbundercover>0)
                                    {
                                        nbmrwhite--;
                                        nbcivils++;
                                        printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                        printf("%0.lf Civils\n",nbcivils);
                                        printf("%0.lf Undercover\n", nbundercover);
                                        printf("%0.lf Mr. White\n", nbmrwhite);
                                    }
                                }
                            }
                            else
                                {
                                    printf("On garde la configuration initiale\n");
                                }
                            }
                                else
                                {
                                    printf("On ne change pas la configuration initiale\n");
                                }
                        //Attribution des pseudos
                        
                            for(int i=0; i<nbjoueurs; i++)
                            {
                                printf("Donnez le nom du joueur %d\n",i+1);
                                scanf("%s", &joueurs[i].pseudo);
                            }
                        
                        /* on attribue les rôles exhaustivement */
                                int j = 0;
                                for (int i = 0; i < nbcivils; i++)
                                        joueurs[j++].role = CIVIL;
                                for (int i = 0; i < nbundercover; i++)
                                        joueurs[j++].role = UNDERCOVER;
                                for (int i = 0; i < nbmrwhite; i++)
                                        joueurs[j++].role = MR_WHITE;
                                /* puis on mélange les rôles
                                 * https://fr.wikipedia.org/wiki/M%C3%A9lange_de_Fisher-Yates
                                 */
                                for (int i = nbjoueurs - 1; i >= 1; i--) {
                                        int j = rand() % (int)nbjoueurs;
                                        enum roles temp = joueurs[i].role;
                                        joueurs[i].role = joueurs[j].role;
                                        joueurs[j].role = temp;
                        
                                }
                        
                                for (int i = 0; i < nbjoueurs; i++)
                                        printf("Joueur %s - role %s\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                        //OK JUSQUE LA
                        
                        FILE* fichier = NULL;
                            fichier = fopen("undercover.txt", "w+");
                            if (fichier != NULL)
                            {
                                int nombreDeLignes = 3;
                                char motPrincipal1[] = "Chat", motSecondaire1[] = "Chien", motPrincipal2[] = "Fast_&_Furious", motSecondaire2[] = "Need_for_speed", motPrincipal3[] = "Faucon", motSecondaire3[] = "Aigle";
                                int taillemotPrincipal1 = sizeof(motPrincipal1), taillemotSecondaire1 = sizeof(motSecondaire1), taillemotPrincipal2 = sizeof(motPrincipal2), taillemotSecondaire2 = sizeof(motSecondaire2), taillemotPrincipal3 = sizeof(motPrincipal3), taillemotSecondaire3 = sizeof(motSecondaire3);
                        
                                fprintf(fichier,"%s %s\n", motPrincipal1, motSecondaire1);
                                fprintf(fichier,"%s %s\n", motPrincipal2, motSecondaire2);
                                fprintf(fichier,"%s %s\n", motPrincipal3, motSecondaire3);
                        
                                char lireMotPrincipal1[taillemotPrincipal1], lireMotSecondaire1[taillemotSecondaire1], lireMotPrincipal2[taillemotPrincipal2], lireMotSecondaire2[taillemotSecondaire2], lireMotPrincipal3[taillemotPrincipal3], lireMotSecondaire3[taillemotSecondaire3];
                                rewind(fichier);
                                fscanf(fichier, "%s %s", &lireMotPrincipal1, &lireMotSecondaire1);
                                fscanf(fichier, "%s %s", &lireMotPrincipal2, &lireMotSecondaire2);
                                fscanf(fichier, "%s %s", &lireMotPrincipal3, &lireMotSecondaire3);
                        
                                int random = (rand() % nombreDeLignes)+1;
                        
                                if(random == 1)
                                {
                                for (int i = 0; i <nbjoueurs; i++)
                                {
                                    if (str_role[joueurs[i].role] == "Civil")
                                        {
                                            system("pause");
                                            printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal1);
                                        }
                                    if (str_role[joueurs[i].role] == "Undercover")
                                        {
                                            system("pause");
                                            printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire1);
                                        }
                                    if (str_role[joueurs[i].role] == "Mr. White")
                                        {
                                            system("pause");
                                            printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                        }
                                }
                                }
                                else if(random == 2)
                                {
                                    for (int i = 0; i <nbjoueurs; i++)
                                {
                                    if (str_role[joueurs[i].role] == "Civil")
                                        {
                                            system("pause");
                                            printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal2);
                                        }
                                    if (str_role[joueurs[i].role] == "Undercover")
                                        {
                                            system("pause");
                                            printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire2);
                                        }
                                    if (str_role[joueurs[i].role] == "Mr. White")
                                        {
                                            system("pause");
                                            printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                        }
                                }
                                }
                                else if(random == 3)
                                {
                                    for (int i = 0; i <nbjoueurs; i++)
                                {
                                    if (str_role[joueurs[i].role] == "Civil")
                                        {
                                            system("pause");
                                            printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal3);
                                        }
                                    if (str_role[joueurs[i].role] == "Undercover")
                                        {
                                            system("pause");
                                            printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire3);
                                        }
                                    if (str_role[joueurs[i].role] == "Mr. White")
                                        {
                                            system("pause");
                                            printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                        }
                                }
                                }
                                else
                                {
                                    printf("Hors random");
                                }
                                //JUSQUE LA OK
                        
                                //Pour un nombre de tour strictement compris entre 0 et le nombre de joueurs
                                //Si la position est libre on attribue un nombre aléatoire compris entre 0 et le nombre de joueurs
                                //
                                //Attribution exhaustive des positions
                                for(int i=0; i<nbjoueurs; i++)
                                {
                                    if(joueurs[i].position[i] == 0)
                                    {
                                        joueurs[i].position[i] = i;
                                    }
                                }
                                //Puis on aimerait mélanger les positions et éviter à Mr.White de commencer
                                //...
                        
                                //Proposition de mots et élimination du joueur suspect
                                char proposition;
                                for(int i=0; i<nbjoueurs; i++)
                                {
                                    printf("Pseudo %s Position %d\n", joueurs[i].pseudo, joueurs[i].position[i]);
                                }
                                int tour, manche;
                                char joueurElimine[100];
                                for(manche=0; manche<nbjoueurs; manche++)
                                {
                                    for(tour=0; tour<nbjoueurs; tour++)
                                    {
                                        printf("Le joueur %s propose un mot :\n", joueurs[tour].pseudo);
                                        scanf("%s", &proposition);
                                    }
                                    printf("Il est maintenant temps d'eliminer le joueur qui vous parait suspect\n");
                                    printf("Apres concertation les joueurs ont decides d'eliminer le joueur\n");
                                    scanf("%s", &joueurElimine);
                                    for(int i=0; i<nbjoueurs; i++)
                                    {
                                        if(strcmp(joueurs[i].pseudo, joueurElimine) == 0)
                                        {
                                            joueurs[i].ingame = false;
                                        }
                                        if(!joueurs[i].ingame && str_role[joueurs[i].role] == "Mr. White")
                                        {
                                            printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :");
                                            scanf("%s", &proposition);
                                            if(random == 1 && strcmp(&proposition, motPrincipal1) == 0 || random == 2 && strcmp(&proposition, motPrincipal2) == 0 || random == 3 && strcmp(&proposition, motPrincipal3) == 0)
                                            {
                                                printf("Mr.White gagne la partie !!");
                                                return 0;
                                            }
                                            else{printf("Les civils gagnent la partie !");return 0;}
                                        }
                                        if(joueurs[i].ingame)
                                        printf("Il reste en jeu le joueur %s\n", joueurs[i].pseudo);
                                    }
                                }
                                fclose(fichier);
                            }
                            else
                            {
                                printf("Impossible d'ouvrir le fichier undercover.txt");
                            }
                        }
                            //Fin du programme
                            else
                            {
                                printf("Nombre de joueurs invalide");
                                exit(EXIT_FAILURE);
                            }
                        
                            return 0;
                        }

                        Pour info je n'ai pas mis de fonctions car je voulais faire un premier jet qui respecte les règles et ensuite condenser le code.

                        Dernière info ce n'est pas un devoir à rendre (mon secteur d'activité n'est pas l'informatique) donc je ne suis pas pressé sur le temps de résolution mais lorsque je bloque sans avancer ça ne m'invite pas à poursuivre.

                        Aussi à vos claviers et merci d'avance du temps que vous m'accorderez :)

                        • Partager sur Facebook
                        • Partager sur Twitter
                          15 novembre 2022 à 18:15:21

                          Il y a encore 23 warnings avec -Wall -Wextra

                          Il serait temps de penser à les activer ?

                          • Partager sur Facebook
                          • Partager sur Twitter
                          ...
                            15 novembre 2022 à 19:15:56

                            Ca y est j'ai compris à quoi vous faisiez référence ! Les fameux paramètres de compilations et les warnings à activer.

                            J'ai donc rajouté -Wall -Wextra -std=c11 mais je n'ai pas trouvé -Wunused (je suppose que ce dernier warning sert pour les variables inutilisées).

                            Je vais corriger ça ! Merci rouIoude

                            EDIT :

                            Je n'ai plus de warnings mais la lecture des mots par fscanf ne fonctionne plus vraiment *smiley avec une tête dé(ca)pitée*

                            #include <stdio.h>
                            #include <stdlib.h>
                            #include <math.h>
                            #include <string.h>
                            #include <stdbool.h>
                            #include <time.h>
                            #define TAILLE_MAX 100
                            
                            enum roles { CIVIL, UNDERCOVER, MR_WHITE };
                            const char * str_role[] = {
                                    [CIVIL]      = "Civil",
                                    [UNDERCOVER] = "Undercover",
                                    [MR_WHITE]   = "Mr. White"
                            };
                            
                            struct Joueurs {
                                    char pseudo[100];
                                    enum roles role;
                                    int position[20];
                                    bool ingame;
                            } joueurs[20] = { '\0' };
                            
                            int main (void)
                            {
                                srand(time(NULL));
                            
                                double nbjoueurs = 0;
                                printf("Combien de joueurs sont de la partie ? [3 min, 20 max]\n");
                                scanf("%lf", &nbjoueurs);
                            
                                double nbcivils = 0, nbundercover = 0, nbmrwhite = 0;
                                if (nbjoueurs>=3 && nbjoueurs<=20)
                                {
                                printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                nbcivils=ceil(nbjoueurs/2);
                                printf("%0.lf Civils\n",nbcivils);
                                if(nbjoueurs<11)
                                    nbmrwhite=1;
                                else if(nbjoueurs>=11 && nbjoueurs<17)
                                    nbmrwhite=2;
                                else
                                    nbmrwhite=3;
                                nbundercover=nbjoueurs-nbcivils-nbmrwhite;
                                printf("%0.lf Undercover\n", nbundercover);
                                printf("%0.lf Mr. White\n", nbmrwhite);
                            
                                int rajout, supression, rajoutUndercover, rajoutMrwhite;
                                printf("Voulez-vous rajouter un personnage (Non : 0)?");
                                scanf("%d", &rajout);
                                if (rajout)
                                {
                                    printf("Rajouter un Undercover ? (Non : 0)");
                                    scanf("%d", &rajoutUndercover);
                                    if(rajoutUndercover && nbmrwhite>0)
                                    {
                                        nbundercover++;
                                        nbmrwhite--;
                                        printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                        printf("%0.lf Civils\n",nbcivils);
                                        printf("%0.lf Undercover\n", nbundercover);
                                        printf("%0.lf Mr. White\n", nbmrwhite);
                                    }
                                    else if (!rajoutUndercover)
                                    {
                                        printf("Rajouter un Mr.White ? (Non : 0)");
                                        scanf("%d", &rajoutMrwhite);
                                        if (rajoutMrwhite && nbundercover>0)
                                        {
                                        nbmrwhite++;
                                        nbundercover--;
                                        printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                        printf("%0.lf Civils\n",nbcivils);
                                        printf("%0.lf Undercover\n", nbundercover);
                                        printf("%0.lf Mr. White\n", nbmrwhite);
                                        }
                                    }
                                }
                                else if (!rajout)
                                {
                                    printf("Enlever un joueur ? (Non : 0)");
                                    scanf("%d", &supression);
                                    if (supression)
                                    {
                                        printf("Supprimer un Undercover ? (Non : 0)");
                                        scanf("%d", &rajoutUndercover);
                                    if (rajoutUndercover && nbundercover>0)
                                    {
                                        nbundercover--;
                                        nbcivils++;
                                        printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                        printf("%0.lf Civils\n",nbcivils);
                                        printf("%0.lf Undercover\n", nbundercover);
                                        printf("%0.lf Mr. White\n", nbmrwhite);
                                    }
                                    else if (!rajoutUndercover)
                                    {
                                        printf("Supprimer un Mr.White ? (Non : 0)");
                                        scanf("%d", &rajoutMrwhite);
                                        if (rajoutMrwhite && nbmrwhite>0 && nbundercover>0)
                                        {
                                            nbmrwhite--;
                                            nbcivils++;
                                            printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                            printf("%0.lf Civils\n",nbcivils);
                                            printf("%0.lf Undercover\n", nbundercover);
                                            printf("%0.lf Mr. White\n", nbmrwhite);
                                        }
                                    }
                                }
                                else
                                    {
                                        printf("On garde la configuration initiale\n");
                                    }
                                }
                                    else
                                    {
                                        printf("On ne change pas la configuration initiale\n");
                                    }
                            //Attribution des pseudos
                            
                                for(int i=0; i<nbjoueurs; i++)
                                    for(unsigned long long int j=0; j<sizeof(joueurs[i].pseudo[100]);j++)
                                {
                                    printf("Donnez le nom du joueur %d\n",i+1);
                                    scanf("%s", &joueurs[i].pseudo[j]);
                                }
                            
                            /* on attribue les rôles exhaustivement */
                                    int j = 0;
                                    for (int i = 0; i < nbcivils; i++)
                                            joueurs[j++].role = CIVIL;
                                    for (int i = 0; i < nbundercover; i++)
                                            joueurs[j++].role = UNDERCOVER;
                                    for (int i = 0; i < nbmrwhite; i++)
                                            joueurs[j++].role = MR_WHITE;
                                    /* puis on mélange les rôles
                                     * https://fr.wikipedia.org/wiki/M%C3%A9lange_de_Fisher-Yates
                                     */
                                    for (int i = nbjoueurs - 1; i >= 1; i--) {
                                            int j = rand() % (int)nbjoueurs;
                                            enum roles temp = joueurs[i].role;
                                            joueurs[i].role = joueurs[j].role;
                                            joueurs[j].role = temp;
                            
                                    }
                            
                                    for (int i = 0; i < nbjoueurs; i++)
                                            printf("Joueur %s - role %s\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                            //OK JUSQUE LA
                            
                            FILE* fichier = NULL;
                                fichier = fopen("undercover.txt", "w+");
                                if (fichier != NULL)
                                {
                                    int nombreDeLignes = 3;
                                    char motPrincipal1[] = "Chat", motSecondaire1[] = "Chien", motPrincipal2[] = "Fast_&_Furious", motSecondaire2[] = "Need_for_speed", motPrincipal3[] = "Faucon", motSecondaire3[] = "Aigle";
                                    size_t taillemotPrincipal1 = sizeof(motPrincipal1), taillemotSecondaire1 = sizeof(motSecondaire1), taillemotPrincipal2 = sizeof(motPrincipal2), taillemotSecondaire2 = sizeof(motSecondaire2), taillemotPrincipal3 = sizeof(motPrincipal3), taillemotSecondaire3 = sizeof(motSecondaire3);
                            
                                    fprintf(fichier,"%s %s\n", motPrincipal1, motSecondaire1);
                                    fprintf(fichier,"%s %s\n", motPrincipal2, motSecondaire2);
                                    fprintf(fichier,"%s %s\n", motPrincipal3, motSecondaire3);
                            
                                    char lireMotPrincipal1[taillemotPrincipal1], lireMotSecondaire1[taillemotSecondaire1], lireMotPrincipal2[taillemotPrincipal2], lireMotSecondaire2[taillemotSecondaire2], lireMotPrincipal3[taillemotPrincipal3], lireMotSecondaire3[taillemotSecondaire3];
                                    rewind(fichier);
                                    fscanf(fichier, "%s %s", &lireMotPrincipal1[taillemotPrincipal1], &lireMotSecondaire1[taillemotSecondaire1]);
                                    fscanf(fichier, "%s %s", &lireMotPrincipal2[taillemotPrincipal2], &lireMotSecondaire2[taillemotSecondaire2]);
                                    fscanf(fichier, "%s %s", &lireMotPrincipal3[taillemotPrincipal3], &lireMotSecondaire3[taillemotSecondaire3]);
                            
                                    int random = (rand() % nombreDeLignes)+1;
                            
                                    if(random == 1)
                                    {
                                    for (int i = 0; i <nbjoueurs; i++)
                                    {
                                        if (joueurs[i].role == CIVIL)
                                            {
                                                system("pause");
                                                printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal1);
                                            }
                                        if (joueurs[i].role == UNDERCOVER)
                                            {
                                                system("pause");
                                                printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire1);
                                            }
                                        if (joueurs[i].role == MR_WHITE)
                                            {
                                                system("pause");
                                                printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                            }
                                    }
                                    }
                                    else if(random == 2)
                                    {
                                        for (int i = 0; i <nbjoueurs; i++)
                                    {
                                        if (joueurs[i].role == CIVIL)
                                            {
                                                system("pause");
                                                printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal2);
                                            }
                                        if (joueurs[i].role == UNDERCOVER)
                                            {
                                                system("pause");
                                                printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire2);
                                            }
                                        if (joueurs[i].role == MR_WHITE)
                                            {
                                                system("pause");
                                                printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                            }
                                    }
                                    }
                                    else if(random == 3)
                                    {
                                        for (int i = 0; i <nbjoueurs; i++)
                                    {
                                        if (joueurs[i].role == CIVIL)
                                            {
                                                system("pause");
                                                printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal3);
                                            }
                                        if (joueurs[i].role == UNDERCOVER)
                                            {
                                                system("pause");
                                                printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire3);
                                            }
                                        if (joueurs[i].role == MR_WHITE)
                                            {
                                                system("pause");
                                                printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                            }
                                    }
                                    }
                                    else
                                    {
                                        printf("Hors random");
                                    }
                                    //JUSQUE LA OK
                            
                                    //Pour un nombre de tour strictement compris entre 0 et le nombre de joueurs
                                    //Si la position est libre on attribue un nombre aléatoire compris entre 0 et le nombre de joueurs
                                    //
                                    //Attribution exhaustive des positions
                                    for(int i=0; i<nbjoueurs; i++)
                                    {
                                        if(joueurs[i].position[i] == 0)
                                        {
                                            joueurs[i].position[i] = i;
                                        }
                                    }
                                    //Puis on aimerait mélanger les positions et éviter à Mr.White de commencer
                                    //...
                            
                                    //Proposition de mots et élimination du joueur suspect
                                    char proposition;
                                    for(int i=0; i<nbjoueurs; i++)
                                    {
                                        printf("Pseudo %s Position %d\n", joueurs[i].pseudo, joueurs[i].position[i]);
                                    }
                                    int tour, manche;
                                    char joueurElimine[100];
                                    for(manche=0; manche<nbjoueurs; manche++)
                                    {
                                        for(tour=0; tour<nbjoueurs; tour++)
                                        {
                                            printf("Le joueur %s propose un mot :\n", joueurs[tour].pseudo);
                                            scanf("%s", &proposition);
                                        }
                                        printf("Il est maintenant temps d'eliminer le joueur qui vous parait suspect\n");
                                        printf("Apres concertation les joueurs ont decides d'eliminer le joueur\n");
                                        scanf("%s", &joueurElimine[100]);
                                        for(int i=0; i<nbjoueurs; i++)
                                        {
                                            if(strcmp(joueurs[i].pseudo, joueurElimine) == 0)
                                            {
                                                joueurs[i].ingame = false;
                                            }
                                            if(!joueurs[i].ingame && joueurs[i].role == MR_WHITE)
                                            {
                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :");
                                                scanf("%s", &proposition);
                                                if((random == 1 && strcmp(&proposition, motPrincipal1) == 0) || (random == 2 && strcmp(&proposition, motPrincipal2) == 0) || (random == 3 && strcmp(&proposition, motPrincipal3) == 0))
                                                {
                                                    printf("Mr.White gagne la partie !!");
                                                    return 0;
                                                }
                                                else{printf("Les civils gagnent la partie !");return 0;}
                                            }
                                            if(joueurs[i].ingame)
                                            printf("Il reste en jeu le joueur %s\n", joueurs[i].pseudo);
                                        }
                                    }
                                    fclose(fichier);
                                }
                                else
                                {
                                    printf("Impossible d'ouvrir le fichier undercover.txt");
                                }
                            }
                                //Fin du programme
                                else
                                {
                                    printf("Nombre de joueurs invalide");
                                    exit(EXIT_FAILURE);
                                }
                            
                                return 0;
                            }



                            -
                            Edité par S kO 15 novembre 2022 à 19:50:32

                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 novembre 2022 à 20:24:07

                              Et tu penses que ça va fonctionner:
                                      char proposition;
                                              scanf("%s", &proposition);
                                 

                              ????

                              Ah ben oui, plus de warninng

                              -
                              Edité par edgarjacobs 15 novembre 2022 à 20:35:31

                              • Partager sur Facebook
                              • Partager sur Twitter

                              On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                15 novembre 2022 à 21:00:51

                                C'est effectivement mieux quand on mets un tableau pour contenir les lettres de la chaine donc je l'ai modifié merci edgarjacobs.

                                Voilà alors j'ai bien avancé car j'arrive à simuler une partie mais plusieurs contraintes restent à fixer:

                                - Mr.White ne devrait pas pouvoir commencer à jouer, je dois arriver à comprendre comment mélanger les positions de sorte que j'ai un tour de jeu aléatoire avec comme condition : au tour 1 Mr.White ne peut pas être en première position.
                                - Si un des Mr.White est éliminé et qu'il n'a pas trouvé le mot principal, s'il reste un Mr.White le jeu continue
                                - Si tout les civils ont été éliminés et qu'il reste des undercover, les undercover gagnent
                                - Si tout les civils et les undercover ont été éliminés Mr.White gagne
                                - Actuellement on ne peut jouer qu'à 4 joueurs car je dois faire trop de copier/collé pour la simulation du jeu, donc c'est peut-être le moment d'essayer de mettre des fonctions.

                                J'aimerai résoudre le premier point car c'est vraiment bloquant dans le déroulement du jeu, le reste étant des conditions à fourrer ci et là

                                #include <stdio.h>
                                #include <stdlib.h>
                                #include <math.h>
                                #include <string.h>
                                #include <stdbool.h>
                                #include <time.h>
                                
                                enum roles { CIVIL, UNDERCOVER, MR_WHITE };
                                const char * str_role[] = {
                                        [CIVIL]      = "Civil",
                                        [UNDERCOVER] = "Undercover",
                                        [MR_WHITE]   = "Mr. White"
                                };
                                
                                struct Joueurs {
                                        char pseudo[100];
                                        enum roles role;
                                        int position[20];
                                        bool ingame;
                                } joueurs[20] = { '\0' };
                                
                                double nombre_joueurs()
                                {
                                    double nbjoueurs;
                                    define_joueurs:
                                    printf("Combien de joueurs sont de la partie ? [3 min, 20 max]\n");
                                    scanf("%lf", &nbjoueurs);
                                    if(!(nbjoueurs>=3 && nbjoueurs<=20))
                                    {
                                        printf("[3 min, 20 max] TRY AGAIN\n");
                                        goto define_joueurs;
                                    }
                                    return nbjoueurs;
                                }
                                
                                int main (void)
                                {   //Definition des participants
                                    srand(time(NULL));
                                    double nbjoueurs, nbcivils, nbundercover, nbmrwhite;
                                    nbjoueurs = nombre_joueurs();
                                    nbcivils=ceil(nbjoueurs/2);
                                    if(nbjoueurs<11)
                                        nbmrwhite=1;
                                    else if(nbjoueurs>=11 && nbjoueurs<17)
                                        nbmrwhite=2;
                                    else
                                        nbmrwhite=3;
                                    nbundercover=nbjoueurs-nbcivils-nbmrwhite;
                                    printf("Joueurs : %0.lf\n_____________\nCivils : %0.lf\nUndercover : %0.lf\nMr.White : %0.lf\n", nbjoueurs, nbcivils, nbundercover, nbmrwhite);
                                    //Ajout, Supression de joueurs
                                    int rajout, supression, rajoutUndercover, rajoutMrwhite;
                                    printf("Voulez-vous rajouter un personnage (Non : 0)?");
                                    scanf("%d", &rajout);
                                    if (rajout)
                                    {
                                        printf("Rajouter un Undercover ? (Non : 0)");
                                        scanf("%d", &rajoutUndercover);
                                        if(rajoutUndercover && nbmrwhite>0)
                                        {
                                            nbundercover++;
                                            nbmrwhite--;
                                            printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                            printf("%0.lf Civils\n",nbcivils);
                                            printf("%0.lf Undercover\n", nbundercover);
                                            printf("%0.lf Mr. White\n", nbmrwhite);
                                        }
                                        else if (!rajoutUndercover)
                                        {
                                            printf("Rajouter un Mr.White ? (Non : 0)");
                                            scanf("%d", &rajoutMrwhite);
                                            if (rajoutMrwhite && nbundercover>0)
                                            {
                                            nbmrwhite++;
                                            nbundercover--;
                                            printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                            printf("%0.lf Civils\n",nbcivils);
                                            printf("%0.lf Undercover\n", nbundercover);
                                            printf("%0.lf Mr. White\n", nbmrwhite);
                                            }
                                        }
                                    }
                                    else if (!rajout)
                                    {
                                        printf("Enlever un joueur ? (Non : 0)");
                                        scanf("%d", &supression);
                                        if (supression)
                                        {
                                            printf("Supprimer un Undercover ? (Non : 0)");
                                            scanf("%d", &rajoutUndercover);
                                        if (rajoutUndercover && nbundercover>0)
                                        {
                                            nbundercover--;
                                            nbcivils++;
                                            printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                            printf("%0.lf Civils\n",nbcivils);
                                            printf("%0.lf Undercover\n", nbundercover);
                                            printf("%0.lf Mr. White\n", nbmrwhite);
                                        }
                                        else if (!rajoutUndercover)
                                        {
                                            printf("Supprimer un Mr.White ? (Non : 0)");
                                            scanf("%d", &rajoutMrwhite);
                                            if (rajoutMrwhite && nbmrwhite>0 && nbundercover>0)
                                            {
                                                nbmrwhite--;
                                                nbcivils++;
                                                printf("%0.lf Joueurs\n___________\n", nbjoueurs);
                                                printf("%0.lf Civils\n",nbcivils);
                                                printf("%0.lf Undercover\n", nbundercover);
                                                printf("%0.lf Mr. White\n", nbmrwhite);
                                            }
                                        }
                                    }
                                    else
                                        {
                                            printf("On garde la configuration initiale\n");
                                        }
                                    }
                                        else
                                        {
                                            printf("On ne change pas la configuration initiale\n");
                                        }
                                //Attribution des pseudos
                                
                                    for(int i=0; i<nbjoueurs; i++)
                                        for(unsigned long long int j=0; j<sizeof(joueurs[i].pseudo[100]);j++)
                                    {
                                        printf("Donnez le nom du joueur %d\n",i+1);
                                        scanf("%s", &joueurs[i].pseudo[j]);
                                    }
                                
                                /* on attribue les rôles exhaustivement */
                                        int j = 0;
                                        for (int i = 0; i < nbcivils; i++)
                                                joueurs[j++].role = CIVIL;
                                        for (int i = 0; i < nbundercover; i++)
                                                joueurs[j++].role = UNDERCOVER;
                                        for (int i = 0; i < nbmrwhite; i++)
                                                joueurs[j++].role = MR_WHITE;
                                        /* puis on mélange les rôles
                                         * https://fr.wikipedia.org/wiki/M%C3%A9lange_de_Fisher-Yates
                                         */
                                        for (int i = nbjoueurs - 1; i >= 1; i--) {
                                                int j = rand() % (int)nbjoueurs;
                                                enum roles temp = joueurs[i].role;
                                                joueurs[i].role = joueurs[j].role;
                                                joueurs[j].role = temp;
                                
                                        }
                                
                                        for (int i = 0; i < nbjoueurs; i++)
                                                printf("Joueur %s - role %s\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                
                                FILE* fichier = NULL;
                                    fichier = fopen("undercover.txt", "w+");
                                    if (fichier != NULL)
                                    {
                                        int nombreDeLignes = 3;
                                        char motPrincipal1[] = "Chat", motSecondaire1[] = "Chien", motPrincipal2[] = "Fast_&_Furious", motSecondaire2[] = "Need_for_speed", motPrincipal3[] = "Faucon", motSecondaire3[] = "Aigle";
                                        size_t taillemotPrincipal1 = sizeof(motPrincipal1), taillemotSecondaire1 = sizeof(motSecondaire1), taillemotPrincipal2 = sizeof(motPrincipal2), taillemotSecondaire2 = sizeof(motSecondaire2), taillemotPrincipal3 = sizeof(motPrincipal3), taillemotSecondaire3 = sizeof(motSecondaire3);
                                
                                        fprintf(fichier,"%s %s\n", motPrincipal1, motSecondaire1);
                                        fprintf(fichier,"%s %s\n", motPrincipal2, motSecondaire2);
                                        fprintf(fichier,"%s %s\n", motPrincipal3, motSecondaire3);
                                
                                        char lireMotPrincipal1[taillemotPrincipal1], lireMotSecondaire1[taillemotSecondaire1], lireMotPrincipal2[taillemotPrincipal2], lireMotSecondaire2[taillemotSecondaire2], lireMotPrincipal3[taillemotPrincipal3], lireMotSecondaire3[taillemotSecondaire3];
                                        rewind(fichier);
                                        fscanf(fichier, "%s %s", lireMotPrincipal1, lireMotSecondaire1);
                                        fscanf(fichier, "%s %s", lireMotPrincipal2, lireMotSecondaire2);
                                        fscanf(fichier, "%s %s", lireMotPrincipal3, lireMotSecondaire3);
                                
                                        int random = (rand() % nombreDeLignes)+1;
                                
                                        if(random == 1)
                                        {
                                        for (int i = 0; i <nbjoueurs; i++)
                                        {
                                            if (joueurs[i].role == CIVIL)
                                                {
                                                    system("pause");
                                                    printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal1);
                                                }
                                            if (joueurs[i].role == UNDERCOVER)
                                                {
                                                    system("pause");
                                                    printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire1);
                                                }
                                            if (joueurs[i].role == MR_WHITE)
                                                {
                                                    system("pause");
                                                    printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                                }
                                        }
                                        }
                                        else if(random == 2)
                                        {
                                            for (int i = 0; i <nbjoueurs; i++)
                                        {
                                            if (joueurs[i].role == CIVIL)
                                                {
                                                    system("pause");
                                                    printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal2);
                                                }
                                            if (joueurs[i].role == UNDERCOVER)
                                                {
                                                    system("pause");
                                                    printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire2);
                                                }
                                            if (joueurs[i].role == MR_WHITE)
                                                {
                                                    system("pause");
                                                    printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                                }
                                        }
                                        }
                                        else if(random == 3)
                                        {
                                            for (int i = 0; i <nbjoueurs; i++)
                                        {
                                            if (joueurs[i].role == CIVIL)
                                                {
                                                    system("pause");
                                                    printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal3);
                                                }
                                            if (joueurs[i].role == UNDERCOVER)
                                                {
                                                    system("pause");
                                                    printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire3);
                                                }
                                            if (joueurs[i].role == MR_WHITE)
                                                {
                                                    system("pause");
                                                    printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                                }
                                        }
                                        }
                                        else
                                        {
                                            printf("Hors random");
                                        }
                                        //JUSQUE LA OK
                                
                                        //Attribution exhaustive des positions
                                        for(int i=0; i<nbjoueurs; i++)
                                        {
                                            if(joueurs[i].position[i] == 0)
                                            {
                                                joueurs[i].position[i] = i;
                                            }
                                        }
                                        //Puis on aimerait mélanger les positions et éviter à Mr.White de commencer
                                        //...
                                
                                        //Proposition de mots et élimination du joueur suspect
                                        for(int i=0; i<nbjoueurs; i++)
                                        {
                                            printf("Pseudo %s Position %d\n", joueurs[i].pseudo, joueurs[i].position[i]);
                                        }
                                        int tour, manche;
                                        char proposition[100];
                                        char joueurElimine[100];
                                
                                        int i;
                                        for(i=0;i<nbjoueurs; i++)
                                        {
                                            joueurs[i].ingame = true;
                                        }
                                
                                        for(manche=0; manche<nbjoueurs; manche++)
                                        {
                                            for(tour=0; tour<nbjoueurs; tour++)
                                            {   //Il reste à rajouter les conditions : si tout les civils ont ete elimines et qu'il reste des undercover, les undercover gagnent la partie
                                                //Et si tout les civils ET les undercover ont ete elimines, Mr.White gagne la partie
                                                if(joueurs[tour].ingame)
                                                {
                                                printf("Le joueur %s propose un mot :\n", joueurs[tour].pseudo);
                                                scanf("%s", proposition);
                                                }
                                            }
                                            printf("Il est maintenant temps d'eliminer le joueur qui vous parait suspect\n");
                                            printf("Apres concertation les joueurs ont decides d'eliminer le joueur :\n");
                                            scanf("%s", joueurElimine);
                                            if(strcmp(joueurElimine, joueurs[0].pseudo)==0)
                                            {
                                                printf("Le joueur %s a ete elimine\n", joueurs[0].pseudo);
                                                joueurs[0].ingame = false;
                                                if(joueurs[0].role == MR_WHITE)
                                                {
                                                    printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                    scanf("%s", proposition);
                                                    if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                    {
                                                        printf("Mr.White gagne la partie !!");
                                                        return 0;
                                                    }
                                                    else{printf("Les civils gagnent la partie !");return 0;}
                                                }
                                            }
                                            else if(strcmp(joueurElimine, joueurs[1].pseudo)==0)
                                            {
                                                printf("Le joueur %s a ete elimine\n", joueurs[1].pseudo);
                                                joueurs[1].ingame = false;
                                                if(joueurs[1].role == MR_WHITE)
                                                {
                                                    printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                    scanf("%s", proposition);
                                                    if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                    {
                                                        printf("Mr.White gagne la partie !!");
                                                        return 0;
                                                    }
                                                    else{printf("Les civils gagnent la partie !");return 0;}
                                                }
                                            }
                                            else if(strcmp(joueurElimine, joueurs[2].pseudo)==0)
                                            {
                                                printf("Le joueur %s a ete elimine\n", joueurs[2].pseudo);
                                                joueurs[2].ingame = false;
                                                if(joueurs[2].role == MR_WHITE)
                                                {
                                                    printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                    scanf("%s", proposition);
                                                    if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                    {
                                                        printf("Mr.White gagne la partie !!");
                                                        return 0;
                                                    }
                                                    else{printf("Les civils gagnent la partie !");return 0;}
                                                }
                                            }
                                            else if(strcmp(joueurElimine, joueurs[3].pseudo)==0)
                                            {
                                                printf("Le joueur %s a ete elimine\n", joueurs[3].pseudo);
                                                joueurs[3].ingame = false;
                                                if(joueurs[3].role == MR_WHITE)
                                                {
                                                    printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                    scanf("%s", proposition);
                                                    if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                    {
                                                        printf("Mr.White gagne la partie !!");
                                                        return 0;
                                                    }
                                                    else{printf("Les civils gagnent la partie !");return 0;}
                                                }
                                            }
                                            else
                                            {
                                                printf("Joueur introuvable");
                                            }
                                            for(int i=0; i<nbjoueurs; i++)
                                            {
                                                if(joueurs[i].ingame)
                                                {
                                                    printf("Il reste en jeu les joueurs %s\n", joueurs[i].pseudo);
                                                }
                                            }
                                        }
                                        fclose(fichier);
                                    }
                                    else
                                    {
                                        printf("Impossible d'ouvrir le fichier undercover.txt");
                                    }
                                    //Fin du programme
                                
                                    return 0;
                                }

                                Merci d'avance de votre aide

                                -
                                Edité par S kO 16 novembre 2022 à 17:50:49

                                • Partager sur Facebook
                                • Partager sur Twitter
                                  16 novembre 2022 à 22:10:01

                                  J'aurai une question vis à vis des fonctions.

                                  Est-il possible d'avoir un retour de 3 paramètres qu'on injecte dans la fonction ?

                                  Du style :

                                  double modif_joueurs(double *nbcivils, double *nbundercover, double *nbmrwhite)
                                  {
                                  petite tambouille
                                  return *nbcivils, *nbundercover, *nbmrwhite;
                                  }

                                  Autrement je ne vais pas pouvoir moduler l'équipe dans une fonction

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    16 novembre 2022 à 23:12:25

                                    Hello,

                                    Pour modifier plusieurs variables dans une fonction

                                    #include <stdio.h>
                                    
                                    
                                    void init(int *a,int *b,int *c) {
                                    	*a=0;
                                    	*b=1;
                                    	*c=2;
                                    }
                                    
                                    int main(void) {
                                    	int a,b,c;
                                    	init(&a,&b,&c);
                                    	printf("a=%d, b=%d, c=%d\n",a,b,c);
                                    	
                                    	return(0);
                                    }


                                    Edit: orthographe

                                    -
                                    Edité par edgarjacobs 16 novembre 2022 à 23:19:26

                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                      17 novembre 2022 à 9:51:07

                                      Merci edgar

                                      Tu sais pourquoi ça ne marche pas ?
                                      Il me supprime les civils, ne veut pas supprimer l'undercover mais accepte de supprimer Mr.White.

                                      De plus les valeurs ne sont pas reportées dans la fonction main.

                                      #include <stdlib.h>
                                      #include <stdio.h>
                                      #include <ctype.h>
                                      
                                      void modif_joueurs(double *nbcivils, double *nbundercover, double *nbmrwhite)
                                      {
                                          char choix;
                                          modification:
                                              printf("Bienvenue dans la modification de l'equipe, ici se fait l'ajout/suppression.\n");
                                      
                                              printf("Supprimer un Undercover[:U]/Mr.White[:M] au profit d'un civil ? Non[:N]\n");
                                              choix = getchar();
                                              while (getchar() != '\n');
                                              if(choix == 'U'&& *nbundercover>0)
                                              {
                                                  *nbundercover--;
                                                  *nbcivils++;
                                              }
                                              else if(choix == 'M'&& *nbmrwhite>0)
                                              {
                                                  *nbmrwhite--;
                                                  *nbcivils++;
                                              }
                                              else
                                              {
                                                  printf("RAS\n");
                                              }
                                              if(*nbcivils>*nbundercover+*nbmrwhite)
                                              {
                                              printf("Ajouter un Undercover[:U]/Mr.White[:M] au depend d'un civil ? Non[:N]\n");
                                              choix = getchar();
                                              while (getchar() != '\n');
                                              if(choix == 'U')
                                              {
                                                  *nbundercover++;
                                                  *nbcivils--;
                                              }
                                              if(choix == 'M')
                                              {
                                                  *nbmrwhite++;
                                                  *nbcivils--;
                                              }
                                              }
                                              if(*nbcivils>=*nbundercover+*nbmrwhite)
                                              {
                                                  printf("Voulez-vous continuer la modification ? (:Y/:N)\n");
                                                  choix = getchar();
                                                  while (getchar() != '\n');
                                                  if(choix == 'Y')
                                                      goto modification;
                                              }
                                              //Test d'affichage
                                              printf("Civils : %0.f, Undercover : %0.f, Mr.White : %0.f\n", *nbcivils, *nbundercover, *nbmrwhite);
                                      
                                      }
                                      
                                      int main(void)
                                      {   //Pour nbjoueurs = 4;
                                          double nbcivils = 2, nbundercover = 1, nbmrwhite = 1;
                                          modif_joueurs(&nbcivils, &nbundercover, &nbmrwhite);
                                          //Confirmation d'affichage
                                          printf("Civils : %0.f, Undercover : %0.f, Mr.White : %0.f\n", nbcivils, nbundercover, nbmrwhite);
                                      
                                          return 0;
                                      }
                                      

                                      :/

                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        17 novembre 2022 à 10:04:14

                                        Salut S kO,

                                        Lorsque tu écris

                                        *nbundercover--;

                                        en raison de la préséance des opérateurs, l'opérateur -- de décrémentation s'exécute avant l'opérateur unaire d'indirection *.

                                        https://en.cppreference.com/w/c/language/operator_precedence

                                        en d'autres termes, ce code décrémente la valeur de la copie de l'adresse mémoire contenue dans nbundercover et évalue ensuite ce sur quoi elle pointe. Le code ne fait donc rien (et, de plus, accède potentiellement à des zones mémoires qui ne sont pas attribuées au programme).

                                        Tu dois faire :

                                        (*nbundercover)--;

                                        ou :

                                        *nbundercover -= 1;

                                        ou encore en mode plus verbeux :

                                        *nbundercover = *nbundercover - 1; 
                                        


                                        pour éviter l'interférence des opérateurs.

                                        -
                                        Edité par Dlks 17 novembre 2022 à 10:16:06

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          17 novembre 2022 à 10:27:10

                                          Nice ! Merci je comprends

                                          Une idée pour réaliser ça ?

                                          /*Attribution exhaustive des positions
                                                  for(int i=0; i<nbjoueurs; i++)
                                                  {
                                                      if(joueurs[i].position[i] == 0)
                                                      {
                                                          joueurs[i].position[i] = i;
                                                      }
                                                  }
                                                  //Puis on aimerait mélanger les positions ET éviter à Mr.White de commencer : for(int i=0; i<nbjoueurs; i++) {if(joueurs[i].position[0] && joueurs[i].role == MR_WHITE)} on re-mélange les poz
                                                  //...
                                          
                                              //Affichage des pseudos/positions des joueurs.
                                                  for(int i=0; i<nbjoueurs; i++)
                                                  {
                                                      printf("Pseudo %s Position %d\n", joueurs[i].pseudo, joueurs[i].position[i]);
                                                  }
                                              */

                                          Mon problème vient du fait que je n'arrive pas à attribuer aux joueurs un numéro unique d'un nombre aléatoire pour leur position (qui commence à parler).

                                          -
                                          Edité par S kO 17 novembre 2022 à 10:49:08

                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            17 novembre 2022 à 11:32:12

                                            Salut S kO,

                                            Je ne connais pas ce jeu, ni ses règles.

                                            Ton type struct, que tu as modifié par rapport à ce qu'il était dans ton code d'origine, me parait étrange :

                                            struct Joueurs {
                                                    char pseudo[100];
                                                    enum roles role;
                                                    int position[20];
                                                    bool ingame;
                                            } joueurs[20] = { '\0' };

                                            En effet, pour chaque joueur, tu définis un champ position qui est un tableau de 20 int.

                                            Est-ce que la "position" d'un joueur n'est pas simplement sont rang d'indice ?

                                            Le premier joueur ne serait-il pas joueurs[0] ?

                                            Si oui, alors :

                                            • le champ "position" est inutile
                                            • pour éviter que "Mr.White" ne "commence", il faut, après avoir mélangé les joueurs, vérifier si joueurs[0] == MR_WHITE
                                            • si c'est le cas, tu peux faire une boucle où cherches le prochain joueur dans le tableau de joueurs qui n'est pas un "Mr.White" et tu permutes ce joueur avec celui à la position 0 (donc à l'indice 0 du tableau)

                                            quelque chose comme :

                                                    if (joueurs[0].role == MR_WHITE) {
                                                            int i = 1;
                                                            while (joueurs[i].role == MR_WHITE)
                                                                    i++;
                                                            struct Joueurs temp = joueurs[0];
                                                            joueurs[0] = joueurs[i];
                                                            joueurs[i] = temp;
                                                    }



                                            -
                                            Edité par Dlks 17 novembre 2022 à 11:34:58

                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              17 novembre 2022 à 11:59:21

                                              Merci de ta réponse Dlks,

                                              Effectivement ça fonctionne en excluant à Mr.White de commencer, la position dans la structure joueurs n'a plus lieu d'être car tu l'a dit l'indice des joueurs défini leur position.

                                              Par contre ça dévoile qui est Mr.White car il était le premier à inscrire son prénom et comme par hasard il ne commence pas à jouer.

                                              J'ai réussi à reproduire ce que tu m'avais indiqué auparavant, le fameux mélange de Fisher-Yates et ça semble fonctionner.
                                              La répartition des indices est mélangée en gardant la condition sur le rôle de Mr.White pour éviter qu'il débute :

                                              int i = 1;
                                                  for(int j=nbjoueurs-1; j>=1; j--)
                                                  {
                                                      i = (rand()%(int)nbjoueurs);
                                                      struct Joueurs temp = joueurs[i];
                                                          joueurs[i] = joueurs[j];
                                                          joueurs[j] = temp;
                                                  if (joueurs[0].role == MR_WHITE)
                                                      {
                                                          while (joueurs[i].role == MR_WHITE)
                                                          i++;
                                                          struct Joueurs temp = joueurs[0];
                                                          joueurs[0] = joueurs[i];
                                                          joueurs[i] = temp;
                                                      }
                                                  }

                                              Le jeu grosso-merdo c'est :

                                              - On donne le nombre de joueurs
                                              - Un calcul est fait pour dispatcher les 3 rôles (Civils, Undercover, Mr.White)
                                              - Un mot leur est attribué selon leur rôle (les Civils ont le mot principal, les Undercover le mot secondaire, Mr.White n'a pas de mots)
                                              - Chaque tour de jeu commence en disant un mot en relation avec le mot qu'ils ont et se termine en éliminant un joueur, idéalement Mr.White
                                              Ce qui est compliqué c'est que les Civils ne comprennent pas tout de suite la relation de leur mot avec celui des Undercover et inversement, donc il arrive qu'ils s'accusent d'être Mr.White.
                                              Si Mr.White est éliminé il peut racheter sa victoire en annonçant ce qu'il suppose être le mot principal.
                                              Malgré tout si les Civils sont éliminés alors qu'il reste des Undercover et que ces derniers éliminent Mr.White ce sont les Undercover qui gagnent.

                                              EDIT :

                                              Finalement la fonction que je croyais avoir réglé ne marche pas correctement dans mon programme complet.
                                              Au premier tour à la suppression d'un joueur ça n'a aucun effet, il n'y a que si on y revient en continuant les modifications que la suppression du joueur est effective, et à ce moment comme les civils sont strictement majoritaires vis-à-vis de la somme des undercover+mr.white on peut ajouter un joueur.

                                              void modif_joueurs(double *nbcivils, double *nbundercover, double *nbmrwhite)

                                              ...

                                              -
                                              Edité par S kO 17 novembre 2022 à 13:11:24

                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                                17 novembre 2022 à 13:51:04

                                                OK, je vois. Le jeu a l'air amusant, mais je suppose qu'il faut y avoir joué pour bien assimiler les choses et avoir une idée plus précise de ce que tu fais par rapport au jeu.

                                                Je ne comprends pas en quoi le fait que le premier joueur à saisir son pseudo révèle quoi que ce soit, puisque tu fais un mélange ensuite.

                                                Par contre, ce qui est révélateur est le premier joueur (une fois le mélange effectué) à parler, puisque tu dis que ce joueur ne peut pas être "Mr. White". C'est cette règle elle-même qui est est révélatrice... non ?

                                                Ton code n'est pas très efficace, car tu n'as pas besoin de vérifier, à chaque itération de mélange des joueurs, si le joueur en position 0 est Mr. White.

                                                Tu peux le faire une fois que le mélange est terminé. Tu fais une dernière permutation du joueur 0 s'il se trouve qu'il est Mr. White.

                                                Je n'ai pas compris ton edit.

                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  17 novembre 2022 à 15:34:52

                                                  Oui c'est amusant surtout quand on y joue avec au moins 2 Undercover, 1 Mr.White et donc 3 Civils.

                                                  Si on donne un mot trop proche en étant Civil on donne trop d'indications sur le mot principal aux Undercover qui donneront des mots en relation avec le mot des Civils, mais si on donne des mots trop éloignés en étant Civil on risque de passer pour Mr.White qui ne fait que deviner les mots des autres.

                                                  Une fois j'étais Mr.White le mot principal était Oignon et le mot secondaire Ail, au premier tour j'ai eu devant moi "Dracula, Cuisine, Haleine" mais je me suis fait prendre en disant "Sang" en rapport avec Dracula mais lorsque je me suis fait démasquer j'ai finalement deviné.

                                                  Compris j'ai donc modifié comme tu me le suggères :

                                                  int i = 1;
                                                      for(int j=nbjoueurs-1; j>=1; j--)
                                                      {
                                                          i = (rand()%(int)nbjoueurs);
                                                          struct Joueurs temp = joueurs[i];
                                                              joueurs[i] = joueurs[j];
                                                              joueurs[j] = temp;
                                                      }
                                                      if (joueurs[0].role == MR_WHITE)
                                                          {
                                                              while (joueurs[i].role == MR_WHITE)
                                                              i++;
                                                              struct Joueurs temp = joueurs[0];
                                                              joueurs[0] = joueurs[i];
                                                              joueurs[i] = temp;
                                                          }

                                                  Pour mon EDIT le problème c'est que le code suivant fonctionne correctement hors de mon programme mais pas dedans.
                                                  Je vais inclure ci-dessous le retour console pour les mêmes réponses et essayer de débusquer le problème.

                                                  #include <stdlib.h>
                                                  #include <stdio.h>
                                                  #include <ctype.h>
                                                  
                                                  void modif_joueurs(double *nbcivils, double *nbundercover, double *nbmrwhite)
                                                  {
                                                      char choix;
                                                      modification:
                                                          printf("Bienvenue dans la modification de l'equipe, ici se fait l'ajout/suppression.\n");
                                                  
                                                          printf("Supprimer un Undercover[:U]/Mr.White[:M] au profit d'un civil ? Non[:N]\n");
                                                          choix = getchar();
                                                          choix = toupper(choix);
                                                          while (getchar() != '\n');
                                                          if(choix == 'U'&& *nbundercover>0)
                                                          {
                                                              *nbundercover -= 1;
                                                              *nbcivils +=1;
                                                          }
                                                          else if(choix == 'M'&& *nbmrwhite>0)
                                                          {
                                                              *nbmrwhite -= 1;
                                                              *nbcivils +=1;
                                                          }
                                                          if(*nbcivils>*nbundercover+*nbmrwhite)
                                                          {
                                                          printf("Ajouter un Undercover[:U]/Mr.White[:M] au depend d'un civil ? Non[:N]\n");
                                                          choix = getchar();
                                                          choix = toupper(choix);
                                                          while (getchar() != '\n');
                                                          if(choix == 'U')
                                                          {
                                                              *nbundercover += 1;
                                                              *nbcivils -=1;
                                                          }
                                                          if(choix == 'M')
                                                          {
                                                              *nbmrwhite += 1;
                                                              *nbcivils -=1;
                                                          }
                                                          }
                                                          if(*nbcivils>=*nbundercover+*nbmrwhite)
                                                          {
                                                              printf("Voulez-vous continuer la modification ? (:Y/:N)\n");
                                                              choix = getchar();
                                                              choix = toupper(choix);
                                                              while (getchar() != '\n');
                                                              if(choix == 'Y')
                                                                  goto modification;
                                                          }
                                                  
                                                  }
                                                  
                                                  int main(void)
                                                  {   //Pour nbjoueurs = 4;
                                                      double nbcivils = 2, nbundercover = 1, nbmrwhite = 1;
                                                      modif_joueurs(&nbcivils, &nbundercover, &nbmrwhite);
                                                      printf("Civils : %0.f, Undercover : %0.f, Mr.White : %0.f\n", nbcivils, nbundercover, nbmrwhite);
                                                  
                                                      return 0;
                                                  }
                                                  

                                                  Hors programme :

                                                  Bienvenue dans la modification de l'equipe, ici se fait l'ajout/suppression.
                                                  Supprimer un Undercover[:U]/Mr.White[:M] au profit d'un civil ? Non[:N]
                                                  u
                                                  Ajouter un Undercover[:U]/Mr.White[:M] au depend d'un civil ? Non[:N]
                                                  n
                                                  Voulez-vous continuer la modification ? (:Y/:N)
                                                  n
                                                  Civils : 3, Undercover : 0, Mr.White : 1
                                                  
                                                  Process returned 0 (0x0)   execution time : 64.844 s
                                                  Press any key to continue.
                                                  

                                                  Dans le programme :

                                                  Combien de joueurs sont de la partie ? [3 min, 20 max]
                                                  4
                                                  Joueurs : 4
                                                  _____________
                                                  Civils : 2
                                                  Undercover : 1
                                                  Mr.White : 1
                                                  Bienvenue dans la modification de l'equipe, ici se fait l'ajout/suppression.
                                                  Supprimer un Undercover[:U]/Mr.White[:M] au profit d'un civil ? Non[:N]
                                                  u
                                                  Voulez-vous continuer la modification ? (:Y/:N)
                                                  n
                                                  Joueurs : 4
                                                  _____________
                                                  Civils : 2
                                                  Undercover : 1
                                                  Mr.White : 1

                                                  Je suis obligé de passer par un subterfuge à savoir répondre "Y" à "Voulez-vous continuer la modification" puis supprimer le joueur en question.

                                                  Combien de joueurs sont de la partie ? [3 min, 20 max]
                                                  4
                                                  Joueurs : 4
                                                  _____________
                                                  Civils : 2
                                                  Undercover : 1
                                                  Mr.White : 1
                                                  Bienvenue dans la modification de l'equipe, ici se fait l'ajout/suppression.
                                                  Supprimer un Undercover[:U]/Mr.White[:M] au profit d'un civil ? Non[:N]
                                                  u
                                                  Voulez-vous continuer la modification ? (:Y/:N)
                                                  y
                                                  Bienvenue dans la modification de l'equipe, ici se fait l'ajout/suppression.
                                                  Supprimer un Undercover[:U]/Mr.White[:M] au profit d'un civil ? Non[:N]
                                                  u
                                                  Ajouter un Undercover[:U]/Mr.White[:M] au depend d'un civil ? Non[:N]
                                                  n
                                                  Voulez-vous continuer la modification ? (:Y/:N)
                                                  n
                                                  Joueurs : 4
                                                  _____________
                                                  Civils : 3
                                                  Undercover : 0
                                                  Mr.White : 1

                                                  Voyons voir ...

                                                  Pour info le code de la fonction main du programme commence par :

                                                  int main (void)
                                                  {   //Definition des participants
                                                      srand(time(NULL));
                                                      double nbjoueurs, nbcivils, nbundercover, nbmrwhite;
                                                      nbjoueurs = nombre_joueurs();
                                                      nbcivils=ceil(nbjoueurs/2);
                                                      if(nbjoueurs<11)
                                                          nbmrwhite=1;
                                                      else if(nbjoueurs>=11 && nbjoueurs<17)
                                                          nbmrwhite=2;
                                                      else
                                                          nbmrwhite=3;
                                                      nbundercover=nbjoueurs-nbcivils-nbmrwhite;
                                                      printf("Joueurs : %0.lf\n_____________\nCivils : %0.lf\nUndercover : %0.lf\nMr.White : %0.lf\n", nbjoueurs, nbcivils, nbundercover, nbmrwhite);
                                                      //Ajout, Supression de joueurs
                                                      modif_joueurs(&nbcivils, &nbundercover, &nbmrwhite);
                                                      printf("Joueurs : %0.lf\n_____________\nCivils : %0.lf\nUndercover : %0.lf\nMr.White : %0.lf\n", nbjoueurs, nbcivils, nbundercover, nbmrwhite);
                                                  
                                                  ...



                                                  -
                                                  Edité par S kO 17 novembre 2022 à 15:40:21

                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                    17 novembre 2022 à 19:26:50

                                                    Si le code de ta fonction est le même, que tu l'appelles avec les mêmes variables, ayant le même contenu et de la même façon, mais qu'à l'exécution ton test donne des résultats différents, c'est peut-être que :

                                                    • tu ne fais pas les mêmes tests,
                                                    • tu te trompes et l'une des prémisses ci-dessus est fausse,
                                                    • ton programme est hanté.

                                                    L'ennui avec des fonctions effectuant un traitement, affichant des choses et attendant une saisie de l'utilisateur, c'est que tu ne peux pas les tester automatiquement. Ces sont 3 choses différentes et tu pourrais (devrais) réfléchir à les séparer.

                                                    Bref, je ne développerais pas du tout les choses comme cela. Mais si tu veux faire à ta manière, il ne te reste plus qu'à utiliser le débogueur et exécuter pas à pas ton code en observant le contenu des variables, ou mettre des printf() dans ta fonction pour comprendre ce qu'elle fait et que tu ne vois pas.

                                                    Une question... Pourquoi te compliques tu la vie avec un type double pour des valeurs qui sont entières ? Un int suffirait, non ? Et le spécificateur du printf() serait un simple %d.

                                                    -
                                                    Edité par Dlks 17 novembre 2022 à 19:30:48

                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      17 novembre 2022 à 21:18:47

                                                      En effet mon programme est sûrement hanté.

                                                      Définir statiquement le nbjoueurs résout le problème.

                                                      #include <stdio.h>
                                                      #include <stdlib.h>
                                                      #include <math.h>
                                                      #include <string.h>
                                                      #include <stdbool.h>
                                                      #include <time.h>
                                                      #include <ctype.h>
                                                      
                                                      enum roles { CIVIL, UNDERCOVER, MR_WHITE };
                                                      const char * str_role[] = {
                                                              [CIVIL]      = "Civil",
                                                              [UNDERCOVER] = "Undercover",
                                                              [MR_WHITE]   = "Mr. White"
                                                      };
                                                      
                                                      struct Joueurs {
                                                              char pseudo[100];
                                                              enum roles role;
                                                              bool ingame;
                                                      } joueurs[20] = { '\0' };
                                                      
                                                      int nombre_joueurs()
                                                      {
                                                          int nbjoueurs;
                                                          define_joueurs:
                                                          printf("Combien de joueurs sont de la partie ? [3 min, 20 max]\n");
                                                          scanf("%d", &nbjoueurs);
                                                          if(!(nbjoueurs>=3 && nbjoueurs<=20))
                                                          {
                                                              printf("[3 min, 20 max] TRY AGAIN\n");
                                                              goto define_joueurs;
                                                          }
                                                          return nbjoueurs;
                                                      }
                                                      
                                                      void modif_joueurs(int *nbcivils, int *nbundercover, int *nbmrwhite)
                                                      {
                                                          char choix;
                                                          modification:
                                                              printf("Bienvenue dans la modification de l'equipe, ici se fait l'ajout/suppression.\n");
                                                      
                                                              printf("Supprimer un Undercover[:U]/Mr.White[:M] au profit d'un civil ? Non[:N]\n");
                                                              choix = getchar();
                                                              choix = toupper(choix);
                                                              while (getchar() != '\n');
                                                              if(choix == 'U'&& *nbundercover>0)
                                                              {
                                                                  *nbundercover -= 1;
                                                                  *nbcivils +=1;
                                                              }
                                                              else if(choix == 'M'&& *nbmrwhite>0)
                                                              {
                                                                  *nbmrwhite -= 1;
                                                                  *nbcivils +=1;
                                                              }
                                                              if(*nbcivils>*nbundercover+*nbmrwhite)
                                                              {
                                                              printf("Ajouter un Undercover[:U]/Mr.White[:M] au depend d'un civil ? Non[:N]\n");
                                                              choix = getchar();
                                                              choix = toupper(choix);
                                                              while (getchar() != '\n');
                                                              if(choix == 'U')
                                                              {
                                                                  *nbundercover += 1;
                                                                  *nbcivils -=1;
                                                              }
                                                              if(choix == 'M')
                                                              {
                                                                  *nbmrwhite += 1;
                                                                  *nbcivils -=1;
                                                              }
                                                              }
                                                              if(*nbcivils>=*nbundercover+*nbmrwhite)
                                                              {
                                                                  printf("Voulez-vous continuer la modification ? (:Y/:N)\n");
                                                                  choix = getchar();
                                                                  choix = toupper(choix);
                                                                  while (getchar() != '\n');
                                                                  if(choix == 'Y')
                                                                      goto modification;
                                                              }
                                                      
                                                      }
                                                      
                                                      int main (void)
                                                      {   //Definition des participants
                                                          srand(time(NULL));
                                                          int nbjoueurs, nbcivils, nbundercover, nbmrwhite;
                                                          //nbjoueurs = nombre_joueurs();
                                                          nbjoueurs = 4;
                                                          nbcivils=ceil(nbjoueurs/2);
                                                          if(nbjoueurs<11)
                                                              nbmrwhite=1;
                                                          else if(nbjoueurs>=11 && nbjoueurs<17)
                                                              nbmrwhite=2;
                                                          else
                                                              nbmrwhite=3;
                                                          nbundercover=nbjoueurs-nbcivils-nbmrwhite;
                                                          printf("Joueurs : %d\n_____________\nCivils : %d\nUndercover : %d\nMr.White : %d\n", nbjoueurs, nbcivils, nbundercover, nbmrwhite);
                                                          //Ajout, Supression de joueurs
                                                          modif_joueurs(&nbcivils, &nbundercover, &nbmrwhite);
                                                          printf("Joueurs : %d\n_____________\nCivils : %d\nUndercover : %d\nMr.White : %d\n", nbjoueurs, nbcivils, nbundercover, nbmrwhite);
                                                      
                                                          return 0;
                                                      }

                                                      Pour te répondre sur les double j'avais probablement à tord trouvé une erreur dans l'arrondi qui s'opérait sur : nbcivils=ceil(nbjoueurs/2);

                                                      Ça semble marcher aujourd'hui, je vais donc rétablir les int.

                                                      C'est vrai que les asserts que tu m'avais montré dans ma question sur le Jeu de l'oie étaient franchement efficaces et ne marchent qu'avec des valeurs statiques, tout loisir étant de modifier les variables lorsque tout les tests sont effectués.
                                                      Je vais essayer de recommencer de telle sorte qu'on puisse effectuer ces asserts, ça me fera un bon exercice car il y a encore des choses que je ne maitrise pas.

                                                      • Partager sur Facebook
                                                      • Partager sur Twitter
                                                        17 novembre 2022 à 23:54:40

                                                        Hello,

                                                        L'usage des goto est parfois utile, mais dans ton code ils ne sont vraiment pas nécessaire et seront seront avantageusement remplacés par des do....while()

                                                        Et si ton code est hanté, c'est certainement par un UB (Unknown Body :-) )

                                                        -
                                                        Edité par edgarjacobs 18 novembre 2022 à 0:07:16

                                                        • Partager sur Facebook
                                                        • Partager sur Twitter

                                                        On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent

                                                          18 novembre 2022 à 12:07:54

                                                          edgarjacobs a raison (et on dit aussi "un tort", c'est alors un nom masculin)

                                                          Les goto ne sont pas utiles, et il y a aussi beaucoup de répétitions dans ton code. Do / while fait l'affaire. Personnellement, j'aime bien faire un while (1) et un ou plusieurs break lorsque la ou les conditions de sortie sont réunies.

                                                          Des fonctions comme celle-cies vont alléger ton code et éviter les copier-collers :

                                                          void clear_stdin(void) {
                                                                  int c;
                                                                  while ((c = getchar()) != '\n' && c != EOF)
                                                                          /* discard */ ;
                                                          }
                                                          
                                                          int request_int(char * msg, int min, int max) {
                                                                  printf("%s\n", msg);
                                                                  int i;
                                                                  while (1) {
                                                                          int ret = scanf("%d", &i);
                                                                          clear_stdin();
                                                                          if (ret != 1) {
                                                                                  printf("Erreur : ce n'est un entier\n");
                                                                                  continue;
                                                                          }
                                                                          if (i >= min && i <= max)
                                                                                  break;
                                                                          printf("Erreur : veuillez saisir un entier entre %d et %d\n", min, max);
                                                                  }
                                                                  return i;
                                                          }
                                                          
                                                          char request_char(char * msg, char * allowed) {
                                                                  printf("%s\n", msg);
                                                                  char c;
                                                                  while (1) {
                                                                          c = toupper(getchar());
                                                                          clear_stdin();
                                                                          if (strchr(allowed, c) != NULL)
                                                                                  break;
                                                                          else
                                                                                  printf("Erreur, tapez un des caractères demandés\n");
                                                                  }
                                                                  return c;
                                                          }

                                                          Ensuite, pour séparer la gestion de l'affichage et de l'interaction avec l'utilisateur des fonctions de traitement des données, tu peux faire, par exemple, comme ceci :

                                                          enum modifications { MOD_SUPPRIMER, MOD_AJOUTER };
                                                          void modif_joueurs(enum modifications mod, char type_joueur,
                                                                          int *nbcivils, int *nbundercover, int *nbmrwhite) {
                                                                  switch (mod) {
                                                                  case MOD_SUPPRIMER:
                                                                          if (type_joueur == 'U'&& *nbundercover > 0) {
                                                                                  *nbundercover -= 1;
                                                                                  *nbcivils +=1; 
                                                                          } else if (type_joueur == 'M'&& *nbmrwhite > 0) {
                                                                                  *nbmrwhite -= 1;
                                                                                  *nbcivils +=1;
                                                                          }
                                                                  break;
                                                                  case MOD_AJOUTER:
                                                                          if (type_joueur == 'U') {
                                                                                  *nbundercover += 1;
                                                                                  *nbcivils -=1;
                                                                          }
                                                                          if (type_joueur == 'M') {
                                                                                  *nbmrwhite += 1;
                                                                                  *nbcivils -=1;
                                                                          }
                                                                  break;
                                                                  }
                                                          }
                                                          
                                                          void menu_modif_joueurs(int *nbcivils, int *nbundercover, int *nbmrwhite) {
                                                                  while (1) {
                                                                          printf("Bienvenue dans la modification de l'equipe, "
                                                                                          "ici se fait l'ajout/suppression.\n");
                                                          
                                                                          char choix = request_char("Supprimer un Undercover[:U]/Mr.White[:M] au profit d'un civil ? Non[:N]", "UMN");
                                                                          if (choix != 'N')
                                                                                  modif_joueurs(MOD_SUPPRIMER, choix, nbcivils, nbundercover, nbmrwhite);
                                                          
                                                                          if (*nbcivils > *nbundercover + *nbmrwhite) {
                                                                                  choix = request_char("Ajouter un Undercover[:U]/Mr.White[:M] au depend d'un civil ? Non[:N]", "UMN");
                                                                                  if (choix != 'N')
                                                                                          modif_joueurs(MOD_AJOUTER, choix, nbcivils, nbundercover, nbmrwhite);
                                                                          }
                                                                          if (*nbcivils >= *nbundercover + *nbmrwhite)
                                                                                  if (request_char("Voulez-vous continuer la modification ? (:Y/:N)", "YN")
                                                                                                  == 'N')
                                                                                          break;
                                                                  }
                                                          }

                                                          C'est à moitié satisfaisant car je n'ai pas voulu m'éloigner trop de ton code et que la fonction menu_modif_joueurs() contient encore des éléments de la logique du jeu que tu y avais introduit, mais on va dire que c'est un début :-)

                                                          La fonction qui modifie les joueurs est la fonction modif_joueurs(). Elle pourrait encore concentrer plus d'éléments de la logique du jeu, et assurer que la modification demandée respecte tes règles. Il y a aussi des choses non vérifiées : nbundercover, nbmrwhite ne devraient pas pouvoir être négatifs, etc.

                                                          Le fait que chaque règle afférente à la modification des joueurs est correctement implémentée pourrait être testé automatiquement avec une telle fonction.

                                                          -
                                                          Edité par Dlks 18 novembre 2022 à 12:10:39

                                                          • Partager sur Facebook
                                                          • Partager sur Twitter
                                                            18 novembre 2022 à 13:01:31

                                                            Effectivement edgar merci pour ton conseil sur le goto, j'ai trouvé l'erreur dans la fonction modif_joueurs. Il s'agissait du

                                                            while (getchar() != '\n');

                                                            qui était placé derrière

                                                            choix = getchar();
                                                            choix = toupper(choix);

                                                            Ecoutez on peut y jouer et on peut rajouter "à peu prêt simplement" des mots dans le .txt en changeant également les 20 paragraphes qui vont vous faire hurler.

                                                            J'aurai bien aimé :

                                                            • Enlever ces 20 paragraphes pour n'en mettre qu'un dans une fonction ce qui raccourcirait le code par 2 mais je n'ai pas réussi
                                                            • Pouvoir gérer la condition "s'il ne reste qu'un civil, au moins un undercover et un mrwhite alors les undercover gagnent" mais je ne sais pas ou et comment la placer.

                                                            Encore merci pour votre aide je n'y aurait pas réussi sans vous

                                                            #include <stdio.h>
                                                            #include <stdlib.h>
                                                            #include <math.h>
                                                            #include <string.h>
                                                            #include <stdbool.h>
                                                            #include <time.h>
                                                            #include <ctype.h>
                                                            
                                                            enum roles { CIVIL, UNDERCOVER, MR_WHITE };
                                                            const char * str_role[] = {
                                                                    [CIVIL]      = "Civil",
                                                                    [UNDERCOVER] = "Undercover",
                                                                    [MR_WHITE]   = "Mr. White"
                                                            };
                                                            
                                                            struct Joueurs {
                                                                    char pseudo[100];
                                                                    enum roles role;
                                                                    bool ingame;
                                                            } joueurs[20] = { '\0' };
                                                            
                                                            double nombre_joueurs()
                                                            {
                                                                double nbjoueurs;
                                                                do
                                                                {
                                                                    printf("Combien de joueurs sont de la partie ? [3 min, 20 max]\n");
                                                                    scanf("%lf", &nbjoueurs);
                                                                }
                                                                while(nbjoueurs<3 || nbjoueurs>20);
                                                                return nbjoueurs;
                                                            }
                                                            
                                                            void modif_joueurs(double *nbcivils, double *nbundercover, double *nbmrwhite)
                                                            {
                                                                char choix;
                                                                    printf("Bienvenue dans la modification de l'equipe, ici se fait l'ajout/suppression.\n");
                                                                    do
                                                                    {
                                                                    printf("Supprimer un Undercover[:U]/Mr.White[:M] au profit d'un civil ? Non[:N]\n");
                                                                    while (getchar() != '\n');
                                                                    choix = getchar();
                                                                    choix = toupper(choix);
                                                                    if(choix == 'U'&& *nbundercover>0 && *nbmrwhite>0)
                                                                    {
                                                                        *nbundercover -= 1;
                                                                        *nbcivils +=1;
                                                                    }
                                                                    else if(choix == 'M'&& *nbmrwhite>0 && *nbundercover>0)
                                                                    {
                                                                        *nbmrwhite -= 1;
                                                                        *nbcivils +=1;
                                                                    }
                                                                    else
                                                                    {
                                                                        printf("Bien, on continue.\n");
                                                                    }
                                                                    if(*nbcivils>*nbundercover+*nbmrwhite+1)
                                                                    {
                                                                    printf("Ajouter un Undercover[:U]/Mr.White[:M] au depend d'un civil ? Non[:N]\n");
                                                                    while (getchar() != '\n');
                                                                    choix = getchar();
                                                                    choix = toupper(choix);
                                                                    if(choix == 'U')
                                                                    {
                                                                        *nbundercover += 1;
                                                                        *nbcivils -=1;
                                                                    }
                                                                    if(choix == 'M')
                                                                    {
                                                                        *nbmrwhite += 1;
                                                                        *nbcivils -=1;
                                                                    }
                                                                    else
                                                                    {
                                                                        printf("Voulez-vous continuer la modification ? (:Y/:N)\n");
                                                                        while (getchar() != '\n');
                                                                        choix = getchar();
                                                                        choix = toupper(choix);
                                                                        if(choix == 'Y')
                                                                        {
                                                                        printf("On continue la modification.\n");
                                                                        }
                                                                    else
                                                                    {
                                                                        break;
                                                                    }
                                                                    }
                                                                    }
                                                                    else
                                                                    {
                                                                        break;
                                                                    }
                                                                    }while(*nbcivils>=*nbundercover+*nbmrwhite && (*nbundercover!=0 && *nbmrwhite!=0));
                                                            
                                                            }
                                                            
                                                            int main (void)
                                                            {   //Definition des participants
                                                                srand(time(NULL));
                                                                double nbjoueurs, nbcivils, nbundercover, nbmrwhite;
                                                                nbjoueurs = nombre_joueurs();
                                                                nbcivils=ceil(nbjoueurs/2);
                                                                if(nbjoueurs<11)
                                                                    nbmrwhite=1;
                                                                else if(nbjoueurs>=11 && nbjoueurs<17)
                                                                    nbmrwhite=2;
                                                                else
                                                                    nbmrwhite=3;
                                                                nbundercover=nbjoueurs-nbcivils-nbmrwhite;
                                                                printf("Joueurs : %0.lf\n_____________\nCivils : %0.lf\nUndercover : %0.lf\nMr.White : %0.lf\n", nbjoueurs, nbcivils, nbundercover, nbmrwhite);
                                                                //Ajout, Supression de joueurs
                                                                modif_joueurs(&nbcivils, &nbundercover, &nbmrwhite);
                                                                printf("Joueurs : %0.lf\n_____________\nCivils : %0.lf\nUndercover : %0.lf\nMr.White : %0.lf\n", nbjoueurs, nbcivils, nbundercover, nbmrwhite);
                                                            
                                                                //Attribution des pseudos
                                                                for(int i=0; i<nbjoueurs; i++)
                                                                    for(unsigned long long int j=0; j<sizeof(joueurs[i].pseudo[100]);j++)
                                                                {
                                                                    printf("Donnez le nom du joueur %d\n",i+1);
                                                                    scanf("%s", &joueurs[i].pseudo[j]);
                                                                }
                                                            
                                                                //Attribution des rôles exhaustivement
                                                                    int j = 0;
                                                                    for (int i = 0; i < nbcivils; i++)
                                                                            joueurs[j++].role = CIVIL;
                                                                    for (int i = 0; i < nbundercover; i++)
                                                                            joueurs[j++].role = UNDERCOVER;
                                                                    for (int i = 0; i < nbmrwhite; i++)
                                                                            joueurs[j++].role = MR_WHITE;
                                                                //Mélange des rôles    https://fr.wikipedia.org/wiki/M%C3%A9lange_de_Fisher-Yates
                                                                    for (int i = nbjoueurs - 1; i >= 1; i--) {
                                                                            int j = rand() % (int)nbjoueurs;
                                                                            enum roles temp = joueurs[i].role;
                                                                            joueurs[i].role = joueurs[j].role;
                                                                            joueurs[j].role = temp;
                                                                    }
                                                                //Affichage des pseudos & rôles
                                                                    for (int i = 0; i < nbjoueurs; i++)
                                                                            printf("Joueur %s - role %s\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                                                //Ecriture des mots principaux/secondaires dans le fichier .txt
                                                            FILE* fichier = NULL;
                                                                fichier = fopen("undercover.txt", "w+");
                                                                if (fichier != NULL)
                                                                {
                                                                    int nombreDeLignes = 3;
                                                                    char motPrincipal1[] = "Chat", motSecondaire1[] = "Chien", motPrincipal2[] = "Fast_&_Furious", motSecondaire2[] = "Need_for_speed", motPrincipal3[] = "Faucon", motSecondaire3[] = "Aigle";
                                                                    size_t taillemotPrincipal1 = sizeof(motPrincipal1), taillemotSecondaire1 = sizeof(motSecondaire1), taillemotPrincipal2 = sizeof(motPrincipal2), taillemotSecondaire2 = sizeof(motSecondaire2), taillemotPrincipal3 = sizeof(motPrincipal3), taillemotSecondaire3 = sizeof(motSecondaire3);
                                                            
                                                                    fprintf(fichier,"%s %s\n", motPrincipal1, motSecondaire1);
                                                                    fprintf(fichier,"%s %s\n", motPrincipal2, motSecondaire2);
                                                                    fprintf(fichier,"%s %s\n", motPrincipal3, motSecondaire3);
                                                            
                                                                    char lireMotPrincipal1[taillemotPrincipal1], lireMotSecondaire1[taillemotSecondaire1], lireMotPrincipal2[taillemotPrincipal2], lireMotSecondaire2[taillemotSecondaire2], lireMotPrincipal3[taillemotPrincipal3], lireMotSecondaire3[taillemotSecondaire3];
                                                                    rewind(fichier);
                                                                    fscanf(fichier, "%s %s", lireMotPrincipal1, lireMotSecondaire1);
                                                                    fscanf(fichier, "%s %s", lireMotPrincipal2, lireMotSecondaire2);
                                                                    fscanf(fichier, "%s %s", lireMotPrincipal3, lireMotSecondaire3);
                                                                //Attribution des mots de manière aléatoire en gardant la logique de répartition (Civil = motprincipal, Undercover = motsecondaire, Mr.White = pas de mots)
                                                                    int random = (rand() % nombreDeLignes)+1;
                                                            
                                                                    if(random == 1)
                                                                    {
                                                                    for (int i = 0; i <nbjoueurs; i++)
                                                                    {
                                                                        if (joueurs[i].role == CIVIL)
                                                                            {
                                                                                system("pause");
                                                                                printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal1);
                                                                            }
                                                                        if (joueurs[i].role == UNDERCOVER)
                                                                            {
                                                                                system("pause");
                                                                                printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire1);
                                                                            }
                                                                        if (joueurs[i].role == MR_WHITE)
                                                                            {
                                                                                system("pause");
                                                                                printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                                                            }
                                                                    }
                                                                    }
                                                                    else if(random == 2)
                                                                    {
                                                                        for (int i = 0; i <nbjoueurs; i++)
                                                                    {
                                                                        if (joueurs[i].role == CIVIL)
                                                                            {
                                                                                system("pause");
                                                                                printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal2);
                                                                            }
                                                                        if (joueurs[i].role == UNDERCOVER)
                                                                            {
                                                                                system("pause");
                                                                                printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire2);
                                                                            }
                                                                        if (joueurs[i].role == MR_WHITE)
                                                                            {
                                                                                system("pause");
                                                                                printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                                                            }
                                                                    }
                                                                    }
                                                                    else if(random == 3)
                                                                    {
                                                                        for (int i = 0; i <nbjoueurs; i++)
                                                                    {
                                                                        if (joueurs[i].role == CIVIL)
                                                                            {
                                                                                system("pause");
                                                                                printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotPrincipal3);
                                                                            }
                                                                        if (joueurs[i].role == UNDERCOVER)
                                                                            {
                                                                                system("pause");
                                                                                printf("%s obtient le mot %s\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, lireMotSecondaire3);
                                                                            }
                                                                        if (joueurs[i].role == MR_WHITE)
                                                                            {
                                                                                system("pause");
                                                                                printf("%s est %s : Vous n'avez pas de mot !\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n", joueurs[i].pseudo, str_role[joueurs[i].role]);
                                                                            }
                                                                    }
                                                                    }
                                                                    else
                                                                    {
                                                                        printf("Hors random");
                                                                    }
                                                                    //JUSQUE LA OK
                                                            
                                                                int i = 1;
                                                                for(int j=nbjoueurs-1; j>=1; j--)
                                                                {
                                                                    i = (rand()%(int)nbjoueurs);
                                                                    struct Joueurs temp = joueurs[i];
                                                                        joueurs[i] = joueurs[j];
                                                                        joueurs[j] = temp;
                                                                if (joueurs[0].role == MR_WHITE)
                                                                    {
                                                                        while (joueurs[i].role == MR_WHITE)
                                                                        i++;
                                                                        struct Joueurs temp = joueurs[0];
                                                                        joueurs[0] = joueurs[i];
                                                                        joueurs[i] = temp;
                                                                    }
                                                                }
                                                                    int tour, manche;
                                                                    char proposition[100];
                                                                    char joueurElimine[100];
                                                            
                                                                    for(int i=0;i<nbjoueurs; i++)
                                                                    {
                                                                        joueurs[i].ingame = true;
                                                                    }
                                                                //Il reste à rajouter les conditions : si tout les civils ont ete elimines et qu'il reste des undercover, les undercover gagnent la partie
                                                                //Et si tout les civils ET les undercover ont ete elimines, Mr.White gagne la partie
                                                                    for(manche=0; manche<nbjoueurs; manche++)
                                                                    {
                                                                        for(tour=0; tour<nbjoueurs; tour++)
                                                                        {   //Tour de jeu : Un joueur propose un mot à l'équipe
                                                                            if(joueurs[tour].ingame)
                                                                            {
                                                                            printf("Le joueur %s propose un mot :\n", joueurs[tour].pseudo);
                                                                            scanf("%s", proposition);
                                                                            }
                                                                        }   //Après enquête et concertation l'équipe décide d'éliminer un joueur
                                                                        elimination:
                                                                        printf("Il est maintenant temps d'eliminer le joueur qui vous parait suspect\n");
                                                                        printf("Apres concertation les joueurs ont decides d'eliminer le joueur :\n");
                                                                        scanf("%s", joueurElimine);
                                                            
                                                                        if(strcmp(joueurElimine, joueurs[0].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[0].pseudo);
                                                                            joueurs[0].ingame = false;
                                                                            if(joueurs[0].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                            else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[1].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[1].pseudo);
                                                                            joueurs[1].ingame = false;
                                                                            if(joueurs[1].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[2].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[2].pseudo);
                                                                            joueurs[2].ingame = false;
                                                                            if(joueurs[2].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[3].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[3].pseudo);
                                                                            joueurs[3].ingame = false;
                                                                            if(joueurs[3].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[4].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[4].pseudo);
                                                                            joueurs[4].ingame = false;
                                                                            if(joueurs[4].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[5].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[5].pseudo);
                                                                            joueurs[5].ingame = false;
                                                                            if(joueurs[5].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[6].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[6].pseudo);
                                                                            joueurs[6].ingame = false;
                                                                            if(joueurs[6].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[7].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[7].pseudo);
                                                                            joueurs[7].ingame = false;
                                                                            if(joueurs[7].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[8].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[8].pseudo);
                                                                            joueurs[8].ingame = false;
                                                                            if(joueurs[8].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[9].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[9].pseudo);
                                                                            joueurs[9].ingame = false;
                                                                            if(joueurs[9].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[10].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[10].pseudo);
                                                                            joueurs[10].ingame = false;
                                                                            if(joueurs[10].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[11].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[11].pseudo);
                                                                            joueurs[11].ingame = false;
                                                                            if(joueurs[11].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[12].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[12].pseudo);
                                                                            joueurs[12].ingame = false;
                                                                            if(joueurs[12].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[13].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[13].pseudo);
                                                                            joueurs[13].ingame = false;
                                                                            if(joueurs[13].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[14].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[14].pseudo);
                                                                            joueurs[14].ingame = false;
                                                                            if(joueurs[14].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[15].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[15].pseudo);
                                                                            joueurs[15].ingame = false;
                                                                            if(joueurs[15].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[16].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[16].pseudo);
                                                                            joueurs[16].ingame = false;
                                                                            if(joueurs[16].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[17].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[17].pseudo);
                                                                            joueurs[17].ingame = false;
                                                                            if(joueurs[17].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[18].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[18].pseudo);
                                                                            joueurs[18].ingame = false;
                                                                            if(joueurs[18].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[19].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[19].pseudo);
                                                                            joueurs[19].ingame = false;
                                                                            if(joueurs[19].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else if(strcmp(joueurElimine, joueurs[20].pseudo)==0)
                                                                        {
                                                                            printf("Le joueur %s a ete elimine\n", joueurs[20].pseudo);
                                                                            joueurs[20].ingame = false;
                                                                            if(joueurs[20].role == MR_WHITE)
                                                                            {
                                                                                printf("Mr.White a ete demasque, il peut encore gagner en devinant le mot principal :\n");
                                                                                scanf("%s", proposition);
                                                                                if((random == 1 && strcmp(proposition, motPrincipal1) == 0) || (random == 2 && strcmp(proposition, motPrincipal2) == 0) || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                                {
                                                                                    printf("Mr.White gagne la partie !!");
                                                                                    return 0;
                                                                                }
                                                                                else{printf("Les civils gagnent la partie !");return 0;}
                                                                            }
                                                                        }
                                                                        else
                                                                        {
                                                                            printf("Joueur introuvable\n");
                                                                            goto elimination;
                                                                        }
                                                                        for(int i=0; i<nbjoueurs; i++)
                                                                        {
                                                                            if(joueurs[i].ingame)
                                                                            {
                                                                                printf("Il reste en jeu les joueurs %s\n", joueurs[i].pseudo);
                                                                            }
                                                                        }
                                                                    }
                                                                    fclose(fichier);
                                                                }
                                                                else
                                                                {
                                                                    printf("Impossible d'ouvrir le fichier undercover.txt");
                                                                }
                                                                //Fin du programme
                                                            
                                                                return 0;
                                                            }



                                                            • Partager sur Facebook
                                                            • Partager sur Twitter
                                                              18 novembre 2022 à 13:45:49

                                                              Pour simplifier la deuxième partie du programme, il faudrait que tu commences par trouver le n° du joueur éliminé. Quelque chose de ce genre (pas testé, c'est juste pour donner l'idée) :

                                                              // Recherche du n° du joueur éliminé (en faire une petite fonction)
                                                              int num_elim = -1 ;  // initialisation à une valeur invalide
                                                              for (int i = 0 ; i < 20 ; i++)
                                                              {
                                                                  if (strcmp(joueurElimine, joueurs[i].pseudo)==0)
                                                                     num_elim = i;
                                                              }
                                                              // et vérifier que le n° est bien entre 0 et 19

                                                              Ainsi, les 20 blocs pourront être réduits à un seul :

                                                                          printf("Le joueur %s a ete elimine\n", joueurs[num_elim].pseudo);
                                                                          joueurs[num_elim].ingame = false;
                                                                          if (joueurs[num_elim].role == MR_WHITE)
                                                                          {
                                                                              printf("Mr.White a ete demasque, il peut encore gagner" 
                                                                                     " en devinant le mot principal :\n");
                                                                              scanf("%s", proposition);
                                                                              if((random == 1 && strcmp(proposition, motPrincipal1) == 0)
                                                                              || (random == 2 && strcmp(proposition, motPrincipal2) == 0)
                                                                              || (random == 3 && strcmp(proposition, motPrincipal3) == 0))
                                                                              {
                                                                              // etc. etc.

                                                              (Attention : ton tableau de joueurs a été déclaré de taille 20, donc les indices vont de 0 à 19, pas de 0 à 20 comme dans le programme que tu as posté.)

                                                              -
                                                              Edité par robun 18 novembre 2022 à 13:51:03

                                                              • Partager sur Facebook
                                                              • Partager sur Twitter

                                                              Reproduire le jeu Undercover dans la console

                                                              × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                                                              × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                                                              • Editeur
                                                              • Markdown