Projet ''Le Jeu des Allumettes"

Fermé
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017 - 26 août 2016 à 12:50
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 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;
}




A voir également:

1 réponse

tuxboy Messages postés 995 Date d'inscription lundi 23 juillet 2012 Statut Membre Dernière intervention 28 mai 2019 190
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)

Pour s'inspirer des logiques de jeu, je lirais :
https://blogdemaths.wordpress.com/2012/06/03/devenez-le-maitre-dune-variante-du-jeu-de-nim/

Si ces remarques peuvent t'aider... ;)
0
jeandchanel Messages postés 135 Date d'inscription vendredi 10 juin 2016 Statut Membre Dernière intervention 31 mai 2017
29 août 2016 à 08:58
@tuxboy
merci, pour tes remarques je comptes bien les mettre en pratique.
0