Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Jeu 05 Jan 2012, 22:02
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.
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 06 Jan 2012, 20:54
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)
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Ven 06 Jan 2012, 21:04
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
Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Ven 06 Jan 2012, 23:20
exact, le ù est le , 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
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.
Autorisation : Membre
Nb de messages : 2086
Inscrit le : Sam 23 Jan 2010, 20:09
Posté le : Sam 07 Jan 2012, 11:43
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à.
Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Sam 07 Jan 2012, 12:37
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üLƒ
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...
----------------------
Citer
Le temps est une variable dans une boucle infinie, qu'on ne cesse d'incrémenter.
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 08 Jan 2012, 19:03
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)
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Dim 08 Jan 2012, 19:27
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
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 08 Jan 2012, 20:22
Je suis époustouflé de voir quelqu'un utiliser IS !
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)
Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Dim 08 Jan 2012, 21:09
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.
Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Dim 08 Jan 2012, 23:21
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.
Autorisation : Membre
Nb de messages : 118
Inscrit le : Dim 13 Nov 2011, 14:26
Posté le : Ven 13 Jan 2012, 21:42
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.
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Ven 13 Jan 2012, 22:07
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