Mettons en application nos connaissancees sur les chaines de caractères. Avant d'attaquer la programmation de ce jeu, quelques nouvelles fonctions qui vous aideront.
Appeler un sous-programme
La fonction Prog appelle un sous-programme. Prog <"nom_programme_basic">. Vous la trouverez dans (PRGM) + [F2] (CTL) + [F1]. On ne peut pas utiliser les chaines de caractères pour définir le nom du sous-programme à appeler (la communauté a fait de nombreux tests, tous sans succès).
Prog "JEU01" //On appelle le sous-programme « JEU01 »
Lorsqu’on appelle un sous-programme, la calculatrice exécute le code depuis le début, comme si vous l'avez lancé normalement depuis le menu de sélection des programmes. Lorsqu’elle arrive à la fin du sous-programme, elle revient au programme principal à l’endroit de l’appel.
Un sous-programme peut appeler un autre sous-programme et ainsi de suite jusqu’à 10 niveaux de sous-programmes.
Un même sous-programme peut être appelé plusieurs fois dans le programme principal, sans aucune restriction sur le nombre d’appels.
Peut-on définir le nom d'un programme avec un Str ?
C'est l'une des principales demandes de la communauté : pouvoir définir Prog avec une chaine de caractères. On gagnerait alors en souplesse, mais malheureusement, on doit toujours écrire en brut le nom du programmme.
Insérer un commentaire
Les sous-programmes sont également utilisés pour apporter plus de lisibilité aux programmeurs. Cependant, vous pouvez aussi insérer des commentaires dans votre code. La calculatrice ignore le commentaire lors de l’exécution. C’est pratique pour distinguer les différentes parties au sein d’un même programme ou pour faire des tests (en commentant une ligne qui pose problème). Le commentaire est symbolisé par l’apostrophe et prend en compte toute la ligne. Si vous voulez mettre en commentaire plusieurs lignes, vous devez donc ajouter à l'apostrophe au début de chaque ligne.
'INITIALISATION
'If A=2
'Then "CE CODE EST UN COMMENTAIRE ET N'EST PAS EXECUTE PAR LA CALCULATRICE"
'IfEnd
Fonctions de contrôle : Return, Stop et Break
Pour revenir au programme du niveau supérieur, il faut utiliser la fonction Return (onglet : « Rtrn »). Tout le code suivant le Return dans le sous-programme est alors ignoré. La calculatrice continue l’exécution du programme principal à l’endroit de l’appel du sous-programme.
La fonction Stop interrompt purement l’exécution du programme. Si la fonction Stop est utilisée dans un sous-programme, il n’y a pas de retour au programme principal.
Enfin, Break interrompt l'éxécution d'une boucle, comme While ou For. En théorie, une boucle s'arrête quand la condition est fausse, donc Break est inutile. Cependant, dans certaines situations, cette fonction est utile (mais jamais indispendable !). Voici un exemple où l'on veut arrêter une boucle For (qui incrémente A) dans laquelle B a un impact sur son fonctionnement :
For 1->A To 10
...
If B=1
Then Break
IfEnd
...
Next
à vous de programmer !
Je vous laisse patauger un moment, puis cliquez sur cette barre
Cliquer ici pour enrouler
Comme dans la vie quotidienne, il existe une multitude de façons d'aborder un problème ou un objectif. En programmation, certaines sont meilleures, plus légères en mémoire, plus rapides, plus facilement adaptables etc… . Il n’y a pas de recette miracle, le plus important est d’être satisfait du code créé.
Je vous propose donc une solution parmi d'autres, et la vôtre peut tout à fait être meilleure. D'ailleurs, n'hésitez pas à me contacter via MP.
Voici le rôle des différentes chaines de caractères (Str) utilisées dans ce Pendu :
- Str 1 : le mot mystère
- Str 2 : ce que voit la personne devant trouver le mot mystère
- Str 3 : liste « lettres utilisées et non valides »
- Str 6 : chaine tampon (temporaire, utilisée pour des calculs sur les chaines de caractères)
- Str 7 : chaine tampon 2
- Str 8 : lettre dont on doit déterminer le nombre d’occurrences dans le mot mystère (cf "PENDU3")
- Str 9 : les 26 lettres de l’alphabet
1 - Les sous-programmes
• Programme « PENDU2 »
Ce sous-programme n’affiche que l’entête du jeu. C'est juste pour vous montrer l'utilisation de la fonction Prog.
ClrText
"------- PENDU -------"
" " //un espace entre les guillemets
• Programme « PENDU3 »
Par contre, ce sous-programme est nettement plus intéressant pour nous. Dans le précédent cours, nous avons soulevé un problème important : StrSrc() ne donne que la position de la première occurrence. Or, un mot peut contenir plusieurs fois la même lettre. Nous allons donc améliorer cette fonction.
0→A
ClrList 1 //On initialise la liste contenant la position des occurrences
For S→B To L //On sait que la première occurrence commence à S et L correspond à la longueur de la chaine (les valeurs de S et L seront calculées dans le programme principal « PENDU »)
If Not StrCmp(StrMid(Str 1,B,1),Str 8 ) //On vérifie s’il y a une occurrence. Pour rappel, StrCmp renvoie 0 si les deux chaines sont identiques
Then Isz A //On incrémente A de 1 car List 1[0] n’existe pas
B→List 1[A //On stocke la position de cette occurrence dans la List 1
IfEnd
Next
For 1→B To A //On remplace toutes les caractères « - » par la lettre contenue dans Str 8
List 1[B
StrLeft(Str 2,Ans-1)+Str 8+StrRight(Str 2,L-Ans→Str 2
Next
• Le programme principal « PENDU »
"ABCDEFGHIJKLMNOPQRSTUVWXYZ"→Str 9 //On charge les 26 lettres de l'alphabet dans Str 9
Prog "PENDU2" //On appelle le sous-programme « PENDU2 » // SÉLECTION DU MODE DU JEU
" 1.Mode 1 joueur"
" 2.Mode 2 joueurs"
Do
Getkey→B
LpWhile B≠72 And B≠62
If B=72
Then 1→M
Else 1→J:2→M
IfEnd //Si M = 1 alors Mode = « 1 joueur », si M = 2 alors Mode = « 2 joueurs »
Do //Début de la boucle 1
If M=1
Then RanInt(1,10→N // CHOIX D’UN MOT MYSTERE DANS LA BANQUE DE MOTS PAR LA CALCULATRICE
N=1=>"CALCULATRICE"→Str 1
N=2=>"PROGRAMMATION"→Str 1
N=3=>"VACANCES"→Str 1
N=4=>"SOLEIL"→Str 1
N=5=>"RESTAURANT"→Str 1
N=6=>"RANDONNEE"→Str 1
N=7=>"MECANIQUE"→Str 1
N=8=>"SPORT"→Str 1
N=9=>"QUARTIER"→Str 1
N=10=>"COMMUNAUTE"→Str 1
Else Do //Début de la boucle 2
Prog "PENDU2"
"JOUEUR (2 espaces), VOTRE MOT ?"
Locate 8,4,1+(2-J
?→Str 1
LpWhile StrLen(Str 1)>21 //Fin de la boucle 2. Le mot ne doit pas dépasser les 21 caractères sinon il dépasserait de l'écran
IfEnd
ClrText
StrLen(Str 1)→L
11-Int(L/2→W //Pour centrer le mot mystère
""→Str 3 //Initialisation de la liste « lettres utilisées et non valides » // DÉBUT ALGORITHME POUR CACHER LE MOT MYSTERE
[img]https://www.planet-casio.com/images/programmation/pendu01.jpg[/img]
StrLeft(Str 1,1→Str 6 //On récupère la première lettre
Str 6→Str 2 //Pour rappel : Str 2 = le mot mystère dans sa version cachée
For 1→B To L-2 //On cache toutes les autres lettres
Str 2+"-"→Str 2
Next
StrRight(Str 1,1→Str 7 //On récupère la dernière lettre du mot mystère
Str 2+Str 7→Str 2
1→S
Str 6→Str 8 //On affiche toutes les lettres identiques à la première lettre
Prog "PENDU3"
Str 7→Str 8 //On affiche toutes les lettres identiques à la dernière lettre
Prog "PENDU3" // FIN DE L’ALGORITHME
0→Z //Initialisation du compteur de « coups manqués »
While StrCmp(Str 1,Str 2) And Z<9 //Tant que le mot mystère n’est pas trouver ou bien que le bonhomme n’est pas pendu
Locate W,2,Str 2 //On affiche le mot mystère version « cachée »
Do //Début de la boucle 3
Do //Début de la boucle 4
.1Getkey // raccourci pour « 0.1 * Getkey » ou « Getkey / 10 »
LpWhile Not Ans //Fin de la boucle 4
6-10Frac Ans→R //Algorithme pour convertir la valeur du Getkey en une valeur correspondant à la position de la lettre dans l'alphabet (ex : A = 1 ; B = 2 ... Z = 26)
8-Int Ans+5R+R(R<3→G //Fin de l'algorithme. Vous reconnaitrez l'utilisation d'un booléen (R<3)
LpWhile G<1 Or G>26 //Fin de la boucle 3. On vérifie que la touche appuyée soit valide, donc que G soit compris entre 1 et 26
StrMid(Str 9,G,1→Str 8 //On récupère la lettre correspondante
If Not StrSrc(Str 3,Str 8 ) //On vérifie que le joueur n’ait pas déjà utilisé cette lettre
Then StrSrc(Str 1,Str 8 )→S //On vérifie que cette lettre soit présente dans le mot mystère
If S
Then Prog "PENDU3" //On vérifie le nombre d’occurrences
Else Str 3+Str 8→Str 3 //Sinon, on ajoute cette lettre à la liste « lettres utilisées »
Locate 12,6,Str 3 //On affiche cette liste
Isz Z //AFFICHAGE D’UNE PARTIE DU PENDU EN FONCTION DU NOMBRE DE COUPS MANQUÉS
If Z=1
Then Locate 1,4,"|"
Locate 1,5, "|"
Locate 1,6, "|"
Locate 1,7, "|"
IfEnd
Z=2=>Locate 2,4,"---"
Z=3=>Locate 2,5,"/"
Z=4=>Locate 4,5,"O"
Z=5=>Locate 4,6,"|"
Z=2=>Locate 3,7,"/"
Z=2=>Locate 5,7,"\\" //On doit mettre deux antislashs « \ » car « \" » affiche « " ». On différencie ainsi les guillemets « " » délimitant une chaine du guillemet comme caractère (en programmation, on appelle cela l'échappement)
Z=2=>Locate 3,5,"\"
Z=2=>Locate 5,5,"/"
IfEnd //FIN DE L'AFFICHAGE DU PENDU
IfEnd
WhileEnd //Fin du While
ClrText
If Z=9
Then "VOUS N’AVEZ PAS TROUVE LE MOT MYSTERE…"
Else "VOUS AVEZ TROUVE LE MOT MYSTERE !"
IfEnd
Locate W,5,Str 1[DISP]
Prog "PENDU2"
" 1.Continuer"
" 2.Quitter"
Do
Getkey
LpWhile Ans≠72 And Ans≠62
If Ans=72 And M=2 //Si le mode = 2 joueurs et qu'ils continuent, on permute les rôles
Then Isz J
J=3=>1→J
IfEnd
LpWhile Ans=72 //Fin de la boucle 1. La partie continue tant que le(s) joueur(s) le décide(nt)
Pfiou, sacré pavé non ?
Je vous rassure tout de suite, certaines passages peuvent vous sembler compliqués, mais ils deviennent plus spontanés et logiques avec la pratique.
D'ailleurs, ne vous gênez pas pour ajouter des nouvelles fonctionnalités, comme un système de score (classique), de profils de joueur (intéressant si on utilise les Str) etc...
Planète Casio est un site communautaire non affilié à Casio. Toute reproduction de Planète Casio, même partielle, est interdite.
Les programmes et autres publications présentes sur Planète Casio restent la propriété de leurs auteurs et peuvent être soumis à des licences ou copyrights.
CASIO est une marque déposée par CASIO Computer Co., Ltd