Autorisation : Membre
Nb de messages : 2
Inscrit le : Mar 10 Avr 2012, 11:56
Posté le : Mar 10 Avr 2012, 12:31
Tout d'abord bonjour à tous !
Je suis un petit nouveau, autant sur le forum que dans la programmation sur calculatrice (j'ai quand même quelques bases).
J'essaye de créer un programme qui me permettrais de déplacer un point (ou même un personnage, peu importe). Mon problème est que mon point ne se déplace que vers le haut.
Voici mon programme tel qu'il est maintenant :
Code
EffDessin
5->A
5->O
Lbl 1
Texte(A,O,".")
codeTouche->K
Texte(A,O," ")
If K=25
A-1->A
Goto 1
Else
If K=34
A+1->A
Goto 1
Else
If K=24
O-1->O
Goto 1
Else
If K=26
O+1->O
Goto 1
Où peut bien être le problème ?
Merci pour vos futurs réponses !
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Mar 10 Avr 2012, 13:20
le problème est que tu mélange les 2 usages du If :
soit on fait :
Code
:If Condition
:Then
: //une ou plusieurs lignes de code à executer si a condition est vérifiée
:End
(évetuellement, on peut rajouter un Else après le code à executer si a condition est vérifiée puis mettre une ou plusieurs lignes de code à executer si a condition n'est pas vérifiée.)
Sinon, on peut faire
Code
:If Condition
: //une seule instruction soumise à la condition
Avec cette seconde méthode, le code est plus léger et évite un remplissage de la mémoire si tu utilise des goto dans le code soumis à la condition mais n'accèpte qu'une seule ligne de code soumis à la condition et ne permet pas l'usage du Else.
Ton problème est que tu mélange les 2 manières :
Quand tu arrive à la ligne If K=25, si K=25, on execute la ligne suivante donc A diminue de 1 donc on monte, sinon, la ligne A-1->A est ignorée.
Dans tous les cas, comme tu n'a pas usé de Then après ton If, la ligne Goto1 sera exécutée, donc tu retourne au début de ta boucle, sans même tester pour les autres touches.
Je te propose donc deux variantes corigées :
Code
EffDessin
5->A
5->O
Lbl 1
Texte(A,O,".")
codeTouche->K
Texte(A,O," ")
If K=25
Then //ligne rajoutée
A-1->A
Goto 1
Else
If K=34
Then //ligne rajoutée
A+1->A
Goto 1
Else
If K=24
Then //ligne rajoutée
O-1->O
Goto 1
Else
If K=26
Then //ligne rajoutée
O+1->O
Goto 1
Se code derait fonctionner, mais entrènera une erreur mémoire si tu te déplace trop (sauf erreur de ma part pas loin de 40 octés par If:Then dont on sort !!!)
Code
EffDessin
5->A
5->O
Lbl 1
Texte(A,O,".")
codeTouche->K
Texte(A,O," ")
If K=25
A-1->A
If K=34
A+1->A
If K=24
O-1->O
If K=26
O+1->O
Goto 1
J'ai simplement suprimé tous les else et les goto 1 au milieu du code : comme ça, on teste pour chaque valeur de CodeTouche et on modifie si nécéssaire la variable consernée, et une fois qu'on a tout testé, on revient au début de la boucle.
Cette seconde variante est bien plus intéréssente, et surtout à l'avantage de ne pas provoquer d'erreures mémoires, ni de ralentissements du programme.
Sandro
PS : quand tu peux, remplace les Goto par des boucles (For(, While ou Repeat ). Ici, tu peut remplacer dans le second code "Lbl 1" par "While 1" (boucle infinie) ou mieux par "Repeat K=45" (on recommence la boucle jusqu'à ce que K=45, c'est-à-dire que l'on appuie sur annul) et remplacer le "Goto 1" par End
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes
Autorisation : Membre
Nb de messages : 2
Inscrit le : Mar 10 Avr 2012, 11:56
Posté le : Mar 10 Avr 2012, 13:51
Merci beaucoup pour ton aide Sandro ! Ta variante corrigée numéro 2 marche à merveille ! Pour la première, c'était mon tout premier essai qui ne marchait pas vraiment. Merci beaucoup, maintenant je vais pouvoir m'amuser !