Booleen, if pour plus ou moins (c)

Booleen, if pour plus ou moins (c) - C - Programmation

Marsh Posté le 08-03-2014 à 15:16:15    

Bonjour a vous, je débute dans la programmation, c'est tout frais je m'y suis mis il y à 3 jours sur mon temps libre.
J'ai donc suivi les cours d'Open Classroom, et arrivé a l'exercice du "plus ou moins" il nous propose de l'amélioré... (en ajoutant un compteur de coup, un système de niveau ect)  
J'ai donc fait le jeux, en ayant besoin d'un petit coups de pouce cependant (un doute sur la manière de procéder) mais maintenant il fonctionne !
 
Donc pour la sélection du mode 1 ou 2 joueurs, il conseil d'utilisé des booleens !
 
J'ai donc mon code qui donne ça :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main()
  5.     int nombreInconnu = 0, nombreEntree = 0, coups = 0;
  6.     const int MAX = 100, MIN = 1;
  7.     srand(time(NULL));
  8.     nombreInconnu = (rand() % (MAX - MIN + 1)) + MIN;
  9. do
  10. {
  11.     coups++;
  12.     printf("Quel est le nombre inconnu ?\n" );
  13.     scanf("%d", &nombreEntree);
  14.     if (nombreEntree < nombreInconnu)
  15.         printf("C'est plus !\n" );
  16.     else if(nombreEntree > nombreInconnu)
  17.         printf("C'est moins !\n" );
  18.     else
  19.         printf("Vous avez gagnez en %d coups !", coups);
  20. } while (nombreEntree != nombreInconnu);
  21.     return 0;
  22. }


 
 
Maintenant j'aimerais y ajouter ce fameux mode 1 ou 2 joueurs, et là ça bloque, je pensais faire :

Code :
  1. int joueur_1 = 1, joueur_2 = 0;
  2.     if (joueur_1)
  3.         int nombreInconnu = 0, nombreEntree = 0, coups = 0;
  4.         const int MAX = 100, MIN = 1;
  5.         srand(time(NULL));
  6.         nombreInconnu = (rand() % (MAX - MIN + 1)) + MIN;
  7.     else
  8.         int nombreInconnu = 0, nombreEntree = 0, coups = 0;
  9.         int MAX = 0, MIN = 1;
  10.         printf("Choisir le nombre max :\n" );
  11.         scanf("%d", &MAX);


 
Mais visiblement int ne fonctionne pas après un if ?
 
Je voudrais, si je joueur choisis le mode solo, que l'ordi tire un nombre au hasard, si le joueur choisis le mode versus, que l'utilisateur choisisse un nombre max !

Reply

Marsh Posté le 08-03-2014 à 15:16:15   

Reply

Marsh Posté le 08-03-2014 à 16:40:49    

Je vois un problème dans ton code: Il faut que tu entoures le contenu du "if" et du "else" par les accolades. En l'absence de ces accolades, seule la première ligne de chaque bloc est considéré comme étant dans la condition.
 
Du coup dans ton premier code ça fonctionne parce qu'il n'y a qu'une ligne, par contre dans ton seconde j'imagine que le compilateur doit te jeter parce que ton if et ton else sont séparés par des instructions qui n'ont rien à faire là
 
Donc:
 

Code :
  1. int joueur_1 = 1, joueur_2 = 0;
  2.     if (joueur_1)
  3.     {
  4.         int nombreInconnu = 0, nombreEntree = 0, coups = 0;
  5.         const int MAX = 100, MIN = 1;
  6.         srand(time(NULL));
  7.         nombreInconnu = (rand() % (MAX - MIN + 1)) + MIN;
  8.     }
  9.     else
  10.     {
  11.         int nombreInconnu = 0, nombreEntree = 0, coups = 0;
  12.         int MAX = 0, MIN = 1;
  13.         printf("Choisir le nombre max :\n" );
  14.         scanf("%d", &MAX);
  15.     }

Message cité 1 fois
Message édité par WiiDS le 08-03-2014 à 16:41:56

---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 08-03-2014 à 20:21:48    

WiiDS a écrit :

Je vois un problème dans ton code: Il faut que tu entoures le contenu du "if" et du "else" par les accolades. En l'absence de ces accolades, seule la première ligne de chaque bloc est considéré comme étant dans la condition.
 
Du coup dans ton premier code ça fonctionne parce qu'il n'y a qu'une ligne, par contre dans ton seconde j'imagine que le compilateur doit te jeter parce que ton if et ton else sont séparés par des instructions qui n'ont rien à faire là


 
Yes, dans le cours ça y est, mais je ne sais pas pourquoi j'ai été amené à les enlever, et je n'ai pas pensé a les remettre !
 
Bon, mais du coup je me retrouve avec un autre problème, la valeur max ici : ( j'ai modifié le code pour éviter les booleens )

Code :
  1. if (choix_1 == 1) // joueur solo, nombre aleatoire.
  2.         {
  3.         const int MAX = 100, MIN = 1;
  4.         srand(time(NULL));
  5.         nombreInconnu = (rand() % (MAX - MIN + 1)) + MIN;
  6.         }
  7.     else if (choix_1 == 2) // mode versus, 1 joueur doit choisir un nombre maxi.
  8.         {
  9.         int MAX = 0, MIN = 1;
  10.         printf("Choisir le nombre max :\n" );
  11.         scanf("%d", &MAX);
  12.         }


 
me laisse la valeur a 0, est-ce que c'est du au fait qui apparaisse dans la condition if ? (malgré le faite que normalement elle ne doit pas être prise en compte ?)

Reply

Marsh Posté le 08-03-2014 à 21:11:56    

Bonjour !
 
Vous déclarez la valeur dans la boucle, donc elle est perdue une fois que vous sortez de cette boucle (et si vous avez déclaré une variable avec le même nom à l'extérieur de cette boucle, cette variable ne sera pas modifiée.
 
Bonne continuation !

Reply

Marsh Posté le 08-03-2014 à 22:10:22    

Farian a écrit :

Bonjour !
 
Vous déclarez la valeur dans la boucle, donc elle est perdue une fois que vous sortez de cette boucle (et si vous avez déclaré une variable avec le même nom à l'extérieur de cette boucle, cette variable ne sera pas modifiée.
 
Bonne continuation !


 
Vous parlez de la boucle while du premier code ? si oui, non, la valeur est déclaré avant cette boucle, sinon, comment je peut contourner ça ? Etant donnée qu'il faut que ce soit, soit l'un, soit l'autre système de génération du nombre a trouver ?

Reply

Marsh Posté le 08-03-2014 à 22:15:10    

Non, je parle de celle du if : les accolades forment un bloc dans lequel on peut déclarer des variables qui ont comme durée de vie le bloc, et qui masquent éventuellement des variables de même nom qui ont été déclarées en dehors du bloc.
 
(Erreur de ma part, j'ai parlé de boucle alors que je voulais parler de bloc :) )
 
Bonne continuation !

Reply

Marsh Posté le 08-03-2014 à 22:34:43    

Farian a écrit :

Non, je parle de celle du if : les accolades forment un bloc dans lequel on peut déclarer des variables qui ont comme durée de vie le bloc, et qui masquent éventuellement des variables de même nom qui ont été déclarées en dehors du bloc.
 
(Erreur de ma part, j'ai parlé de boucle alors que je voulais parler de bloc :) )
 
Bonne continuation !


 
Je comprend en fait la valeur de max est mémorisé tant qu'on ne sort pas du "else if" en gros, une fois sorti il redevient 0, j'en déduit donc que ce n'est pas la bonne méthode pour arriver a mes fin, ou ça l'est mais demande plus de réflexion ?

Reply

Marsh Posté le 08-03-2014 à 22:51:31    

C'est tout à fait ça, si la variable est déjà déclarée en dehors, il suffit de ne pas la redéclarer, et vous la modifiez dans le if et le else.
 
J'espère être clair et bien comprendre vos interrogations :)

Reply

Marsh Posté le 08-03-2014 à 23:40:30    

Tout a fait, a un détail près :  
 
La variable MAX n'est pas déclarer avant, mais uniquement en aléatoire sur le IF, et en manuel sur le else if !
 
Je posterais le code complet demain ce sera plus clair ;)

Reply

Marsh Posté le 09-03-2014 à 12:18:08    

Donc comme je disais :

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. int main()
  5. {
  6.     int choix_1 = 0, coups = 0, nombreInconnu = 0, nombreEntree = 0;
  7.     printf("Selectionnez le nombre de joueur :\n" );
  8.     printf("1. 1 joueur\n" );
  9.     printf("2. 2 joueurs\n" );
  10.     scanf("%d", &choix_1);
  11.     printf("Vous avez choisis le mode %d joueur(s)\n\n", choix_1);
  12. /* Ici si le joueur choisis le mode solo, alors la machine choisis un nombre.
  13. sinon si l'utilisateur choisis le mode versus, alors un des joueurs doit pouvoir choisir un nombre !*/
  14.     if (choix_1 == 1)
  15.         {
  16.         const int MAX = 100, MIN = 1;
  17.         srand(time(NULL));
  18.         nombreInconnu = (rand() % (MAX - MIN + 1)) + MIN;
  19.         }
  20.     else if (choix_1 == 2)
  21.         {
  22.         int MAX = 0, MIN = 1;
  23.         printf("Choisir le nombre max :\n" );
  24.         scanf("%d", &MAX);
  25.         }
  26. do
  27. {
  28.     coups++;
  29.     printf("Quel est le nombre inconnu ?\n" );
  30.     scanf("%d", &nombreEntree);
  31.     if (nombreEntree < nombreInconnu)
  32.         printf("C'est plus !\n" );
  33.     else if(nombreEntree > nombreInconnu)
  34.         printf("C'est moins !\n" );
  35.     else
  36.         printf("Vous avez gagnez en %d coups !", coups);
  37. } while (nombreEntree != nombreInconnu);
  38.     return 0;
  39. }


 
Elle n'est donc logiquement déclarée qui si "IF" ou "ELSE IF"
Le problème vient donc juste que la valeur s'efface a moment de sortir du bloc ?
 
Mais si les instructions sont oubliées une fois sortie du bloc, pourquoi le mode solo fonctionne ? J'ai du rater un truc, mais j'ai beau chercher je ne vois pas pourquoi ça fonctionne pour le choix 1, et pas le 2 ?
 

Reply

Marsh Posté le 09-03-2014 à 12:18:08   

Reply

Marsh Posté le 09-03-2014 à 13:45:50    

Code :
  1. else if (choix_1 == 2)
  2.         {
  3.         int MAX = 0, MIN = 1;
  4.         printf("Choisir le nombre max :\n" );
  5.         scanf("%d", &MAX);
  6.         }


 
Pk tu veux qu'il choisisse le nombre max ? Il faut qu'il choisisse le nombre inconnu non ?
Et mettre &nombreinconnu à la place de &MAX
 
Le premier choix marche parce que la variable nombreinconnu est déclarée globalement en haut.
Le deuxième non parce que la valeur de MAX est juste connue dans ton bloc.
Il faudrait le sortir et le mettre global

Reply

Marsh Posté le 09-03-2014 à 18:12:27    

Je pense que l'idée de son jeu, c'est de choisir une intervalle dans laquelle le nombre inconnu sera choisi, d'où la lecture d'un int pour set le max


---------------
"I can cry like Roger. It's just a shame I can't play like him" - Andy Murray, 2010
Reply

Marsh Posté le 10-03-2014 à 00:51:24    

Je@nb a écrit :


 
Pk tu veux qu'il choisisse le nombre max ? Il faut qu'il choisisse le nombre inconnu non ?
Et mettre &nombreinconnu à la place de &MAX
 
Le premier choix marche parce que la variable nombreinconnu est déclarée globalement en haut.
Le deuxième non parce que la valeur de MAX est juste connue dans ton bloc.
Il faudrait le sortir et le mettre global


 
Raaaaah, je m'en veut de ne pas y avoir pensé plus tôt  :kaola: effectivement ça devrais fonctionner  :hello:  
 
 

WiiDS a écrit :

Je pense que l'idée de son jeu, c'est de choisir une intervalle dans laquelle le nombre inconnu sera choisi, d'où la lecture d'un int pour set le max


Ca c'est pour la 3eme optimisation, en mode solo, le joueur peut choisir 3 niveau de difficultés, mais j'y suis pas encore  :D  
 

Reply

Marsh Posté le 10-03-2014 à 20:26:59    

Bon bah voilà, les 3 niveaux de difficultés sont réglé aussi :)
 
Un grand merci a vous du coup de pouce  :hello:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed