Forum

Catégorie : Programmes
Forum : Aide à la programmation
Vues : 966
Réponses : 14
Type : discussion
Etat : réponses autorisées

Programme aléatoire

lovespain le 08/12/2011 à 20:15
Bonsoir tout le monde !
Alors voilà je dois faire un programme avec l'énoncé suivant:
La calculatrice choisit un nombre entier aléatoire X compris en 1 et 10 inclus
Le joueur fait 3 propositions pour X
Le programme affiche "Perdu" si le joueur n'a pas trouvé X et "GAGNE" s'il a trouvé X

Moi j'ai fait ceci:

:entAléat(1,10)->X
:Input X
:If X=NbrAléat
:Then
:Disp "GAGNE"
:Else
:Disp "PERDU AUTRE CHANCE"
:End
:Input X
:If X=NbrAléat
:Then
:Disp "GAGNE"
:Else
:Disp "PERDU AUTRE CHANCE"
:End
:Input X
:If X=NbrAléat
:Then
:Disp "GAGNE"
:Else
:Disp "Perdu"
:End

Mais le problème c'est qu'il me met toujours Perdu
tilo1996 le 08/12/2011 à 20:31
C'est normal happy.gif Deja, la fonction nbraleat n'est pas la bonne, il faut utiliser entaleat(1,10) Et ensuite, il faut stocker ce resultat dans une variable, parce que la technique que tu utilise fait recalculer un nombre aleatoire a la calculatrice a chaque fois. Je te propose ce code

Code
Entaleat(1,10)->X
Prompt A    // Est l'equivalent d'input
If A=X: Then
Disp"Gagné
Stop    // Le stop est important
End
Disp"Essaie encore
Prompt A
If A=X: Then
Disp"Gagné
Stop
End
Disp"Essaie encore
Prompt A
If A=X:Then
Disp"Gagné
Stop
End
Disp"perdu
tapenad le 08/12/2011 à 20:32
essaie ca:
Code

:0->E
:entAléat(1,10)->X
:while1
:Input"NBR",A
:If X=A
:Then
:Disp "GAGNE"
:Stop
:End
:If X[differend de]A
:Then
:Disp"UNE AUTRE CHANCE
E+1->E
:end
:If E=3
:Stop
:end



voila glasses.gif (je ne suis pas sur qu'il marche)
pour changer le nbr de coup change le E=3
linkakro le 08/12/2011 à 20:43
Il y a plusieurs dizaines de programmes sur ce thème dans le forum.

Le premier problème dans ton prog est qu'un code faux dans le premier test arrête le programme alors qu'on veut que le programme poursuive encore 2 fois.
Le second problème est que NbrAléat n'est pas un entier mais un aléatoire entre 0 et 1
Le troisième problème est que tu utilises une seule variable pour ta saisie et l'aléatoire.

Il faut imbriquer les tests et utiliser deux variables.

Voici le code le plus proche de l'objectif en structure.
Code
:entAléat(1,10)->Y
:Prompt X
:If X=Y    // premier test
:Then
:Disp "GAGNE
:Else      // premier "sinon" qui introduit la suite
:Disp "PERDU AUTRE CHANCE
:Prompt X
: If X=Y   // second test
: Then
: Disp "GAGNE
: Else     // second "sinon" qui introduit la suite
: Disp "PERDU AUTRE CHANCE
: Prompt X
:  If X=Y  // troisième test
:  Then
:  Disp "GAGNE
:  Else    // ultime "sinon" qui sert à dire qu'on perd
:  Disp "PERDU
:  End     // fin de la dernière instruction
: End      // fin de la seconde instruction
:End       // fin de la première instruction
Ceci est condensé mais s'éloigne de la structure d'origine.
(Le code de tilo représente un bon comprommis)
Code
entAléat(1,10)->Y
EffVar A
Repeat X=Y   // autorise à lire la fin du programme si X=Y
A+1->A       // sert à compter le nombre d'essais
If A=4       // vaut 4 si on a échoué la troisième fois
Then
Disp "PERDU
Stop
End
Prompt X
End      // fin du repeat , ce qui se trouve en dessous n'est pas lu si X=/=Y
"GAGNE   // pas besoin de Disp car c'est à la fin
tilo1996 le 08/12/2011 à 20:58
Euh Linkakro es tu sur que mon prog s'arrete apres un echec??? Je le revois et je ne vois pas ce qui pourrait poser un probleme....
linkakro le 08/12/2011 à 21:14
J'ai lu trop vite. minied.gif
D'ailleurs ton code présente l'avantage d'être correctement réduit sans trop s'éloigner de la structure de base. Les miens sont soit trop condensés soit pas du tout optimisés.
J'édite mon message.
Polymorph le 08/12/2011 à 23:12
Personnellement, le plus condensé et clair que je vois pour moi serait ça :

Code
entAléat(1,10)->Y
EffVar A
Repeat X=Y or A=3  // double condition permettant d'économiser une ou deux ligne de code
A+1->A            // sert à compter le nombre d'essais
Prompt X
End               // fin du repeat
Output(6,5,"GAGNE
If A=3
Output(6,5,"PERDU //Le "Perdu" écrase le Gagné si l'on perd
sandro le 09/12/2011 à 21:38
je crois que tu as oublié un End à la fin, et c'est encore optimisable.
ça donnerait donc ça:
Code
entAléat(1,10->Y
EffVar ARepeat X=Y or A=3  // double condition permettant d'économiser une ou deux ligne de code
A+1->A            // sert à compter le nombre d'essais
Prompt X
End               // fin du repeat
Output(6,5,"GAGNE
If A=3
Output(6,5,"PERDU //Le "Perdu" écrase le Gagné si l'on perd
End
Polymorph le 09/12/2011 à 22:47
Ma foi, non, je n'avais pas oublié de End oô. J'ai toujours du mal avec le Effvar collé perso crazy.gif
The K le 10/12/2011 à 20:02
Tu n'as en effet pas oublié de end ... tu as juste mis ton "If A=3 Output(6,5 etc " au mauvais endroit winkle.gif
Polymorph le 10/12/2011 à 22:06
Mais non! Ce n'est pas au mauvais endroit bordel! xD Mais essayez le code quoi!
The K le 11/12/2011 à 11:04
Ah oui non excuse moi je n'avais pas vu le Or après le repeat ahem minied.gif
Polymorph le 11/12/2011 à 18:58
Merci! cupsmiley.gif
lovespain le 27/12/2011 à 17:34
Merci pour tous ces programmes, finalement le prof voulait un programme en while donc du coup j'ai ecrit
Code

entAleat(1,10)->X
Disp "entre un nombre entre 1 et 10"
While A {different de } X
Disp "Essai"
Input A
If A=X
Then
Disp "Gagné"
Else
Disp "Perdu"
End
End
Disp " L'inconnu est", X


voilà, je voulais améliorer mon programme en mettant le nombre de coup utilisé avant que le joueur ait trouvé le bon nombre ainsi que d'aider le joueur en ajoutant + ou -, mais je n'arrive pas avec la boucle While quelqu'un peu m'aider?
linkakro le 29/12/2011 à 23:20
Code
entAleat(1,10->X
Disp "SAISIS UN NOMBRE ENTRE 1 et 10  // je préfère respecter les majuscules
EffVar E  // pas obligé de sauter une ligne ici
While A-X et E<3 // je teste aussi le nombre d'essais // A-X = A=/=X
E+1->E
EffEcr
Disp "ESSAI
Output(1,7,E  // histoire de faire joli en combinaison avec EffEcr
Prompt A
If A=X
Then
Disp "GAGNE   // pas besoin de guillemets à la fin des disp, output, text...
Stop
Else
Disp "RATE
End
End
Disp "PERDU","L'INCONNUE EST", X