Bonjour à tous !
Je suis nouveau sur le forum, et j'aimerais avoir votre avis sur un programme que je viens de créé.
C'est en fait une partie d'un programme de Casino regroupant plusieurs programmes comme une roulette, une machine à sous, etc...
Le programme Machine à sous tourne bien, mais je le trouve un peu lourd (1385 octetc...)
Je suis sûr qu'on peut le réduire considérablement, et c'est pour cela uqe je fait appel à vous
voilà le code :
Code
:EffEcr
:0->M
:0->X
:0->Y
0->Z
:0->I
:Output(3,5,"MACHINE
:Output(5,6,"A SOUS
:Pause
:EffEcr
:Lbl 1
:If A<=0
:Then
:EffEcr
:Output(3,4,"VOUS ETES
:Output(5,4,"RUINE(E) !
:Pause
:EffEcr
:Goto 6
:End
Disp "VOTRE MISE :
:Input "=",M
:If M>A
:Then
:EffEcr
:Output(3,2,"VOUS N'AVEZ PAS
:Output(4,3,"ASSEZ D'ARGENT
:Output(5,4,"POUR MISER
:Output(6,5,"AUTAUT !
:Pause
:EffEcr
Goto 1
End
If M<=0
Then
EffEcr
Output(3,2,"VOUS NE POUVEZ
Output(5,1,"PAS MISER CELA !
Pause
Goto 1
End
A-M->A
EffEcr
For(N,1,8
Output(N,6,"(
End
For(S,1,8
Output(S,11,")
End
Output(4,3,"0
Output(4,8,"0
Output(4,13,"0
Pause
Lbl 2
entAléat(10,99->X
partEnt(X->X
entAléat(10,99->Y
partEnt(Y->Y
entAléat(10,99->Z
partEnt(Z->Z
Output(4,3,X
Output(4,8,Y
Output(4,13,Z
I+1->I
If I<15
Then
Goto 2
Else
entAléat(1,8->X
partEnt(X->X
EffEcr
For(N,1,8
Output(N,6,"(
End
For(S,1,8
Output(S,11,")
End
Output4,3,X
0->I
Lbl 3
entAléat(10,99->Y
partEnt(Y->Y
entAléat(10,99->Z
partEnt(Z->Z
Output(4,8,Y
Output(4,13,Z
I+1->I
If I<10
Then
Goto 3
Else
EffEcr
For(N,1,8
Output(N,6,"(
End
For(S,1,8
Output(S,11,")
End
entAléat(1,8->Y
partEnt(Y->Y
Output(4,3,X
Output(4,8,Y
0->I
Lbl 4
entAléat(10,99->Z
partEnt(Z->Z
I+1->I
If I<5
Then
Goto 4
Else
EffEcr
For(N,1,8
Output(N,6,"(
End
For(S,1,8
Output(S,11,")
End
entAléat(1,8->Z
partEnt(Z->Z
Output(4,3,X
Output(4,8,Y
Output(4,14,Z
If X=Y et X=/=Z et Z=/=Y
Then
M*2->M
M+A->A
Output(4,2,"(
Output(4,4,")
Output(4,7,"(
Output(4,9,")
Pause
Goto 5
End
If X=Z et X=/=Y et y=/=Z
Then
M*2->M
M+A->A
Output(4,2,"(
Output(4,4,")
Output(4,13,"(
Output(4,15,")
Pause
Goto 5
Enf
If Y=Z et X=/=Y et X=/=Z
Then
M*2->M
M+A->A
Output(4,7,"(
Output(4,9,")
Output(4,13,"(
Output(4,15,")
Pause
Goto 5
End
If X=Y et Y=Z
Then
11*M->M
M+A->A
Output(4,2,"(
Output(4,4,")
Output(4,7,"(
Output(4,9,")
Output(4,13,"(
Output(4,15,")
Pause
EffEcr
Output(1,3,"! JACKPOT !
Output(3,3,"VOTRE GAIN :
Output(4,7,M
Output(6,3,"VOTRE ARGENT :
Output(7,7,A
Pause
EffEcr
Goto 7
End
If X=/=Y et Y=/=Z
Pause
EffEcr
Output(1,5,"PERDU !
Output(3,3,"VOTRE GAIN :
Output(4,8,"0
Output6,3,"VOTRE ARGENT :
Output(7,7,A
Pause
EffEcr
Goto 7
End
Lbl 5
EffEcr
Output(1,5,"GAGNE !
Output(3,3,"VOTRE GAIN :
Output(4,7,M
Output(6,3,"VOTRE ARGENT :
Output (7,7,A
Pause
EffEcr
Goto7
End
Lbl 7
EffEcr
Menu("CONTINUER ?","OUI",1,"NON",6
Lbl 6
EffEcr
Output(1,1,"
Voilà le code.
Vous remarquerez surement que j'utilise une variable A pour l'argent qui n'a pas été définie. C'est normal, puisque comme je l'ai dit, ce code fait partie d'un programme plus grand, et donc la variable A est définie dans ce programme.
Voilà, pouvez vous m'aider à améliorer ce code, le rendre moins lourd ?
Merci.
PS : N'ayant pas de cable pour tranférer mon programme de ma calculette à mon ordinateur, j'ai du le recopier à la main... (C'était long ! :p ) C'est pourquoi il peut y avoir quelques erreurs de syntaxe ^^
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Lun 14 Mai 2012, 18:28
Bonjour et bienvenue,
Je te remets le code en l'optimisant (là où il y aura des commentaires symbolisés par //comentaire (attention, ne fonctionne pas pour de vrai dans un programme), c'est que j'ai modifié.
Code
:EffEcr
:EffVar MEffvar XEffvar YEffVar ZEffvar IOutput(3,5,"MACHINE //ici (EffVar est dans prgm/CTL/G
:Output(5,6,"A SOUS
:Pause
:EffEcr
:Lbl 1
:If A<=0
:Then
:EffEcr
:Output(3,4,"VOUS ETES
:Output(5,4,"RUINE(E) !
:Pause
:EffEcr
:Goto 6
:End
Disp "VOTRE MISE :
:Input "=",M
:If M>A
:Then
:EffEcr
:Output(3,2,"VOUS N'AVEZ PAS
:Output(4,3,"ASSEZ D'ARGENT
:Output(5,4,"POUR MISER
:Output(6,5,"AUTAUT !
:Pause
:EffEcr
Goto 1
End
If M<=0
Then
EffEcr
Output(3,2,"VOUS NE POUVEZ
Output(5,1,"PAS MISER CELA !
Pause
Goto 1
End
A-M->A
EffEcr
For(N,1,8
Output(N,6,"(
End
For(S,1,8
Output(S,11,")
End
Output(4,3,"0 //devient For(S,0,2:Output(4,5S+3,"O:End
Output(4,8,"0 //à enlever
Output(4,13,"0 //à enlever
Pause
Lbl 2
entAléat(10,99->X
partEnt(X->X //inutile, c'est déjà un entier
entAléat(10,99->Y
partEnt(Y->Y //inutile, c'est déjà un entir
entAléat(10,99->Z
partEnt(Z->Z //inutile, c'est déjà un entier
Output(4,3,X
Output(4,8,Y
Output(4,13,Z
I+1->I
If I<15
Then
Goto 2
Else
entAléat(1,8->X
partEnt(X->X //inutile, c'est déjà un entier
EffEcr
For(N,1,8
Output(N,6,"(
End
For(S,1,8
Output(S,11,")
End
EffVar IOutput4,3,X //à la place de la ligne suivante
0->I //donc à enlever
Lbl 3
entAléat(10,99->Y
partEnt(Y->Y //inutile, c'est déjà un entier
entAléat(10,99->Z
partEnt(Z->Z //inutile, c'est déjà un entier
Output(4,8,Y
Output(4,13,Z
I+1->I
If I<10
Then
Goto 3
Else
EffEcr
For(N,1,8
Output(N,6,"(
End
For(S,1,8
Output(S,11,")
End
entAléat(1,8->Y
partEnt(Y->Y //inutile, c'est déjà un entier
Output(4,3,X
EffVar IOutput(4,8,Y //à le place de la lige suivate
0->I //donc à enlever
Lbl 4
entAléat(10,99->Z
partEnt(Z->Z //inutile, c'est déjà un entier
I+1->I
If I<5
Then
Goto 4
Else
EffEcr
For(N,1,8
Output(N,6,"(
End
For(S,1,8
Output(S,11,")
End
entAléat(1,8->Z
partEnt(Z->Z //inutile, c'est déjà un entier
Output(4,3,X
Output(4,8,Y
Output(4,14,Z
If X=Y et X=/=Z et Z=/=Y //devient If X=Y et X-Z et Z-Y (enfin, c'est juste plus rapide, pas plus léger
Then
M*2->M //devient 2M -> M
M+A->A
Output(4,2,"(
Output(4,4,")
Output(4,7,"(
Output(4,9,")
Pause
Goto 5
End
If X=Z et X=/=Y et y=/=Z //devient If X=Y et X-Z et Z-Y (enfin, c'est juste plus rapide, pas plus léger
Then
M*2->M //devient 2M -> M
M+A->A
Output(4,2,"(
Output(4,4,")
Output(4,13,"(
Output(4,15,")
Pause
Goto 5
End
If Y=Z et X=/=Y et X=/=Z //devient If X=Y et X-Z et Z-Y (enfin, c'est juste plus rapide, pas plus léger
Then
M*2->M //devient 2M -> M
M+A->A
Output(4,7,"(
Output(4,9,")
Output(4,13,"(
Output(4,15,")
Pause
Goto 5
End
If X=Y et Y=Z
Then
11*M->M //devient 11M -> M
M+A->A
Output(4,2,"(
Output(4,4,")
Output(4,7,"(
Output(4,9,")
Output(4,13,"(
Output(4,15,")
Pause
EffEcr
Output(1,3,"! JACKPOT !
Output(3,3,"VOTRE GAIN :
Output(4,7,M
Output(6,3,"VOTRE ARGENT :
Output(7,7,A
Pause
EffEcr
Goto 7
End
If X=/=Y et Y=/=Z //devient If X-Y et Y-Z (juste plus rapide
Pause //Il ne manqurait pas un Then avant? Sauf bien sur si seul le Pause est soumis à la condition
EffEcr
Output(1,5,"PERDU !
Output(3,3,"VOTRE GAIN :
Output(4,8,"0
Output6,3,"VOTRE ARGENT :
Output(7,7,A
Pause
EffEcr
Goto 7
End
Lbl 5
EffEcr
Output(1,5,"GAGNE !
Output(3,3,"VOTRE GAIN :
Output(4,7,M
Output(6,3,"VOTRE ARGENT :
Output (7,7,A
Pause
EffEcr
Goto7
End
Lbl 7
EffEcr
Menu("CONTINUER ?","OUI",1,"NON",6
Lbl 6
EffEcr
Output(1,1,"
Bon, je crois que c'est tout juste au ligne par ligne, après on peut peut-être faire mieux en réorganisant le code.
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Lun 14 Mai 2012, 19:46
Tu viens d'apercevoir la spécialité de sandro : simplifier les codes au niveau des détails.
La chose principale qu'il reste à observer est la structure des boucles qui utilise beaucoup trop de goto et de End mélangés. Cela peut grâvement pénaliser un programme.
If:Then:Goto:End est la cause d'un terrible ralentissement sur la durée, et peut causer des bugs dans certaines situations. (cf rubrique article)
---------------------- ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)
Oui, je l'ai remarqué. Au bout d'une dizaine de fois ou le programme est utilisé en boucle, un gros ralentissement s'observe, et parfois même une ERR: Mémoire :/
J'ai vu dans les différents topic sur forum qu'on pouvait éviter ce genre de ralentissement en restructurant le code, en sortant les Goto des boucles etc... Mais je ne sais pas trop faire ça... J'ai appris à programmer un peu tout seul, en observant d'autres programmes...
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Lun 14 Mai 2012, 21:37
J'ai écrit un article dans a rubrique article. (ben oui je me répète et alors ^^)
J'y ai exposé mes observations et proposé quelques solutions parmi les plus simples.
Bon ok je t'aide un peu : https://tout82.pages-perso.free.fr/forum/sujet.php?sujet=2757
J'ai réécrit le code en me limitant à des modifications techniques : je souhaite ne pas modifier le concept pour l'instant.
J'ai employé les solutions les plus évidentes, il est probable que d'autres solutions plus légères (mais aussi plus complexes) soient possibles.
Les Tabulations servent à mettre en évidence des zones modifiées.
Code
EffEcr
EffVar MEffvar XEffvar YEffVar ZEffvar IOutput(3,5,"MACHINE
Output(5,6,"A SOUS
Pause
EffEcr
Lbl 1
If A<=0
Then
EffEcr
Output(3,4,"VOUS ETES
Output(5,4,"RUINE(E) !
Pause
EffEcr
End
If A<=0
Goto 6
If M>A
Then
Disp "VOTRE MISE :
Input "=",M
If M>A
Then
EffEcr
Output(3,2,"VOUS N'AVEZ PAS
Output(4,3,"ASSEZ D'ARGENT
Output(5,4,"POUR MISER
Output(6,5,"AUTAUT !
Pause
EffEcr
End
If M>A
Goto 1
If M<=0
Then
EffEcr
Output(3,2,"VOUS NE POUVEZ
Output(5,1,"PAS MISER CELA !
Pause
End
If M<=0
Goto 1
A-M->A
EffEcr
For(N,1,8
Output(N,6,"(
End
For(S,1,8
Output(S,11,")
End
For(S,0,2
Output(4,5S+3,"O
End
Pause
While I<15
entAléat(10,99->X
entAléat(10,99->Y
entAléat(10,99->Z
Output(4,3,X
Output(4,8,Y
Output(4,13,Z
I+1->I
End
entAléat(1,8->X
EffEcr
For(N,1,8
Output(N,6,"(
End
For(S,1,8
Output(S,11,")
End
EffVar IOutput4,3,X
While I<10
entAléat(10,99->Y
entAléat(10,99->Z
Output(4,8,Y
Output(4,13,Z
I+1->I
End
EffEcr
For(N,1,8
Output(N,6,"(
End
For(S,1,8
Output(S,11,")
End
entAléat(1,8->Y
Output(4,3,X
EffVar IOutput(4,8,Y
While I<5
entAléat(10,99->Z
I+1->I
End
EffEcr
For(N,1,8
Output(N,6,"(
End
For(S,1,8
Output(S,11,")
End
entAléat(1,8->Z
Output(4,3,X
Output(4,8,Y
Output(4,14,Z
If X=Y et X-Z et Z-Y
Then
2M->M
M+A->A
Output(4,2,"(
Output(4,4,")
Output(4,7,"(
Output(4,9,")
Pause
End
If X=Y et X-Z et Z-Y
Goto 5
If X=Z et X-Y et y-Z
Then
2M->M
M+A->A
Output(4,2,"(
Output(4,4,")
Output(4,13,"(
Output(4,15,")
Pause
End
If X=Z et X-Y et y-Z
Goto 5
If Y=Z et X-Y et X-Z
Then
M2->M
M+A->A
Output(4,7,"(
Output(4,9,")
Output(4,13,"(
Output(4,15,")
Pause
End
If Y=Z et X-Y et X-Z
Goto 5
If X=Y et Y=Z
Then
11M->M
M+A->A
Output(4,2,"(
Output(4,4,")
Output(4,7,"(
Output(4,9,")
Output(4,13,"(
Output(4,15,")
Pause
EffEcr
Output(1,3,"! JACKPOT !
Output(3,3,"VOTRE GAIN :
Output(4,7,M
Output(6,3,"VOTRE ARGENT :
Output(7,7,A
Pause
EffEcr
End
If X=Y et Y=Z
Goto 7
If X-Y et Y-Z
Then
Pause
EffEcr
Output(1,5,"PERDU !
Output(3,3,"VOTRE GAIN :
Output(4,8,"0
Output6,3,"VOTRE ARGENT :
Output(7,7,A
Pause
EffEcr
End
If X-Y et Y-Z
Goto 7
Lbl 5
EffEcr
Output(1,5,"GAGNE !
Output(3,3,"VOTRE GAIN :
Output(4,7,M
Output(6,3,"VOTRE ARGENT :
Output (7,7,A
Pause
EffEcr
Lbl 7
EffEcr
Menu("CONTINUER ?","OUI",1,"NON",6
Lbl 6
EffEcr
Output(1,1,"
---------------------- ti82statfr: 2008, inscrit: 2009, ti84pocketfr: noël2011, ti30xbmultiview: iut 2012-2014
Perfectionniste, manque tact. Pas le temps de tout publier depuis 2011. Répond toujours aux questions. (rédigé juin 2014)