|
Le morpion ou tic tac toe
Le Plus ou Moins est un peu simple, vous ne trouvez pas ? Montons la difficulté d’un cran !
Gérez les touches avec Getkey
Pour l’instant, nous ne connaissons qu’un seul moyen pour communiquer avec l’utilisateur : la fonction « ? ». Cependant, elle n’est ni très pratique, ni très esthétique car elle décale le texte vers le haut. Heureusement, il est possible de détecter quelle touche est appuyée via Getkey : [SHIFT] + [VARS] (PRGM) puis [F6] + [F4] (I/O) + [F2] (Gtky).
Do
Getkey→G
LpWhile Not G (ou LpWhile G=0)
Si aucune touche n’est appuyée, Getkey renvoie 0. L’image ci-contre donne les valeurs de touches. Remarquez que [AC/ON] n’a pas de valeur car elle interrompt le programme. Par exemple, si j’appuie sur [0], Getkey renvoie 71, et sur [MENU], Getkey renvoie 48. Je vous conseille vivement de mettre le Getkey tout seul dans une boucle, vous gagnerez en réactivité. Je vois trop souvent ce genre de code dans les programmes :
Do
Getkey→G
If G=71
Then…
IfEnd
If G=72
Then…
IfEnd
//(plusieurs lignes plus loin)
LpWhile G≠47
Isolez au maximum vos Getkey du reste du code. Certes, vous alourdissez vos programmes de quelques octets, mais votre programme gagne beaucoup en réactivité ! Voici l'exemple à suivre :
Do
Do
Getkey→G
LpWhile Not G
//(votre code)
LpWhile G≠47
En cas de trou de mémoire pour les différentes valeurs, lancez ce programme :
Do
Getkey
Ans=>Locate 1,1,Ans
LpWhile 1 //Appuyez sur [AC/ON] pour interrompre le programme (c'est la seule touche qui n'a pas de valeur)
Allégez vos conditions
La « double flèche »
Dans l’onglet (PRGM) puis (JUMP) [F3], vous avez ce qu’on appelle la « double flèche ». Elle agit comme un If mais ne peut avoir qu’une seule action.
Les Graph 100 (+ et USB) n’ont pas cette « double flèche » dans leur menu, même si elles savent l’interpréter. On peut la récupérer d’un programme et avec le copier-coller [CTRL] + [F1] (Copy) puis [CTRL] + [F2] (Paste).
Les deux codes suivants ont le même effet, mais l’un est plus léger en mémoire.
If A=1
Then 3→B
IfEnd
A=1=>3→B
Attention, sur les vieux modèles (OS 1), cette fonction a un vilain bug qui peut vite devenir agaçant quand on ne le sait pas ! Le double-point ':' équivaut à un retour à la ligne. Même en mettant ce double-point comme texte, entre guillemets, la calculatrice l'interprètera quand même comme un retour à la ligne et ne comprendra pas pourquoi un guillemet est manquant (alors qu'il y est).
"1:CONTINUER" //Là, ça marche, le double-point est interprété comme du texte car situé entre guillemets
A=1=>"1:CONTINUER" //Mais avec la double flèche, le double-point est considéré comme une fonction, malgré le fait qu'il soit entouré de guillemets
Les booléens
Un booléen a deux états : « vrai » (différent de 0) ou « faux » (égal 0).
Quand vous faites « If A=2 », la calculatrice vérifie si A vaut 2 et si c'est le cas, elle renvoie « vrai » (1). Sinon, elle renvoie « faux » (0).
Mais allons plus loin dans le raisonnement. Exécutez ce programme :
?->A
A=2
Si vous entrez '2', la calculatrice vous affiche '1'. En effet A = 2 donc c'est vrai ( = 1 ). Pour toutes autres valeurs, la calculatrice vous affiche '0' car A ≠ 2. Maintenant, reprenons le code vu dans la partie sur la « double flèche » et optimisons-le une nouvelle fois.
//Avec If - Then - IfEnd
If A=1
Then 3→B
IfEnd
//Avec la double flèche
A=1=>3→B
//Avec les booléens
3*(A=1)->B
Ces trois codes renvoient le même résultat, ils sont strictement identiques. Le dernier utilise les booléens pour déterminer la valeur de B en fonction de A. Si A = 1, alors la condition est vraie et vaut 1. Par conséquent, 3 * (1) = 3, donc B = 3. Inversement, si A ≠ 1 (prenez 2 si vous préférez raisonner avec une valeur exacte), donc A n'est pas égal à 1, donc la condition est fausse et vaut 0. Par conséquent 3 * (0) = 0 (tout nombre multiplié par 0 est égal 0), donc B = 0. Les booléens allègent et améliorent la lisibilité du code, mais ont tendance à complexifier la compréhension du programme et la recherche des bugs, surtout pour les novices. Apprenez à les maîtriser en douceur...
Isz et Dsz : incrémenter ou décrémenter facilement
Une dernière petite astuce : les fonctions Isz et Dsz. La première incrémente de 1 la variable, l’autre décrémente de 1. Ces fonctions sont disponibles dans l’onglet (PRGM) puis [F3] (JUMP).
1→B
While B<100
Isz B
Locate 1,1,B
WhileEnd
Mais comme rien n’est simple, Isz et Dsz ont une fonction cachée. Si la variable vaut 0 après l’incrémentation ou la décrémentation, la ligne suivante est ignorée. Faites bien attention à cette particularité, c’est une source récurrente d’erreurs !
1→B
Dsz B
"BONJOUR"
"AU REVOIR"
« BONJOUR » ne s’affichera pas à l’écran. D’ailleurs, vous comprenez maintenant pourquoi elles se trouvent dans l’onglet (JUMP) car elles permettent d’effectuer un saut selon une condition bien précise.
Le morpion
Vous connaissez tous le jeu du morpion, aussi appelé Tic-Tac-Toe, où deux joueurs s’affrontent sur une grille de 3*3 cases et doivent aligner 3 croix ou 3 ronds. Le système de vérification des cases est la partie la plus difficile de ce programme. A part cela, si vous avez bien compris le tutoriel, vous n'aurez aucune difficulté pour réaliser ce jeu :-)
Cliquez ici pour afficher la solution Cliquez sur la barre pour cacher la solution // MENU DU DEBUT
"LE JOUEUR 1 CHOISIT ?"
" 1-Les ronds (O)"
" 2-Les croix (X)"
Do
Getkey→B
LpWhile B≠72 And B≠62 //Tant que [1] ou [2] n’est pas appuyée, le programme tourne en boucle. Si une autre touche est appuyée, la boucle continue car la condition est vraie.
// INITIALISATION DE LA PARTIE
If B=72 //On stocke qui prend les ronds et les croix. Bien sûr, on peut aussi stocker ce choix dans une variable.
Then {1,2→List 1
Else {2,1→List 1
IfEnd
0→Z //Initialisation du compteur de cases prises
1→J
{3,3→Dim Mat A //Initialisation de la grille du morpion
/* PREPRATION DE L’ECRAN DE JEU */
ClrText
"====== MORPION ======"
Locate 9,3,"7 8 9"
Locate 9,4,"4 5 6"
Locate 9,5,"1 2 3"
Locate 1,7,"Joueur (3 espaces) ( )"
Do //Début du LpWhile 1
Locate 8,7,J //On affiche quel joueur joue
List 1[J→I
If I=1
Then Locate 11,7,"O"
Else Locate 11,7,"X"
IfEnd
// LA PARTIE
Do //Début du LpWhile 2
Do //Début du LpWhile 3
Getkey→B
LpWhile Not B //Fin du LpWhile 3. Le programme tourne en boucle tant qu’une touche n’est appuyée
0 //Mettre un 0 tout seul attribue la valeur 0 à Ans qui est une variable temporaire
//Les deux points « : » fonctionnent comme des retours à la ligne, ils permettent de condenser le code. (PRGM) + [F6] + [F5]
B=72=>1:B=62=>2:B=52=>3
B=73=>4:B=63=>5:B=53=>6
B=74=>7:B=64=>8:B=54=>9
Lphile Not Ans //Fin du LpWhile 2.Si Ans = 0, cela veut dire que la touche appuyée n’est pas valide. Supprimez cette vérification et votre programme s’arrêtera à cause d’une erreur de calcul.
Ans→B
1+Int ((B-1)/3→E
1+3Frac((B-1)/3→F
If Not Mat A[E,F //On vérifie que la case soit vide (=0)
Then I→Mat A[E,F
Isz Z //On incrémente le compteur de cases prises de 1 (On sait que Z > 1 donc Z ne n'aura jamais pour valeur 0. On peut alors utiliser sans crainte Isz
If I=1 //On affiche le symbole correspondant au joueur dans la case
Then Locate 7+2F,6-E,"O"
Else Locate 7+2F,6-E,"X"
IfEnd
J→H
Isz J //On incrémente de 1 le numéro du joueur (1→2→3)
J=3=>1→J //Si le numéro du joueur vaut 3, alors c’est au tour du joueur 1 (3→1)
IfEnd
// VERIFICATION SI UN JOUEUR A GAGNE
0→G //Si G=0, aucun joueur a gagné, G=1 dans le cas contraire
For 1→B To 3 //On vérifie les lignes horizontales
Mat A[B,1=>Mat A[B,1]=Mat A[B,2] And Mat A[B,1]=Mat A[B,3=>1→G
Next
For 1→B To 3 //On vérifie les lignes verticales
Mat A[1,B=>Mat A[1,B]=Mat A[2,B] And Mat A[1,B]=Mat A[3,B=>1→G
Next
Mat A[2,2=>Mat A[1,1]=Mat A[2,2] And Mat A[1,1]=Mat A[3,3] Or Mat A[1,3]=Mat A[2,2] And Mat A[1,3]= Mat A[3,1=>1→G //On vérifie enfin les deux diagonales
LpWhile G=0 And Z<9 //Fin du LpWhile 1. Si un joueur a gagné (G=1) ou si toutes les cases sont prises (Z=9), alors la partie est terminée
// MESSAGE DE FIN DE PARTIE
If G=1
Then Locate 1,7,"Le joueur (3 espaces) a gagne !" //La calculatrice ne gère pas les accents
Locate 11,7,H
Else Locate 1,7,"(5 espaces) Match nul !"
IfEnd
Ce cours est mis à disposition selon les termes de la Licence Creative Commons Attribution - Pas d’Utilisation Commerciale - Partage dans les Mêmes Conditions 3.0 France.
|
|