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;
}
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 :
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
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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
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
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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
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;
}
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]|
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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
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
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;
}
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).
/*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).
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;
}
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.
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.
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.
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 :
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.
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.
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
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
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.
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;
}
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é.)
× 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.
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent
On écrit "j'ai tort", pas "tord" qui est le verbe "tordre" à la 3ème personne de l'indicatif présent