jeandchanel
Messages postés135Date d'inscriptionvendredi 10 juin 2016StatutMembreDernière intervention31 mai 2017
-
26 août 2016 à 12:50
jeandchanel
Messages postés135Date d'inscriptionvendredi 10 juin 2016StatutMembreDernière intervention31 mai 2017
-
29 août 2016 à 08:58
Bonjour, voici le " Jeu des allumettes ", bien vouloir tester ce code source et y apporter des critiques constructives dans le sens de l’amélioration et de plus de performances.
Donneurs de leçons s'abstenir !!!
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#define SOLO 1
#define MULTI 2
typedef enum bool bool;
enum bool
{
TRUE, FALSE
};
typedef struct Niveau Niveau;
struct Niveau
{
char nomNiveau[100];
int nbDepart;
};
Niveau niveaux[] =
{
{"Facile", 39},
{"Moyen", 27 },
{"Difficile", 13}
};
void viderBuffer()
{
int c = 0;
while(c != '\n' && c != EOF)
{
c = getchar();
}
}
int lire(char* chaine, int longueurChaine)
{
char* positionEntree = NULL;
if(fgets(chaine, longueurChaine, stdin) != NULL)
{
positionEntree = strchr(chaine, '\n');
if(positionEntree != NULL)
{
*positionEntree = '\0';
}return 1;
}else
{
viderBuffer();
return 0;
}
}
long lireLong()
{
char nombreTexte[100] = {0};
if(lire(nombreTexte, 100))
{
return strtol(nombreTexte, NULL, 10);
}else
{
viderBuffer();
return 0;
}
}
double lireDouble()
{
char nombreTexte[100] = {0};
char *positionVirgule = NULL;
if(lire(nombreTexte, 100))
{
positionVirgule = strchr(nombreTexte, ',');
if(positionVirgule != NULL)
{
*positionVirgule = '.';
}return strtod(nombreTexte, NULL);
}else
{
viderBuffer();
return 0;
}
}
void debutPartie()
{
printf("\n"
"**************************************\n"
"********LE JEU DES ALLUMETTES*********\n"
"********Code par Jean Dechanel********\n"
"**************************************\n\n");
}
int demanderMenu(long modeMenu)
{
printf("\n"
"MENU\n"
"Bien vouloir choisir !\n"
"1. Nombre Predefini(21)\n2. Nombre Aleatoire\n3. Fixer un Nombre\n");
do
{
printf("\n"
"Votre choix ? ");
modeMenu = lireLong();
}while(modeMenu < 1 || modeMenu > 2);
return modeMenu;
}
int demanderModeJeu(long modeJeu)
{
printf("\n"
"MODE DE JEU\n"
"Bien vouloir choisir un mode de jeu !\n"
"1. Mode Solo\n2. Mode Multi\n");
do
{
printf("\n"
"Votre choix ? ");
modeJeu = lireLong();
}while(modeJeu < 1 || modeJeu > 2);
return modeJeu;
}
Niveau demanderNiveauJeu(long choixNiveau)
{
printf("\n"
"NIVEAU DE JEU\n"
"Bien vouloir choisir un niveau de jeu !\n"
"1. Facile\n2. Moyen\n3. Difficile\n");
do
{
printf("\n"
"Votre choix ? ");
choixNiveau = lireLong();
}while(choixNiveau < 1 || choixNiveau > 3);
return niveaux[choixNiveau - 1];
}
bool rejouerPartie(long choice)
{
printf("\n"
"Voulez-vous rejouer une autre Partie ?\n"
"1. Oui\n2. Non\n");
do
{
printf("\n"
"Votre choix ? ");
choice = lireLong();
}while(choice < 1 || choice > 2);
return choice == 1;
}
void affichage(Niveau niveauJeu)
{
int i;
// Cette boucle affiche les allumettes
for(i = 1; i <= niveauJeu.nbDepart; i++)
{
printf("|");
}
// Cette boucle affiche les allumettes
}
int menuSolo(long userChoice)
{
printf("\n"
"Que voulez-vous faire ?\n"
"1. Affronter l'Ordinateur ?\n2. Affronter l'Ordinateur avec un nombre Predefini(20) ?\n");
do
{
printf("\n"
"Votre choix ? ");
userChoice = lireLong();
}while(userChoice < 1 || userChoice > 3);
return userChoice;
}
void level1(Niveau niveauJeu, long nbAEnlever, long k, long min, long max)
{
do
{
do
{
printf("\n\nJoueur, nombre d'allumettes a enlever : ");
nbAEnlever = lireLong();
}while(nbAEnlever < 1 || nbAEnlever > 3);
niveauJeu.nbDepart = niveauJeu.nbDepart - nbAEnlever;
printf("\n"
"Il reste %d allumettes ", niveauJeu.nbDepart);
affichage(niveauJeu);
if(niveauJeu.nbDepart == 1)
{
niveauJeu.nbDepart = 0;
printf("\n\nBravo Joueur, vous avez Gagne !\n");
}
if (niveauJeu.nbDepart > 0)
{
k = rand() % (max - min + 1) + min;
if(niveauJeu.nbDepart == 3)
k = 2;
else if(niveauJeu.nbDepart == 2)
k = 1;
niveauJeu.nbDepart = niveauJeu.nbDepart - k ;
printf("\n\nOrdinateur, nombre d'allumettes a enlever : %ld\n"
"\nIl reste %d allumettes ", k, niveauJeu.nbDepart);
affichage(niveauJeu);
if(niveauJeu.nbDepart == 1)
{
niveauJeu.nbDepart = 0;
printf("\n\nOrdinateur, Gagne !\n");
}
}
}while(niveauJeu.nbDepart > 1);
}
void level2(Niveau niveauJeu, long nbAEnlever, long k, long min, long max)
{
do
{
do
{
printf("\n\nJoueur, nombre d'allumettes a enlever : ");
nbAEnlever = lireLong();
}while(nbAEnlever < 1 || nbAEnlever > 3);
niveauJeu.nbDepart = niveauJeu.nbDepart - nbAEnlever;
printf("\n"
"Il reste %d allumettes ", niveauJeu.nbDepart);
affichage(niveauJeu);
if(niveauJeu.nbDepart == 1)
{
niveauJeu.nbDepart = 0;
printf("\n\nBravo Joueur, vous avez Gagne !\n");
}
if (niveauJeu.nbDepart > 0)
{
if (niveauJeu.nbDepart >= 19)
k = rand() % (max - min + 1) + min;
else if (niveauJeu.nbDepart % 2 == 0)
k = 1 ;
else if (niveauJeu.nbDepart % 2 == 1)
k = 2 ;
else if (niveauJeu.nbDepart % 2 == 0)
k = 3 ;
niveauJeu.nbDepart = niveauJeu.nbDepart - k ;
printf ("\n\nOrdinateur, nombre d'allumettes a enlever : %ld\n"
"\nIl reste %d allumettes ", k, niveauJeu.nbDepart);
affichage(niveauJeu);
if(niveauJeu.nbDepart == 1)
{
niveauJeu.nbDepart = 0;
printf("\n\nOrdinateur, Gagne !\n");
}
}
}while(niveauJeu.nbDepart > 1);
}
long level3(Niveau niveauJeu, long nbAEnlever, long k)
{
do
{
do
{
printf("\n\nJoueur, nombre d'allumettes a enlever : ");
nbAEnlever = lireLong();
}while(nbAEnlever < 1 || nbAEnlever > 3);
niveauJeu.nbDepart = niveauJeu.nbDepart - nbAEnlever;
printf("\n"
"Il reste %d allumettes ", niveauJeu.nbDepart);
affichage(niveauJeu);
if(niveauJeu.nbDepart == 1)
{
niveauJeu.nbDepart = 0;
printf("\n\nBravo Joueur, vous avez Gagne !\n");
}
if (niveauJeu.nbDepart > 0)
{
if (niveauJeu.nbDepart == 12)
k = 3 ;
else if (niveauJeu.nbDepart % 2 == 1)
k = 2;
else if (niveauJeu.nbDepart % 2 == 0)
k = 1;
else if (niveauJeu.nbDepart == 2)
k = 1;
niveauJeu.nbDepart = niveauJeu.nbDepart - k ;
printf ("\n\nOrdinateur, nombre d'allumettes a enlever : %ld\n"
"\nIl reste %d allumettes ", k, niveauJeu.nbDepart);
affichage(niveauJeu);
if(niveauJeu.nbDepart == 1)
{
niveauJeu.nbDepart = 0;
printf("\n\nOrdinateur, Gagne !\n");
}
}
}while(niveauJeu.nbDepart > 1);
}
void affichageAllumettes(int nbDepart)
{
int i;
for(i = 1; i <= nbDepart; i++)
{
printf("|");
}
}
void nbPredefini(long nbDepart, long nbAEnlever, long k)
{
printf("\nLe nombre d'allumettes de depart est %d", nbDepart);
do
{
do
{
printf("\n\nJoueur, nombre d'allumettes a enlever : ");
nbAEnlever = lireLong();
}while(nbAEnlever < 1 || nbAEnlever > 3);
nbDepart = nbDepart - nbAEnlever;
printf("\n"
"Il reste %ld allumettes ", nbDepart);
affichageAllumettes(nbDepart);
if(nbDepart == 1)
{
nbDepart = 0;
printf("\n\nBravo Joueur, vous avez Gagne !\n");
}
if (nbDepart != 0)
{
if (nbDepart == 13 && k != 0)
k = 2;
else if (nbDepart % 2 == 1)
k = 2;
else if (nbDepart % 2 == 0)
k = 1;
else if (nbDepart % 2 == 0)
k = 3;
nbDepart = nbDepart - k ;
printf ("\n\nOrdinateur, nombre d'allumettes a enlever : %ld\n"
"\nIl reste %ld allumettes ", k, nbDepart);
affichageAllumettes(nbDepart);
if(nbDepart == 1)
{
nbDepart = 0;
printf("\n\nOrdinateur, Gagne !\n");
}
}
}while(nbDepart > 1);
}
void player1VsPlayer2(Niveau niveauJeu, long nbAEnlever)
{
printf("\nLe nombre d'allumettes de depart est %d", niveauJeu.nbDepart);
do
{
do
{
printf("\n\nJoueur1, nombre d'allumettes a enlever : ");
nbAEnlever = lireLong();
}while(nbAEnlever < 1 || nbAEnlever > 3);
niveauJeu.nbDepart = niveauJeu.nbDepart - nbAEnlever;
printf("\nIl reste %d allumettes ", niveauJeu.nbDepart);
affichage(niveauJeu);
if(niveauJeu.nbDepart == 1)
{
niveauJeu.nbDepart = 0;
printf("\n\nBravo Joueur1, vous avez Gagne !\n");
}
if(niveauJeu.nbDepart != 0)
{
do
{
printf("\n\nJoueur2, nombre d'allumettes a enlever : ");
nbAEnlever = lireLong();
}while(nbAEnlever < 1 || nbAEnlever > 3);
niveauJeu.nbDepart = niveauJeu.nbDepart - nbAEnlever;
printf("\nIl reste %d allumettes ", niveauJeu.nbDepart);
affichage(niveauJeu);
}
if(niveauJeu.nbDepart == 1)
{
niveauJeu.nbDepart = 0;
printf("\n\nBravo Joueur2, vous avez Gagne !\n");
}
}while(niveauJeu.nbDepart > 1);
}
void ordiVsPlayer(Niveau niveauJeu, long nbAEnlever, long k)
{
printf("\nLe nombre d'allumettes de depart est %d", niveauJeu.nbDepart);
switch(niveauJeu.nbDepart)
{
case 39 :
level1(niveauJeu, nbAEnlever, k, 1, 3);
break;
case 27 :
level2(niveauJeu, nbAEnlever, k, 1, 3);
break;
case 13 :
level3(niveauJeu, nbAEnlever, k);
break;
}
}
int main()
{
long modeJeu = 0, choixNiveau = 0, userChoice = 0, choice = 0;
long nbAEnlever = 0, k = 0;
Niveau niveauJeu;
srand(time(NULL));
do
{
modeJeu = demanderModeJeu(modeJeu);
printf("\nBienvenu au mode %s !\n", modeJeu == SOLO ? "Solo" : "Multi");
niveauJeu = demanderNiveauJeu(choixNiveau);
printf("\nBienvenu au niveau %s !\n", niveauJeu.nomNiveau);
if(modeJeu == SOLO)
{
userChoice = menuSolo(userChoice);
printf( "\nVous avez choisi %s !\n", userChoice == 1 ? "HumanVSOrdi" : "Predefini" );
userChoice == 1 ? ordiVsPlayer(niveauJeu, nbAEnlever, k) : nbPredefini(20, nbAEnlever, k);
}
else
{
player1VsPlayer2(niveauJeu, nbAEnlever);
}
}while( rejouerPartie(choice) );
return 0;
}
tuxboy
Messages postés995Date d'inscriptionlundi 23 juillet 2012StatutMembreDernière intervention28 mai 2019190 27 août 2016 à 11:29
La principale critique serait de dire que ce code est très propre, très académique, qu'il fait plaisir à lire. Il y a certainement des améliorations, sur les niveaux du genre
long level(int Level, Niveau niveauJeu, long nbAEnlever, long k)
29 août 2016 à 08:58
merci, pour tes remarques je comptes bien les mettre en pratique.