Jeu dallumette en langage C

Fermé
popo42 - 2 déc. 2009 à 17:01
Emmanuel Delahaye Messages postés 107 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 17 juillet 2019 - 2 déc. 2009 à 17:31
Bonjour,

nous devons réaliser le jeu d'allumette, la dernière du tas en langage c. mon programme compile en silence mais quand je l'éxecute il ne se passe rien. je n'arrive pas a trouver mes erreurs, svp aidez moi.
voila mon programme


#include <stdio.h>
#include <stdlib.h> /*bibliotheque contenant la fonction aleatoire*/

/*declarations de constantes et de types*/
void Usage (char*s){
printf ("Usage %s",s);
printf("<nb_allumettes>");
printf("\n");
}

void coup_uti(int nb_allumettes, int trait) {/*pour l'utilisateur*/
int nb;

if(trait==0){ /*trait= nb d'allumette enlevé*/
while (nb!=1 || nb!=2){
/*nb = nb d'allumette a enlever choisi par le joueur*/
printf ("vous devez donner un nb entre 1 et 2\n");
printf("Combien en prenez-vous : ");
}
printf("j'en prends %d\n",nb);
}
else{
while (nb>trait*2){
printf("vous devez prendre un nb d'allumette inférieure\n");
printf("à 2 fois le nb d'allumette pris \n");
printf("précedemment par votre adversaire\n");
printf("Combien en prenez-vous : ");
}
printf("J'en prends %d\n",nb);
nb_allumettes=nb_allumettes-nb;/*nb_allumette s= celle encore en jeu*/
printf("Il en reste %d\n",nb_allumettes);
}
}



/*declarations de fonctions*/
int main(int argc, char *argv[]) {
int nb_allumettes;
int trait;
int nb,b;

/*decodage et controle des arguments*/
if(argc < 3) {
Usage(argv [0]);
exit(-1);
}



nb_allumettes=atoi(argv[1]);
trait=atoi(argv[2]);
while(nb_allumettes > 0) {
coup_uti(nb_allumettes,trait);

/* à l'ordi de jouer*/
printf("a l'ordinateur de jouer !\n");

/*stratégie pour gagner, ramener l'autre a prendre la
5ème allumette,la 9ème,la 13ème...
en suivant la suite Un= Un-2 + Un-1; avec U0=0 et U1=1*/

if ((nb_allumettes<9)&(nb_allumettes>5)){
nb=(nb_allumettes-5);
if (nb>trait*2)
nb=1;
else
nb=nb;
}
if ((nb_allumettes<13)&(nb_allumettes>9)){
nb=(nb_allumettes-9);
if (nb>trait*2)
nb=1;
else
nb=nb;
}
if ((nb_allumettes<17)&(nb_allumettes>13)){
nb=(nb_allumettes-13);
if (nb>trait*2)
nb=1;
else
nb=nb;
}
if ((nb_allumettes<21)&(nb_allumettes>17)){
nb=(nb_allumettes-17);
if (nb>trait*2)
nb=1;
else
nb=nb;
}
if (nb_allumettes==21)
nb=1;
else if (nb_allumettes >21)
nb=rand();

printf("L'ordinateur retire %d allumettes.\n",nb);
nb_allumettes=nb_allumettes-nb;
}


if(nb_allumettes==0){
if (b==1);
/*Marqueur de "dernier joueur" a avoir retire
la ou les allumettes ce qui nous servira
a la fin pour afficher le vainqueur.*/

printf("Vouz gagnez !");
}
else{
printf("Je gagne !");
}
return(0);
}


Merci
A voir également:

2 réponses

Utilisateur anonyme
2 déc. 2009 à 17:04
c'est quoi on truc?
0
Emmanuel Delahaye Messages postés 107 Date d'inscription jeudi 18 juin 2009 Statut Membre Dernière intervention 17 juillet 2019 7
2 déc. 2009 à 17:31
"mon programme compile en silence"

Vraiment ?

-------------- Build: Debug in hello ---------------

Compiling: main.c
Linking console executable: bin\Debug\hello.exe
C:\dev\hello\main.c: In function `coup_uti':
C:\dev\hello\main.c:12: warning: 'nb' might be used uninitialized in this function
C:\dev\hello\main.c: In function `main':
C:\dev\hello\main.c:102: warning: empty body in an if-statement
C:\dev\hello\main.c:41: warning: 'nb' might be used uninitialized in this function
Output size is 20.96 KB
Process terminated with status 0 (0 minutes, 3 seconds)
0 errors, 3 warnings


Détails ici : http://www.bien-programmer.fr/codage.php#cfg_compilo

void coup_uti (int nb_allumettes, int trait)
{                               /*pour l'utilisateur */
   int nb;

   if (trait == 0)
   {                            /*trait= nb d'allumette enlevé */
      while (nb != 1 || nb != 2)


Je rappelle qu'une variable locale n'est pas initialisée par défaut. Sa valeur est donc indéterminée. Il faut donc donner une valeur initiale correcte à 'nb'. Idem dans main() et avec 'b'.
      if (b == 1);
/*Marqueur de "dernier joueur" a avoir retire
la ou les allumettes ce qui nous servira
a la fin pour afficher le vainqueur.*/

      printf ("Vouz gagnez !");

ce code n'a aucun sens. L'affichage (printf()) est inconditionnel. En effet, la seule action soumise à condition est une action 'vide' (;). Tu veux probablement :
      if (b == 1)
      {
         /* Marqueur de "dernier joueur" a avoir retire
          * la ou les allumettes ce qui nous servira
          * a la fin pour afficher le vainqueur. 
          */

         printf ("Vouz gagnez !");
      }


rand() retourne un nombre entre 0 et RAND_MAX. C'est bien ça que tu veux ?

http://www.bien-programmer.fr/notes.php#rand

En exécutant, j'obtiens :
Usage C:\dev\hello\bin\Debug\hello.exe <nb_allumettes>

Process returned -1 (0xFFFFFFFF)   execution time : 0.017 s
Press any key to continue.


Je passe donc un parametre (5) et j'ai le même résultat. Visiblement, la condition
/* decodage et controle des arguments*/
   if (argc < 3)
   {
      Usage (argv[0]);
      exit (-1);
   }


exige au moins 2 paramètres. Le texte de la fonction 'usage' est donc incomplet (à moins que la fonction de contrôle ne soit buggée...).

Pour savoir si le comportement est conforme aux attentes, il faudrait que les attentes soient clairement définies. Où est la spécification ? Où est l'analyse ?
0