Bonjour, j'ai un petit cadeau pour bien commencer l'année 2014 et poster un projet plutôt que de tenter de conseiller les autres.
Voici mon jeu des Tours de Hanoi dont la particularité est la solution récursive au problème qui est incluse au jeu et en TI-Basic.
Le projet est composé d'un programme de menu+jeu, d'un afficheur, d'un empileur, d'un dépileur, et de la fonction récursive.
La fonction récursive est plus optimisée que je prévoyais car aucune variable n'est stockée dans une liste, tandis que j'ai l'habitude de simuler des variables locales par une liste et un pointeur (globaux).
J'utilise deux variables et calcule la tour intermédiaire, mais on peut en avoir 3 et les permuter, à condition de passer par une variable temporaire supplémentaire.
Si on supprimmait les fonctions graphiques, la fonction récursive aurait pour seule limite la pile d'appel de la TI.
HANOI sur TIPlanet
Voici mon jeu des Tours de Hanoi dont la particularité est la solution récursive au problème qui est incluse au jeu et en TI-Basic.
Le projet est composé d'un programme de menu+jeu, d'un afficheur, d'un empileur, d'un dépileur, et de la fonction récursive.
La fonction récursive est plus optimisée que je prévoyais car aucune variable n'est stockée dans une liste, tandis que j'ai l'habitude de simuler des variables locales par une liste et un pointeur (globaux).
- histoire:
- J'ai imaginé l'algorithme récursif de résolution tout seul, mais ce même algorithme est déjà exposé ailleurs (wikipedia par exemple).
J'ai codé une application Cmd en langage C en janvier 2011 pour justement élaborer cet algorithme.
Puis j'ai participé au concours de CalcBank ce même janvier 2011 en tentant de le coder dans une HP39gii émulée, ce fut un échec (impossibilité de récursivité complète que j'attribue à un bug de l'émulateur qui refusait toutes mes tentatives de création de procédure, mes propres incompréhensions de la machine, et enfin manque de correction graphique après avoir perdu du temps sur des tentatives vaines de récursivité)
Après avoir ruminé ma frustration envers la HP39gii, et des mois voire même années d'inactivité dans mes projets personnels de programmation, j'ai subitement décidé de réaliser ce programme TI. Le noyau était prêt en un jour.
J'utilise deux variables et calcule la tour intermédiaire, mais on peut en avoir 3 et les permuter, à condition de passer par une variable temporaire supplémentaire.
Si on supprimmait les fonctions graphiques, la fonction récursive aurait pour seule limite la pile d'appel de la TI.
HANOI sur TIPlanet
- hanoi:
- Code:
ClrDraw
AxesOff
Text(0,4,"TOWERS OF HANOI
Text(6,8,"INSTANCE BY LINKAKRO
Text(12,14,"<> LEVEL : 3
Text(18,16,"1 PLAY
Text(24,16,"2 SOLUTION
Text(30,16,"3 EXIT AND CLEAR DATA
3->A
Repeat max(K={92,93,94
Repeat K
getKey->K
End
max(2,min(9,A-(K=24)+(K=26->A
Text(12,47,A
End
max(2,min(9,A-(K=24)+(K=26->A
Text(6,47,A
End
If K=94
Goto Q
ClrDraw
Text(0,0,"WHICH BEGIN STACK ? (1/2/3)
Repeat P
max({1,2,3,1,2,3}(getKey={12,13,14,92,93,94->P
End
If K=93
Then
Text(6,0,"WHICH FINAL STACK ?
Repeat M and M-P
max({1,2,3,1,2,3}(getKey={12,13,14,92,93,94->M
End
Text(18,0,"PRESS ANY KEY TO PAUSE
Text(24,0,"ENTER ALLOW NEXT PAUSE
Text(30,0,"ANY ELSE KEY ALLOW SKIP
Text(36,0,"
Repeat W
getKey->W
End
End
ClrDraw
DelVar [A]{3,A+1->dim([A]
For(D,1,A
D->[A](P,D
End
A+{1,1,1->L6
1->L6(P
1->G
P->X
For(C,1,A
C->B
prgmHANOIZ
End
0->E
0->F
0->G
0->S
If K=92
Then
Repeat H-P and max(1=L6
Text(0,0,S
Repeat H
max({1,2,3,1,2,3}(getKey={12,13,14,92,93,94->H
End
L6(H->I
If F
Then
If I>A or E<[A](H,I
prgmHANOIY
Else
If I<=A
prgmHANOIX
End
End
If A<4
Then
Text(0,0,S,", PIECE OF CAKE
Else
If A<6
Then
Text(0,0,S,", CONGRATS PADAWAN
Else
If A<8
Text(0,0,S,", YOU ARE SO PATIENT...
End
End
If A=8
Text(0,0,S,", ALMOST HANOI MASTER.
If A=9
Text(0,0,S,", ARE YOU CHEATING ? >D
Else
A->N
prgmHANOIW
End
Pause
Lbl Q
ClrDraw
ClrHome
ClrList L6
DelVar [A]
- hanoiw:
- Code:
getKey or W=105
While Ans
getKey->W
not(Ans
End
Text(0,0,"FROM ",P," TO ",M," AND ",N," PLATES
If N=1
Then
P->H
L6(H->I
prgmHANOIX
M->H
L6(H->I
prgmHANOIY
Text(6,0,S
Else
N-1->N
6-M-P->M
prgmHANOIW
6-M-P->M
N->R
1->N
prgmHANOIW
R->N
6-M-P->P
prgmHANOIW
N+1->N
6-M-P->P
End
- hanoix:
- Code:
H->F
H->X
I->C
[A](H,I->E
0->[A](H,I
E->B
prgmHANOIZ
1->G
0->C
If K=92
prgmHANOIZ
I+1->I
I->L6(H
- hanoiy:
- Code:
If H-F
S+1->S
I-1->I
I->L6(H
I->C
H->X
E->B
prgmHANOIZ
E->[A](H,I
0->G
0->C
F->X
If K=92
prgmHANOIZ
0->F
- hanoiz:
- Code:
For(D,0,2B+3
If G
Text(6C,30X-15-B+D,"[
If not(G
Text(6C,30X-15-B+D," "
End
If G
Text(6C,30X-15,B
Text(6C,30X-15-B+D," "