Page 1 of 6

Programme GetKey

Unread postPosted: 19 Dec 2010, 16:36
by Reuberts
Bonjour,
Je suis tout nouveau concernant la programmation en Tibasic (et en programmation tout court d'ailleurs ^^) et j'aimerais donc que vous m'aidiez à faire quelques petits progrès :#oups#:

J'ai donc en guise d'exercice programmer un petit truc dont le principe est le suivant :
-La ti affiche un chiffre (allant de 41 a 45)
-l'utilisateur doit appuyer sur la touche correspondant au chiffre affiché (si c'est 41, il appuiera sur "math")
-si c'est bon, on affiche "gagné" et on regénère un nouveau chiffre
-si c'est faux, on regénère directement un nouveau chiffre

Voici donc mon code :

Code: Select all
Lbl 01
randInt(11,15=A
Output(7,14,A
If getKey=A
Disp "Gagne"
Goto 01
If getKey!=A
Goto 01


Le seul (gros) problème, c'est que la Ti me génère plein d'entiers en meme temps! C'est à dire que j'ai le droit à un défilement de chiffre sans arret, ce qui rend le "jeu" impraticable.

Si vous pouvez m'aider, ce serait avec plaisir =)

Re: Programme GetKey

Unread postPosted: 19 Dec 2010, 16:47
by critor
Bonjour!


En fait le petit problème, c'est que "getKey" n'attend pas l'appui sur une touche.
Il renvoi 0, si aucune touche n'est pressé, ce qui compte comme "perdu" immédiatement.

Je te propose donc de rajouter un 2ème couple lbl/Goto pour attendre l'appui sur une touche avant de dire que c'est perdu.

Lbl 01
randInt(11,15=A
Output(7,14,A
Lbl 02
getKey=K
If K=0
Goto 02

If K=A
Disp "Gagne"
Goto 01

Si tu préfères, cela peut aussi se faire avec une boucle (ce qui est plus "officiel" par rapport au programme d'algorithmique).

Lbl 01
randInt(11,15=A
Output(7,14,A
0=K
While K=0
getKey=K
End

If K=A
Disp "Gagne"
Goto 01


Quand ton programme sera terminé, n'hésite pas à le signer et à la publier sur notre portail! : :):

Re: Programme GetKey

Unread postPosted: 19 Dec 2010, 17:06
by Kiligolo
J'ai fait un truc pareil sauf que ça le fait avec toutes les touches de la calculatrices. :#langue#:
Je propose ça:
Code: Select all
randInt(11,15-A  //nombre aléatiore
Output(7,14,A  //On l'affiche
DelVar KWhile K=!A  //On efface K puis on attend que l'utilisateur ai pressé la bonne touche
getKey-K   //On capte la touche pressée enregistrée dans K
End  //fin de la boucle
Pause "GAGNE   //L'utilisateur a pressé la bonne touche=Il a gagné


Après, tu peux le faire avec du temps
  1. Nombre aléatoire
  2. On l'affiche
  3. On met le score à 0
  4. On lui donne un certain temps
  5. Début de la boucle
  6. On affiche le temps
  7. On affiche le score
  8. On attends la touche pressée
  9. Si c'est la bonne touche, on peut augmenter le temps
  10. On décrémente le temps
  11. Fin de la boucle = il n'y a plus de temps, l'utilisateur à perdu

Re: Programme GetKey

Unread postPosted: 19 Dec 2010, 17:18
by Reuberts
Wow! Forum sympas, rapide, parfait quoi! ^^

Quant à la solution, j'avoue que je n'y aurais jamais penser!
Merci ^^

En ce qui concerne la publication de ce programme.... j'y réfléchis =p

Re: Programme GetKey

Unread postPosted: 20 Dec 2010, 12:48
by Reuberts
ReBonjour les gens !

Alors, j'ai tout bien réfléchi, et puis je me suis dit que j'allais faire un autre prog dans le meme style (raison pour laquelle je n'ouvre pas de nouveau topic, il s'agit encore d'un programme se basant sur l'utilisation des getKey ^^)

Alors principe :
-Un chrono s'affiche à l'écran : il commence a 2000 et diminue de 10 à chaque fois
-On appuie sur "Entrer" le plus rapidement possible pour que le chrono ne tombe pas à 0 (ce qui est irrémédiable dans tous les cas car à chaque appui sur entrer on n'augmente que de 7 le chrono)
-Le nombre de fois appuyer sur "entrer" est affiché à la fin du programme.

Voici le code :
Code: Select all
ClrHome
2000 - X
0 - S
Repeat X=0
X-3 - X

getKey - K
If K=105
Then
X+7- X
S+1- S

Output(8,4,X
Output(8,1,S
End


Problème :#tsss#: :
Le chrono diminue et quand on appuie sur entrer, il augmente bien mais le score augmente tout seul!

Merci de m'éclaircir ;)

Re: Programme GetKey

Unread postPosted: 20 Dec 2010, 13:13
by critor
Il doit te manquer un "End".

Il faut un "End" pour fermer le If/Then, et un "End" pour fermer le Repeat.
Les 2 devant être au bon endroit.


Sinon, comprends bien qu'à 6MHz, ta calculatrice est rapide.
Quand tu appuieras sur entrée pendant une fraction de seconde, pour la calculatrice qui aura bouclé plein de fois pendant ce laps de temps, ça comptera comme plusieurs appuis sur Entrée.

Re: Programme GetKey

Unread postPosted: 20 Dec 2010, 14:10
by Kiligolo
Je te propose ce code:
Code: Select all
ClrHome
2000-X
DelVar SRepeat not(X
X-3-X
getKey - K
X+7(K=105-X
S+(K=105-S
Output(8,4,X
Output(8,1,S
End

  • La différence entre Delvar S et 0-S n'est pas dans la taille puisque 0-S fais trois octets et la commande DelVar en fait 2 mais avec DelVar, tu n'est pas obligé de retourner à la ligne pour la commande suivante (dans la plus part des cas) ce qui te fait économiser 1 octet.
  • not(X est l'équivalent de X=0 =économie d'un octet.
  • S+(K=105-S est un booléen, c'est-à-dire que K=105 est égal à 1 si c'est vrai (si enter est pressé) et 0 si c'est faux. Donc si on ne presse pas enter ça revient à dire S+0-S
    et si c'est le contraire S+1-S
  • X+7(K=105-X est aussi un booléen donc si on ne presse pas enter ça revient à dire X+7*0-X et si c'est le contraire X+7*1-X
Voilà. :#top#:

Re: Programme GetKey

Unread postPosted: 20 Dec 2010, 14:21
by Reuberts
Waaa super ^^
J'imagine que ce que tu as fait Kiligolo s'appelle "l'optimisation d'un code", chose que je n'ai pas encore abordé dans ma "formation" ^^

Mais c'est classe en tout cas :#langue#:

Sinon concernant ma version du code, j'ai trouvé ou mettre le "End" qui manquait ^^

Problème rencontré:
-Si on appuie sur rien, c'est a dire si S=0, le chrono s'arrete bien à 0
-Si on commence a appuyer pour retarder l'échéance du chrono, PATAPOUF! le chrono passe dans les négatifs =(

Je creuse pour voir d'ou vient le pb :#delire#:

Re: Programme GetKey

Unread postPosted: 20 Dec 2010, 14:38
by critor
Reuberts wrote:Waaa super ^^
J'imagine que ce que tu as fait Kiligolo s'appelle "l'optimisation d'un code", chose que je n'ai pas encore abordé dans ma "formation" ^^



Effectivement Reuberts, si tu fais référence à l'algorithmique qui est enseignée officiellement au lycée depuis l'année dernière, c'est quelque chose que tu ne devrais pas voir.

Tout simplement parce qu'un algorithme n'est pas un programme. Il y a une différence, même si bon nombre de professeurs emploieront indifféremment ces 2 mots, les nouveaux livres de maths qu'ils utilisent étant loin d'être au point.


Kiligolo te donne des astuces pour économiser de la mémoire sur un modèle bien spécifique: ta calculatrice. Et c'est très bien de les connaître.

Mais il ne faudra surtout pas (dans ton intérêt) que ce style d'astuce déteigne sur tes travaux écrits éventuels dans ce domaine: l'algorithme (ou le programme) qui te sera demandé devant être indépendant d'un modèle précis. Il doit être adaptable à tous les modèles, et facilement lisible (ce qui n'est pas le cas du code de Kiligolo pour ce dernier point).

Re: Programme GetKey

Unread postPosted: 20 Dec 2010, 14:43
by critor
Reuberts wrote:Problème rencontré:
-Si on appuie sur rien, c'est a dire si S=0, le chrono s'arrete bien à 0
-Si on commence a appuyer pour retarder l'échéance du chrono, PATAPOUF! le chrono passe dans les négatifs =(

Je creuse pour voir d'ou vient le pb :#delire#:


On peut t'aider si tu nous donnes le nouveau code du programme. :;):