Questions de n00b: Part 2

soksam

Grand Maître
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:

[cpp]int main ()
{
long de1 = 0, de2 = 0, de3 = 0, essais = 0, victoire = 0;
char lance = 0;
char restart = 0;

printf ("JEU DU 421 \n");

do //Début de boucle restart
{
for (essais = 1, victoire =0 ; essais < 3 || !victoire ; essais ++) //Boucle du jeu: lancement des dès + test
{
do //Lancement des dés
{
printf ("Appuyez sur L, puis entree pour lancer les des: ");
scanf ("%c", &lance);
} while ((lance != 'L') && (lance !='l')); //Verifie la touche préssée
srand(time(NULL)); //Lancement des dés
de1 = (rand() % (6 - 1 + 1)) + 1;
de2 = (rand() % (6 - 1 + 1)) + 1;
de3 = (rand() % (6 - 1 + 1)) + 1;
//Affichage valeur des dés
printf ("\n Vos des on fait %ld, %ld, %ld,", de1, de2, de3);
//Verif 421 + resultat
if ((de1 = (4 || 2 || 1)) && (de2 = (4 || 2 || 1)) && (de3 = (4 || 2 || 1)) && (de1 != de2 != de3))
{
printf ("Bravo vous avez gagnez en %ld essais !\n", essais);
victoire = 1;
printf ("Victoire vaut %ld\nEssais vaut %ld\n", victoire, essais); //TEST TEMPORAIRE
}
else
{
printf ("Desole vous n'avez pas fait 421, mais vous pouvez relancer les des\n");
}
} //FIN DU JEU
printf ("Le jeu est fini\nSi vous voulez rejouer appuyez sur O, puis sur entree.\n"); //Rejouer
scanf ("%c", &restart); //Saisie restart
} while (restart == 'O'); //Fin de boucle restart
return 0;
}[/cpp]

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 ;)
 

zeb

Modérateur
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

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

la7su

Nouveau membre
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.

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.

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):
[cpp]int randomValue = ((int)((float)rand() / RAND_MAX * (5)))+1;[/cpp]





 

soksam

Grand Maître
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:

[cpp]{
long de1 = 0, de2 = 0, de3 = 0, essais = 0;
char lance = 0, restart = 0;
bool victoire = 0;

puts ("JEU DU 421 \nVous avez 15 essais pour faire 421 avec les des\n");
srand(time(NULL)); //Initialisation de la génération des dés

do //Début de boucle restart
{
// Boucle du jeu: lancement et génération dés + test + resultats
for (essais = 1, victoire = 0 ; essais <= 15 && !victoire ; essais ++)
{
do //Lancement des dés
{
puts ("\nAppuyez sur L, puis entree pour lancer les des: ");
lance = getc (stdin);
if (lance == ('\n')) //PAS TERRIBLE...
{
puts ("\nAppuyez sur L, puis entree pour lancer les des: ");
lance = getc (stdin);
}
while (getc (stdin) != '\n');
} while ((lance != 'L') && (lance !='l')); //Verifie la touche préssée
de1 = (rand() % (6 - 1 + 1)) + 1; //Génération de1
de2 = (rand() % (6 - 1 + 1)) + 1; //Génération de2
de3 = (rand() % (6 - 1 + 1)) + 1; //Génération de3
//Affichage valeur des dés
printf ("Vos des on fait %ld, %ld, %ld\n", de1, de2, de3);
//Verif 421 + resultat
if (((de1 == 4) || (de1 == 2) || (de1 == 1)) &&
((de2 == 4) || (de2 == 2) || (de2 == 1)) &&
((de3 == 4) || (de3 == 2) || (de3 == 1)) &&
(de1 != de2) && (de2 != de3) && (de3 != de1)) //Verif 421
{
printf ("Bravo vous avez gagnez en %ld essais !\n", essais);
victoire = 1;
}
else
if (essais == 15)
puts ("Desole c'etait votre dernier essai, vous n'avez pas fait 421 mais vous pouvez rejouer\n");
else
puts ("Vous n'avez pas fait 421, relancez les des\n");
} //FIN DU JEU
puts ("Si vous voulez rejouer appuyez sur O, puis sur entree."); //Rejouer ?
restart = getc (stdin); //Saisie restart
restart = toupper (restart); //Restart en MAJ
} while (restart == 'O'); //Fin de boucle restart
return 0;
}[/cpp]

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.
 

Emmanuel Delahaye

Expert


Hum ...
 

soksam

Grand Maître
Quelqun pourrait me répondre au lieu de débattre du random ? :p
 
Vous devez vous inscrire ou vous connecter pour répondre ici.
Derniers messages publiés
Statistiques globales
Discussions
730 098
Messages
6 717 063
Membres
1 586 286
Dernier membre
petitangebleu1977
Partager cette page
Haut