Se connecter avec
S'enregistrer | Connectez-vous

Questions de n00b: Part 2

Dernière réponse : dans Programmation

Bon voila c'est encore moi :p 
Toujours en train de m'entrainer en C/C++ sur des jeux (bidons je vous l'accorde :D )

Donc je vous montre ce que j'ai fait:

  1. int main ()
  2. {
  3. long de1 = 0, de2 = 0, de3 = 0, essais = 0, victoire = 0;
  4. char lance = 0;
  5. char restart = 0;
  6.  
  7. printf ("JEU DU 421 \n");
  8.  
  9. do //Début de boucle restart
  10. {
  11. for (essais = 1, victoire =0 ; essais < 3 || !victoire ; essais ++) //Boucle du jeu: lancement des dès + test
  12. {
  13. do //Lancement des dés
  14. {
  15. printf ("Appuyez sur L, puis entree pour lancer les des: ");
  16. scanf ("%c", &lance);
  17. } while ((lance != 'L') && (lance !='l')); //Verifie la touche préssée
  18. srand(time(NULL)); //Lancement des dés
  19. de1 = (rand() % (6 - 1 + 1)) + 1;
  20. de2 = (rand() % (6 - 1 + 1)) + 1;
  21. de3 = (rand() % (6 - 1 + 1)) + 1;
  22. //Affichage valeur des dés
  23. printf ("\n Vos des on fait %ld, %ld, %ld,", de1, de2, de3);
  24. //Verif 421 + resultat
  25. if ((de1 = (4 || 2 || 1)) && (de2 = (4 || 2 || 1)) && (de3 = (4 || 2 || 1)) && (de1 != de2 != de3))
  26. {
  27. printf ("Bravo vous avez gagnez en %ld essais !\n", essais);
  28. victoire = 1;
  29. printf ("Victoire vaut %ld\nEssais vaut %ld\n", victoire, essais); //TEST TEMPORAIRE
  30. }
  31. else
  32. {
  33. printf ("Desole vous n'avez pas fait 421, mais vous pouvez relancer les des\n");
  34. }
  35. } //FIN DU JEU
  36. printf ("Le jeu est fini\nSi vous voulez rejouer appuyez sur O, puis sur entree.\n"); //Rejouer
  37. scanf ("%c", &restart); //Saisie restart
  38. } while (restart == 'O'); //Fin de boucle restart
  39. return 0;
  40. }


1/Le texte à la ligne 15 s'affiche une fois au début et après il s'affiche toujours

deux fois (sauf quand on ne saisit rien...)

2/La boucle for fonctionne comme elle veut et je ne sais pas pourquoi (encore ses

saletés de conditions :D )...

3/La condition if fait toujours gagner.

4/La génération des dés n'est pas terrible car elle fonctionne avec le temps du

systeme (si on lance deux fois à la meme seconde les resultats sont les memes...)

4/Et enfin le dernier scanf ne fonctionne pas (le jeu se relance direcetement)


Bon voila, j'ai quand meme assez reflechis à tout ca, et j'aurais bien besoin de votre

aide :D 

Merci les gens ;) 

Autres pages sur : questions n00b part

Lassé par la pub ? Créez un compte
Expert Programmation

Ne pas utiliser scanf. :non: 
Dans ce cas particulier, utiliser plutot getc. :o 

Sors l'initialisation du générateur d'aléa de la boucle. Une seule fois suffit pour tout le programme. :o 

  1. essais < 3 || !victoire
Lois de Morgan à réviser :D 

Citation :

1/Le texte à la ligne 15 s'affiche une fois au début et après il s'affiche toujours

deux fois (sauf quand on ne saisit rien...)


Il faut que tu rajoutes \n à la fin du printf pour forcer l'affichage.


Ensuite, victoire devrait plutot etre un booleen vu l'utilisation que tu en fais.

Citation :

3/La condition if fait toujours gagner.


Normal, un test d'égalité c'est == et pas =

Ton pb de scanf sera resolu en utilisant getc comme te l'a indique zeb.

Citation :

de1 = (rand() % (6 - 1 + 1)) + 1;


Le (6-1+1) te sert à quoi ...? Ca fait toujours 6 non ?

Voila ce que je te propose pour ta generation de nombre aleatoire (src=developpez.com):
  1. int randomValue = ((int)((float)rand() / RAND_MAX * (5)))+1;






Bon désolé du temps de réaction mon modem adsl était mort.

Donc j'ai remplacé les scanf par des getc(stdin), mais en fait le problème c'est la touche entrée je pense.
J'ai aussi remplacé les printf ou je n'avais pas besoin d'afficher de variable par des puts (c'est mieux non ?)

Donc voici mon code qui fonctionne à peu près correctement:

  1. {
  2. long de1 = 0, de2 = 0, de3 = 0, essais = 0;
  3. char lance = 0, restart = 0;
  4. bool victoire = 0;
  5.  
  6. puts ("JEU DU 421 \nVous avez 15 essais pour faire 421 avec les des\n");
  7. srand(time(NULL)); //Initialisation de la génération des dés
  8.  
  9. do //Début de boucle restart
  10. {
  11. // Boucle du jeu: lancement et génération dés + test + resultats
  12. for (essais = 1, victoire = 0 ; essais <= 15 && !victoire ; essais ++)
  13. {
  14. do //Lancement des dés
  15. {
  16. puts ("\nAppuyez sur L, puis entree pour lancer les des: ");
  17. lance = getc (stdin);
  18. if (lance == ('\n')) //PAS TERRIBLE...
  19. {
  20. puts ("\nAppuyez sur L, puis entree pour lancer les des: ");
  21. lance = getc (stdin);
  22. }
  23. while (getc (stdin) != '\n');
  24. } while ((lance != 'L') && (lance !='l')); //Verifie la touche préssée
  25. de1 = (rand() % (6 - 1 + 1)) + 1; //Génération de1
  26. de2 = (rand() % (6 - 1 + 1)) + 1; //Génération de2
  27. de3 = (rand() % (6 - 1 + 1)) + 1; //Génération de3
  28. //Affichage valeur des dés
  29. printf ("Vos des on fait %ld, %ld, %ld\n", de1, de2, de3);
  30. //Verif 421 + resultat
  31. if (((de1 == 4) || (de1 == 2) || (de1 == 1)) &&
  32. ((de2 == 4) || (de2 == 2) || (de2 == 1)) &&
  33. ((de3 == 4) || (de3 == 2) || (de3 == 1)) &&
  34. (de1 != de2) && (de2 != de3) && (de3 != de1)) //Verif 421
  35. {
  36. printf ("Bravo vous avez gagnez en %ld essais !\n", essais);
  37. victoire = 1;
  38. }
  39. else
  40. if (essais == 15)
  41. puts ("Desole c'etait votre dernier essai, vous n'avez pas fait 421 mais vous pouvez rejouer\n");
  42. else
  43. puts ("Vous n'avez pas fait 421, relancez les des\n");
  44. } //FIN DU JEU
  45. puts ("Si vous voulez rejouer appuyez sur O, puis sur entree."); //Rejouer ?
  46. restart = getc (stdin); //Saisie restart
  47. restart = toupper (restart); //Restart en MAJ
  48. } while (restart == 'O'); //Fin de boucle restart
  49. return 0;
  50. }


En fait j'ai toujours des problèmes pour la saisie de caractères, j'ai fait un petit truc (moche je pense :p ) qui fonctionne assez bien sauf quand on appuie juste sur entrée.
Lassé par la pub ? Créez un compte