Poster un nouveau sujet Poster une réponse
Optimisation code Snake
Auteur Message
Polymorph



Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Jeu 05 Jan 2012, 22:02   Citer 

Avis à la populace, je lance une sorte d'appel de détresse (c'est pas vraiment de la détresse hein, mais si vous pouvez m'aider, ce serait super sympa!) car ayant terminé mon snake (j'espérais réussir à en faire un aussi rapide que celui qu'on m'avait filé sur ma calto quand j'étais en seconde, et qui avait le code caché :/) Je me retrouve face au fait qu'il ne va pas suffisament vite à mon gout.
Je vous poste donc la boucle principale de jeu.

TOUTE AIDE EST LA BIENVENUE !


Code
Repeat A=105
Repeat A
W->L1(B
Z->L2(B
If W=U and Z=V
Then:Pxl-Off(-V,U
Repeat not(pxl-Test(1-V,1+U
3randInt(1,18->U
-3randInt(1,17->V
End
N+1->N
If N=20:Goto D
Pt-On(U,V,2
Pt-Off(U,V,3
Pt-On(U,V
End
Pt-On(W,Z,2
B+1->B
If B>N
Pt-Off(L1(B-N),L2(B-N),2
W+3R->W
Z+3Q->Z
If pxl-Test(Q-Z,W-R
Goto 0
getKey->A
End
If A>=24 and A=<26 or A=34
Then
(A=25)-(A=34->Q
(A=26)-(A=24->R
End:End



Si vous avez besoin de précision ou de n'importe quoi d'autre, pas de soucis ^^

----------------------

Citer
Le temps est une variable dans une boucle infinie, qu'on ne cesse d'incrémenter.


Polymorph, 23/11/2011
 Adresse email Haut de page Bas de page 
 
Cytropus



Autorisation : Membre
Nb de messages : 407
Inscrit le : Lun 07 Nov 2011, 12:09
Posté le : Ven 06 Jan 2012, 11:21   Citer 

Bonjour Polymorph
Je suis pas très doué en optimisation mais il y a un truc que je comprend pas :
ù3rand(1,17)=>V

Il sert à quoi le ù en début de ligne ?
Sinon si tu cherche la petite bête tu peux supprimer une ) à la 8ème ligne justement

----------------------
Le nouveau site de tout82
 Adresse email Haut de page Bas de page 
 
Persalteas



Autorisation : Membre
Nb de messages : 2086
Inscrit le : Sam 23 Jan 2010, 20:09
Posté le : Ven 06 Jan 2012, 13:42   Citer 

Je crois que c'est le moins négatif (touche [( - )] je pense).

Sinon, des algorithmes de snake...
ben, heu...

Je sais pas ><

 Adresse email Haut de page Bas de page 
 
snap



Autorisation : Membre
Nb de messages : 364
Inscrit le : Dim 13 Fév 2011, 14:17
Posté le : Ven 06 Jan 2012, 16:09   Citer 

Pour gagner un octet :


Code
If pxl-Test(-Z-(D=4)+(D=2),W+(D=1)-(D=3



tu peut le changer en


Code
If pxl-Test((D=2)-Z-(D=4),W+(D=1)-(D=3



Bon voila quoi^^

----------------------
Commence un monopoly non graphique et compte bien le finir!
Lycée de l'escaut Valenciennes happy.gif
Fan de reflets d'acide!
le meilleur jeu du monde
http://snap-le-terrible.minitroopers.fr
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 06 Jan 2012, 20:54   Citer 

Les Goto D et Goto 0 sont des causes de ralentissement (qui semblent négligeables car pas systématiquement executés) car il sont à l'intérieur de boucles.

----------------------
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)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Ven 06 Jan 2012, 21:04   Citer 

D'ailleurs, je ne trouve pas les Lbl associers, quelcun les a vu?

Sandro

PS : si tu as le cable pour relier la TI à l'ordi et que tu as encore le snake que tu a reçu en second, envoie moi le fichier, je crois que 'ai une idée pour optenir le code source

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
Polymorph



Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Ven 06 Jan 2012, 23:20   Citer 

exact, le ù est le cupsmiley.gif, c'est Ti-program editor qui fait des siennes, ça ^^.

Bon, les deux petits octets que vous me faites gagner ne sont pas de refus, mais je ne sais pas si ça se verra sur l'accélération du code. Ce sont plus des astuces sur "telle fonction est plus rapide que telle autre", qui me faudrait, car j'ai déja épuisé toutes les astuces que j'avais et c'est encore plutôt lent crazy.gif

En effet, j'ai jugé que les goto étaient négligeables car effectués une fois par niveau, soit en moyenne 3,4 fois...
Je n'ai donc pas cité la partie avec les label associés, pour essayer de concentrer votre attention sur le code en question. Je suis prêt à faire une explication détaillée de son fonctionnement si ça peut faire surgir en vous des idées ^^.

----------------------

Citer
Le temps est une variable dans une boucle infinie, qu'on ne cesse d'incrémenter.


Polymorph, 23/11/2011
 Adresse email Haut de page Bas de page 
 
Persalteas



Autorisation : Membre
Nb de messages : 2086
Inscrit le : Sam 23 Jan 2010, 20:09
Posté le : Sam 07 Jan 2012, 11:43   Citer 

J'aimerais bien t'aider, mais je ne comprends pas ton code (je suis sous-doué pour comprendre les codes des autres)...

Pourquoi le codetouche se stocke dans A alors que c'est D qui fait les tests ?
Pourquoi tu ne définis pas de L1 et de B, ce qui donne une belle erreur dim ?
(si je rajoute 1->B au début du prog, il m'affiche un pixel puis le programme s'arrête.)


A mon avis, il nous manque un bout de code pour pouvoir t'aider, là.

 Adresse email Haut de page Bas de page 
 
Polymorph



Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Sam 07 Jan 2012, 12:37   Citer 

Parce que ce n'est pas un code fait pour être testé, mais pour être optimisé, néanmoins, si tu veux le tester, je te passe le code entier, mais il est trois fois plus long quoi ^^


Code
StoreGDB 1
0üXmin:94üXmax
ú62üYmin:0üYmax
FnOff
AxesOff
ClrDraw
RecallPic 0
Text(30,17,"JOUER
Text(30,46,"QUITTER
Text(50,22,"BY POLYMORPH
Text(40,35,"V 1.7
prgmSELECTOR
If Lƒ(1):Then
ClrDraw
RecallPic 2
69!:69!:69!:69!
Goto J0:End
DelVar L
Lbl D
L+1üL
ClrDraw
prgmZDECORS
Lbl A
0üA:4üD:1üB:5üN
48üW:ú30üZ
ClrList L1,L2‚
Repeat not(pxl-Test(úV,U
3randInt(1,29üU
ú3randInt(1,18üV
End
Lbl J0
Pt-On(U,V,2
Pt-Off(U,V,3
Pt-On(U,V
Lbl J
Repeat A=105
Repeat A
W=>L1(B
Z=>L2(B
If W=U and Z=V
Then:Pxl-Off(-V,U
Repeat not(pxl-Test(1-V,1+U
3randInt(1,18=>U
-3randInt(1,17=>V
End
N+1=>N
If N=20:Goto D
Pt-On(U,V,2
Pt-Off(U,V,3
Pxl-On(-V,U
End
Pt-On(W,Z,2
B+1=>B
If B>N
Pt-Off(L1(B-N),L2(B-N),2
W-3(D=1)+3(D=3=>W
Z-3(D=4)+3(D=2=>Z
If pxl-Test((D=2)-Z-(D=4),W+(D=1)-(D=3
Goto 0
getKey=>A
End
If Aù24 and A÷26
A-23üD
If A=34:4üD
End
StorePic 2
ClrDraw
RecallPic 1
Text(10,39,"PAUSE
Text(25,31,"REPRENDRE
Text(33,36,"SAUVER
Text(41,35,"QUITTER
25üI
Text(I,26,">
Repeat K=105
getKeyüK
If K=25 and I>25
Then:Text(I,26,"   "
I-8üI
Text(I,26,">
End
If K=34 and I<41
Then:Text(I,26,"   "
I+8üI
Text(I,26,">
End
End
ClrDraw
If I=25:Then
RecallPic 2
DelVar Pic2
69!:69!:69!
Goto J:End
If I=33:Then
9üdim(Lƒ
{1,W,Z,U,V,L,N,D,Bü
Text(28,25,"SAUVERGARDE
For(F,23,66
For(G,28,34
Pxl-Change(G,F
End
End
69!:69!
Text(36,29,"TERMINEE!
For(F,1,6
69!:End
ClrHome
ClrDraw
Output(1,1,"
Stop:End
If I=41:Then
DelVar Pic2
ClrHome
Output(1,1,"
RecallGDB 1
ClrList L,L‚
Stop:End
Lbl 0
For(F,31,0,ú1
Horizontal ú31-F
Horizontal F-31
End
ClrDraw:ClrHome
Output(3,4,"GAME  OVER
Output(6,5,"SCORE
Output(6,11,N-20+15L
ClrList L,L‚
RecallGDB 1


Il va avec SELECTOR et ZDECORS qui sont dans ma sign, que tu peux télécharger pour l'essayer.

Ceci est en fait que la boucle principale, c'est à dire celle qui tourne tant qu'on n'appuie sur aucun bouton, et qui fait avancer le snake, lui permet de manger le point et effectue le test de collision.
Lorsque l'on appuie sur une touche, on passe dans la partie secondaire de la boucle faisant changer la variable D (pour direction), qui elle définit les changements de coordonnées.

Néanmoins, toute partie se situant avant ou après la boucle de jeu gère les variables, pause, sauvegardes, and so on, et sont nettement moins intéressants à optimiser pour le moment, car avoir un joli menu pause sur un snake qui va à deux à l'heure... bigmouth.gif

----------------------

Citer
Le temps est une variable dans une boucle infinie, qu'on ne cesse d'incrémenter.


Polymorph, 23/11/2011
 Adresse email Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Sam 07 Jan 2012, 16:47   Citer 

J'ai peut-être une idée (aucune idée si ça accélère ou ralentit) :
remplacer ceci :

Code
W-3(D=1)+3(D=3=>W
Z-3(D=4)+3(D=2=>Z
If pxl-Test((D=2)-Z-(D=4),W+(D=1)-(D=3


Par celà (moins de booléen, un octé de moins, plus d'affectactions):

Code
(D=1 => P    //+7
(D=2 => Q   //+7
(D=3 => R   //+7
(D=4 => S   //+7
W-3P+3R=>W    //-7
Z-3S+3Q=>Z    //-7
If pxl-Test(Q-Z-S,W+P-R    //-15



Sandro

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
Polymorph



Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Dim 08 Jan 2012, 0:36   Citer 

Super! Et y'aurait-il moyen d'écrire


Code
(D=1 => P
(D=2 => Q 
(D=3 => R 
(D=4 => S 



Comme ça?

Code
(D={1,2,3,4 => {P,Q,R,S



----------------------

Citer
Le temps est une variable dans une boucle infinie, qu'on ne cesse d'incrémenter.


Polymorph, 23/11/2011
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 08 Jan 2012, 19:03   Citer 

Non, c'est impossible de modifier plusieurs variables en une seule ligne.
En revanche on peut stocker une liste ( {0,1,0,0} ) dans une autre (L6) et ainsi la liste contient LES valeurs intéressantes, mais il faut encore stocker CHAQUE terme de la liste dans la variable adéquate (P,Q,R et S).
Ou bien On peut utiliser la liste dans chaque test après mais cela alourdit le code.
En fin de compte il veut mieux en rester à la technique de sandro.

----------------------
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)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Dim 08 Jan 2012, 19:27   Citer 

J'ai encore une idée (enfin, de nouveau je ne sais pas si ça accélère, je ne suis même pas certain que ça marche:
Rzemplacer

Code
B+1=>B
If B>N
Pt-Off(L1(B-N),L2(B-N),2


Par
Code
IS>(B,N              //IS>(  est dans prgm/CTR
                //ligne vierge indispensable
Pt-Off(L1(B-N),L2(B-N),2


bilan : 5 octés en moins


Citer : manuel de la TI82stats.fr
IS>( (incrémenter et omettre) ajoute 1 à la variable. Si le résultat est supérieur à la valeur (qui peut être une expression), la commande suivante est omise ; si le résultat est inférieur ou égal à la valeur, la commande suivante est exécutée. variable ne peut pas être une variable du système.
:IS>(variable,valeur)
:commande (si résultat inférieur ou égal valeur)
:commande (si résultat > valeur) Programme Résultat

Remarque : IS>( n’est pas une instruction de boucle.



Sandro


EDIT : de même, si N est bien la longueur du serpent, on peut aussi remplacer

Code
N+1=>N
If N=20:Goto D


par

Code
IS>(N,19
                   //ligne vierge indispensable
Goto D


bilan : 5 octés en moins

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
linkakro



Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 08 Jan 2012, 20:22   Citer 

Je suis époustouflé de voir quelqu'un utiliser IS ! bigmouth.gif
Je ne m'en suis servi qu'une fois parmi tous les progs que j'ai jamais écrit...

MAIS le manuel est erroné à partir de :IS>(variable,valeur) , c'est même en contradiction avec le paragraphe avant.
J'ai effectué un test pour le prouver.
Code
Prompt A
IS>(A,6       // j'apellerai A' la nouvelle valeur de A
Disp "NOT >6  // est affiché quand A'<=6
Disp ">6      // est toujours affiché
A             // affiche A'

Seule la première commande suivant IS> en dépend.
Cette première commande est ommise si A'>6 (donc lue si A'<=6)
La seconde commande n'a rien à voir, sauf si la première est un End ou un Goto.
Je crois que le rédacteur avait en tête le cas de figure où la première commande est un Goto.

Je crains que IS soit incompatible avec ta première suggestion.

----------------------
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)

Pour tout le monde et surtout les débutants, quelques-uns des articles courants :
*Traductions Algorithmie/Ti-Basic.
*Caractères spéciaux sur Tout82
Les défauts du TI-Basic : Goto_versus_algo et DelVar/End/Lbl/guillemet/store
 Adresse email Haut de page Bas de page 
 
Google_AdSense



Publicité    



 
Polymorph



Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Dim 08 Jan 2012, 21:09   Citer 

Effectivement, IS peut être intéressant, mais malgré les traductions, c'est pas clair à mes yeux ^^


Citer
si le résultat est inférieur ou égal à la valeur, la commande suivante est exécutée.



Néanmoins, cela désigne un IS>( . Si j'ai bien compris, on aurait besoin d'un IS<(

Cad une fonction qui incrémente toujours, et si la variable est plus grande que celle désigne, on exécute ce qu'il y a dedans.

Pour le test des boléens, c'était bien essayé mais ça n'accélère pas le code. A vue d'oeil, j'ai même eu l'impression que ça le ralentissait un chouilla...

----------------------

Citer
Le temps est une variable dans une boucle infinie, qu'on ne cesse d'incrémenter.


Polymorph, 23/11/2011
 Adresse email Haut de page Bas de page 
 
Polymorph



Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Dim 08 Jan 2012, 23:21   Citer 

Up + correction!


Citer

Pour le test des boléens, c'était bien essayé mais ça n'accélère pas le code. A vue d'oeil, j'ai même eu l'impression que ça le ralentissait un chouilla...


Ca, c'est si on le laisse dans la boucle principale, mettez-le dans la boucle secondaire (comprenez l'endroit ou on fait les test pour changement de directions, et là, ça devient chouette ! Petite accélération notable, merci à toi Sandro !

----------------------

Citer
Le temps est une variable dans une boucle infinie, qu'on ne cesse d'incrémenter.


Polymorph, 23/11/2011
 Adresse email Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Lun 09 Jan 2012, 19:03   Citer 

Désolé pour les IS>( , j'y suis pour quoi si chez Texas Instrument eux même, il ne connaissent pas les fonctions qu'ils ont programmées?

Sandro maxiangry.gif (vis-à-vis de TI)

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
Polymorph



Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Ven 13 Jan 2012, 21:42   Citer 

Pom pom pom!

Up + Edit : J'ai modifié quelque peu les boléens, et on arrive à une vitesse pas mal, mais ce serait bien si on pouvait encore accélérer un peu, ou alors améliorer la réactivité du snake (là j'avoue que je n'ai pas la moindre idée de comment faire xD)


Code
Repeat A=105
Repeat A
W->L1(B
Z->L2(B
If W=U and Z=V
Then:Pxl-Off(-V,U
Repeat not(pxl-Test(1-V,1+U
3randInt(1,18->U
-3randInt(1,17->V
End
N+1->N
If N=20:Goto D
Pt-On(U,V,2
Pt-Off(U,V,3
Pt-On(U,V
End
Pt-On(W,Z,2
B+1->B
If B>N
Pt-Off(L1(B-N),L2(B-N),2
W+3R->W
Z+3Q->Z
If pxl-Test(Q-Z,W-R
Goto 0
getKey->A
End
If A>=24 and A=<26 or A=34
Then
(A=25)-(A=34->Q
(A=26)-(A=24->R
End:End



Des idées? D'ailleurs, en y repensant, si vous trouvez un moyen d'accélérer l'effacement des points, ce serait pas mal ^^.

----------------------

Citer
Le temps est une variable dans une boucle infinie, qu'on ne cesse d'incrémenter.


Polymorph, 23/11/2011
 Adresse email Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Ven 13 Jan 2012, 22:07   Citer 

J'ai peut-être une idée : et si tu prenait les pixels comme affichage du serpant, vu que tu doit bien plus souvant déplacer le serpant qu'afficher une pomme?

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
Polymorph



Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Ven 13 Jan 2012, 22:12   Citer 

Explique, je comprends pas ce que tu veux dire.

----------------------

Citer
Le temps est une variable dans une boucle infinie, qu'on ne cesse d'incrémenter.


Polymorph, 23/11/2011
 Adresse email Haut de page Bas de page 
 
sandro



Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Ven 13 Jan 2012, 23:52   Citer 

Non, désolé, c'est moi qui n'ai pas fais attention.

----------------------
mort à l'inutile, place à la mémoire libre et aux programmes
 Adresse email Haut de page Bas de page 
 
Poster un nouveau sujet Poster une réponse





  Page générée en 6 requêtes