Opti-Défi n°2 : Snake
Re: Opti-Défi n°2 : Snake
Ah oui effectivement, ça risque au niveau fuite de mémoire. On pourrait remarque aussi utiliser une autre boucle pour ce goto, mais là, on rendrait l’interpréteur fou .... m'enfin je vais aussi essayer.
-
TheMachine02Modo
Niveau 16: CC2 (Commandeur des Calculatrices)- Messages: 341
- Images: 0
- Inscription: 16 Jan 2013, 18:27
- Genre:
- Calculatrice(s):→ MyCalcs profile
- Classe: Médecine
Re: Opti-Défi n°2 : Snake
Non tu ne peux pas remplacer par des boucles car les 2 ne sont pas imbriquées "normalement".
J'essaye de comprendre ton code mais tu as beaucoup de calculs compliqués ^^
J'essaye de comprendre ton code mais tu as beaucoup de calculs compliqués ^^
-
m@thieu41Premium
Niveau 11: LV (Légende Vivante)- Messages: 230
- Inscription: 20 Juin 2013, 14:24
- Genre:
- Calculatrice(s):→ MyCalcs profile
- Classe: TS
Re: Opti-Défi n°2 : Snake
Non, pas les deux boucles, mais le Lbl 0 : goto 0 peut bien être changé en While 1 : End sans risque de fuite de mémoire, et en sauvant 1 octet
-
TheMachine02Modo
Niveau 16: CC2 (Commandeur des Calculatrices)- Messages: 341
- Images: 0
- Inscription: 16 Jan 2013, 18:27
- Genre:
- Calculatrice(s):→ MyCalcs profile
- Classe: Médecine
Re: Opti-Défi n°2 : Snake
Pas très esthétique mais...ça marche !!!
(voir mon poste édité plus haut : viewtopic.php?f=11&t=14596&start=10#p165142 )
c'est vrai qu'à chaque fois que le serpent tombera sur une nourriture, ce GOTO (placé dans la boucle repeat;end) va prendre de la mémoire (au niveau de la "pile " où sont stockés les branchements, je pense)
(voir mon poste édité plus haut : viewtopic.php?f=11&t=14596&start=10#p165142 )
c'est vrai qu'à chaque fois que le serpent tombera sur une nourriture, ce GOTO (placé dans la boucle repeat;end) va prendre de la mémoire (au niveau de la "pile " où sont stockés les branchements, je pense)
Dernière édition par grosged le 09 Juin 2014, 09:41, édité 3 fois.
-
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)- Messages: 770
- Images: 75
- Inscription: 14 Sep 2011, 12:29
- Genre:
- Calculatrice(s):→ MyCalcs profile
Re: Opti-Défi n°2 : Snake
Oui ça m'a l'air faisable
Par contre il y a un truc que je pige pas:
Dans la liste L1 tu stockes la coordonnée de la prochaine position du serpent c'est bien ça?
Que ce passe-t-il si cette prochaine coordonnée est 9? Il risque d'y avoir conflit avec le nombre lié à la denrée non?
Autre remarque: je me trompe peut être mais il me semble que tu gère la collision avec le score des unités et des dizaines, mais pas des centaines?
devient
On perd 2 octets mais on gère tous les cas...
Que se passe-t-il si L1 est déjà définie avant de lancer le prgm?
On perd 2 octets mais au moins c'est propre
Et on gagne 1 octet par rapport à si on avait utilisé DelVar ^^
On peut se servir de Y1 pour Y2?
Ca m'a l'air bien compliqué ce calcul ^^
PS: Je posterai mon code mais il est moins bien pensé ^^
EDIT: Pas cette boucle!!!
Tu mélanges les goto/boucles de façon tout à fait horrible
On a une fuite à chaque fois que le serpent mange une denrée, ça ralenti tout et c'est pas propre x)
http://tout82.free.fr/forum/sujet.php?sujet=2757
Il fallait modifier l'autre goto/lbl par un While 1/End plutôt, comme proposé par theMachine02
Par contre il y a un truc que je pige pas:
Dans la liste L1 tu stockes la coordonnée de la prochaine position du serpent c'est bien ça?
Que ce passe-t-il si cette prochaine coordonnée est 9? Il risque d'y avoir conflit avec le nombre lié à la denrée non?
Autre remarque: je me trompe peut être mais il me semble que tu gère la collision avec le score des unités et des dizaines, mais pas des centaines?
- Code: Tout sélectionner
Z–(S>9
devient
- Code: Tout sélectionner
Z-iPart(log(Z+.9
On perd 2 octets mais on gère tous les cas...
- Code: Tout sélectionner
{2,3,4,5→L1 // positions successives de la queue
8Z→dim(L1 // liste contenant le terrain (128 cases)
Que se passe-t-il si L1 est déjà définie avant de lancer le prgm?
- Code: Tout sélectionner
seq(A(A<7),A,2,1+8Z->L1
On perd 2 octets mais au moins c'est propre
Et on gagne 1 octet par rapport à si on avait utilisé DelVar ^^
- Code: Tout sélectionner
"1+int(Z¯¹(Ans–1→Y1 // calcule la ligne de la position dans Ans
"1+ZfPart(Z¯¹(Ans–1→Y2 // calcule la colonne ...
On peut se servir de Y1 pour Y2?
- Code: Tout sélectionner
"1+int(Z¯¹(Ans–1→Y1 // calcule la ligne de la position dans Ans
"Ans+Z-ZY1→Y2 // calcule la colonne ...
- Code: Tout sélectionner
Ans–Z(8(D²>1)((Ans>8Z)–(Ans<1))+D(D²=cos(π8¯¹(T–not(D+1→L1(T
Ca m'a l'air bien compliqué ce calcul ^^
PS: Je posterai mon code mais il est moins bien pensé ^^
EDIT: Pas cette boucle!!!
Tu mélanges les goto/boucles de façon tout à fait horrible
On a une fuite à chaque fois que le serpent mange une denrée, ça ralenti tout et c'est pas propre x)
http://tout82.free.fr/forum/sujet.php?sujet=2757
Il fallait modifier l'autre goto/lbl par un While 1/End plutôt, comme proposé par theMachine02
-
m@thieu41Premium
Niveau 11: LV (Légende Vivante)- Messages: 230
- Inscription: 20 Juin 2013, 14:24
- Genre:
- Calculatrice(s):→ MyCalcs profile
- Classe: TS
Re: Opti-Défi n°2 : Snake
oui Mathieu, tu as raison : il risque d'y avoir conflit avec la denrée, ....on pourrait remplacer la valeur 9 par Pi par exemple ! (je modifie ça de suite )
la gestion d'un score qui ne dépasserait pas 99 , c'est volontaire (je me dis qu'arrivé à 100 , le serpent occuperait quand même 105 cases sur (128-3=)125 cases (en théorie, possible, mais en pratique , je doute fort )
sinon, concernant L1, j'ai fait des test : le fait d'avoir
annule/efface complètement un éventuel ancien L1
se servir de Y1 pour définir Y2?...bien vu !! j'vais tester ça
la gestion d'un score qui ne dépasserait pas 99 , c'est volontaire (je me dis qu'arrivé à 100 , le serpent occuperait quand même 105 cases sur (128-3=)125 cases (en théorie, possible, mais en pratique , je doute fort )
sinon, concernant L1, j'ai fait des test : le fait d'avoir
- Code: Tout sélectionner
{2,3,4,5→L1 // positions successives de la queue
8Z→dim(L1 // liste contenant le terrain (128 cases)
annule/efface complètement un éventuel ancien L1
se servir de Y1 pour définir Y2?...bien vu !! j'vais tester ça
Dernière édition par grosged le 09 Juin 2014, 10:03, édité 1 fois.
-
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)- Messages: 770
- Images: 75
- Inscription: 14 Sep 2011, 12:29
- Genre:
- Calculatrice(s):→ MyCalcs profile
Re: Opti-Défi n°2 : Snake
Hey Mathieu ! j'viens de voir ton EDIT
Pourrais-tu poster ton idée au sujet des boucles ?...parce qu'avec les modifs un peu partout, je m'y perds..héhé
EDIT: à propos de
j'ai , au final , factorisé...et j'ai utilisé la fonction cosinus comme repère pour les bords gauche et droit (y a certainement moyen d'utiliser 1 ou 2 fpart bien placés mais j'avais la flemme...et comme c'était pas trop long..., haha)
la 1ère partie gère les extrémités supérieures/inférieures du terrain:
avant factorisation, c'était:
et la 2ème partie , c'était
Pourrais-tu poster ton idée au sujet des boucles ?...parce qu'avec les modifs un peu partout, je m'y perds..héhé
EDIT: à propos de
- Code: Tout sélectionner
Ans–Z(8(D²>1)((Ans>8Z)–(Ans<1))+D(D²=cos(π8¯¹(T–not(D+1→L1(T
j'ai , au final , factorisé...et j'ai utilisé la fonction cosinus comme repère pour les bords gauche et droit (y a certainement moyen d'utiliser 1 ou 2 fpart bien placés mais j'avais la flemme...et comme c'était pas trop long..., haha)
la 1ère partie gère les extrémités supérieures/inférieures du terrain:
avant factorisation, c'était:
- Code: Tout sélectionner
Ans-128(D²>1)((Ans>128)-(Ans<1)
et la 2ème partie , c'était
- Code: Tout sélectionner
+16D(D²=cos(2π16¯¹(T–not(D+1
Dernière édition par grosged le 09 Juin 2014, 10:16, édité 2 fois.
-
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)- Messages: 770
- Images: 75
- Inscription: 14 Sep 2011, 12:29
- Genre:
- Calculatrice(s):→ MyCalcs profile
Re: Opti-Défi n°2 : Snake
Je modifie juste ton ancien code, sans tenir compte des remarques précédentes:
L'autre modif marche, mais est source de conflit entre les goto/lbl et la boucle... Donc ça ralenti de plus en plus, et c'est pas propre x)
C'est vrai que c'est dur mais possible quand même de dépasser 99
Oui j'ai dis une bêtise pour L1, autant pour moi ^^
En fait j'aime bien ton utilisation de cos ^^
- Code: Tout sélectionner
ClrHome //efface l'écran
Disp "ØØØØØ //affiche le serpent ( long de 5 cases au départ)
16→Z // nb de colonnes de l'écran
"1+int(Z¯¹(Ans–1→Y1 // calcule la ligne de la position dans Ans
"1+ZfPart(Z¯¹(Ans–1→Y2 // calcule la colonne ...
{2,3,4,5→L1 // positions successives de la queue
8Z→dim(L1 // liste contenant le terrain (128 cases)
DelVar SZ→D //score à 0, Direction=16 (vers le bas)
5→T:1→Q // position de la tête, et de la queue
While 1 // <- ICI
Z–(S>9 // colonne où l'on ...
Output(1,Ans,S // affichera le score
Ans→L1(Ans // marque cet emplacement d'une valeur autre que 0
While L1(Ans // détermine au hasard
randInt(1,8Z // l'emplacement d'une nouvelle denrée
End
Output(Y1,Y2,1 // puis l'affiche
9→L1(Ans // et marque sur le terrain (liste L1)
S+1→S // incrémente le score
Lbl 1
getKey // scrute le clavier
(Ans=26)–(Ans=24)+Z((Ans=34)–(Ans=25 //(gauche:-1 droite: 1 haut: -16 bas: 16)
If Ans:Ans→D // si l'une des flèches appuyées alors nouvelle direction dans D
T+D // va maintenant gérer les bords du terrain (téléporteurs)
Ans–Z(8(D²>1)((Ans>8Z)–(Ans<1))+D(D²=cos(π8¯¹(T–not(D+1→L1(T
Ans→T // mets à jour la position de la tête
Output(Y1,Y2,Ø // et l'affiche
If 9=L1(T // si on tombe sur la denrée
End // alors on n'efface pas la queue <- ET ICI
Q→W // efface la queue
Output(Y1,Y2,"░ // au moyen d'un espace
L1(Q→Q //nouvelle position de la queue
Ø→L1(W // marque d'un 0 à l'ancienne position
If not(L1(T // la tête a-t-elle heurtée qqchose?
Goto 1 // non? alors on continue
L'autre modif marche, mais est source de conflit entre les goto/lbl et la boucle... Donc ça ralenti de plus en plus, et c'est pas propre x)
C'est vrai que c'est dur mais possible quand même de dépasser 99
Oui j'ai dis une bêtise pour L1, autant pour moi ^^
En fait j'aime bien ton utilisation de cos ^^
-
m@thieu41Premium
Niveau 11: LV (Légende Vivante)- Messages: 230
- Inscription: 20 Juin 2013, 14:24
- Genre:
- Calculatrice(s):→ MyCalcs profile
- Classe: TS
Re: Opti-Défi n°2 : Snake
Aaaaah OK OK je comprends maintenant !! merci !!
j'vais modifier mon programme...et, par la même occasion, remplacer cette valeur 9 ( représentant une denrée, et éventuellement conflictuelle) par Pi (j'avais aussi pensé au nb d'Euler, mais prends 1 octet de plus que Pi)
Ainsi, le programme est maintenant descendu à ... 302 / 305 octets
ClrHome //efface l'écran
Disp "ØØØØØ //affiche le serpent ( long de 5 cases au départ)
16→Z // nb de colonnes de l'écran
"1+int(Z¯¹(Ans–1→Y1 // calcule la ligne de la position dans Ans
"Ans+Z-ZY1→Y2 // calcule la colonne ... opti de Mathieu
{2,3,4,5→L1 // positions successives de la queue
8Z→dim(L1 // liste contenant le terrain (128 cases)
DelVar SZ→D //score à 0, Direction=16 (vers le bas)
5→T:1→Q // position de la tête, et de la queue
While 1
Z–(S>9 // colonne où l'on ...
Output(1,Ans,S // affichera le score
Ans→L1(Ans // marque cet emplacement d'une valeur autre que 0
While L1(Ans // détermine au hasard
randInt(1,8Z // l'emplacement d'une nouvelle denrée
End
Output(Y1,Y2,1 // puis l'affiche
π→L1(Ans // et la marque sur le terrain (liste L1)
S+1→S // incrémente le score
LBL 1 // tant que la tête va sur des cases vides (mis à part la denrée)
getKey // scrute le clavier
(Ans=26)–(Ans=24)+Z((Ans=34)–(Ans=25 //(gauche:-1 droite: 1 haut: -16 bas: 16)
If Ans:Ans→D // si l'une des flèches appuyées alors nouvelle direction dans D
T+D // va maintenant gérer les bords du terrain (téléporteurs)
Ans–Z(8(D²>1)((Ans>8Z)–(Ans<1))+D(D²=cos(π8¯¹(T–not(D+1→L1(T
Ans→T // actualise la position de la tête
Output(Y1,Y2,Ø // et l'affiche
If π=L1(T // (exception de la denrée)
End // alors on n'efface pas la queue
Q→W // efface la queue
Output(Y1,Y2,"░ // au moyen d'un espace
L1(Q→Q //nouvelle position de la queue
Ø→L1(W // marque d'un 0 l'ancienne position
If not(L1(T // continue si la tête n'a rien heurté
Goto 1
j'vais modifier mon programme...et, par la même occasion, remplacer cette valeur 9 ( représentant une denrée, et éventuellement conflictuelle) par Pi (j'avais aussi pensé au nb d'Euler, mais prends 1 octet de plus que Pi)
Ainsi, le programme est maintenant descendu à ... 302 / 305 octets
ClrHome //efface l'écran
Disp "ØØØØØ //affiche le serpent ( long de 5 cases au départ)
16→Z // nb de colonnes de l'écran
"1+int(Z¯¹(Ans–1→Y1 // calcule la ligne de la position dans Ans
"Ans+Z-ZY1→Y2 // calcule la colonne ... opti de Mathieu
{2,3,4,5→L1 // positions successives de la queue
8Z→dim(L1 // liste contenant le terrain (128 cases)
DelVar SZ→D //score à 0, Direction=16 (vers le bas)
5→T:1→Q // position de la tête, et de la queue
While 1
Z–(S>9 // colonne où l'on ...
Output(1,Ans,S // affichera le score
Ans→L1(Ans // marque cet emplacement d'une valeur autre que 0
While L1(Ans // détermine au hasard
randInt(1,8Z // l'emplacement d'une nouvelle denrée
End
Output(Y1,Y2,1 // puis l'affiche
π→L1(Ans // et la marque sur le terrain (liste L1)
S+1→S // incrémente le score
LBL 1 // tant que la tête va sur des cases vides (mis à part la denrée)
getKey // scrute le clavier
(Ans=26)–(Ans=24)+Z((Ans=34)–(Ans=25 //(gauche:-1 droite: 1 haut: -16 bas: 16)
If Ans:Ans→D // si l'une des flèches appuyées alors nouvelle direction dans D
T+D // va maintenant gérer les bords du terrain (téléporteurs)
Ans–Z(8(D²>1)((Ans>8Z)–(Ans<1))+D(D²=cos(π8¯¹(T–not(D+1→L1(T
Ans→T // actualise la position de la tête
Output(Y1,Y2,Ø // et l'affiche
If π=L1(T // (exception de la denrée)
End // alors on n'efface pas la queue
Q→W // efface la queue
Output(Y1,Y2,"░ // au moyen d'un espace
L1(Q→Q //nouvelle position de la queue
Ø→L1(W // marque d'un 0 l'ancienne position
If not(L1(T // continue si la tête n'a rien heurté
Goto 1
Dernière édition par grosged le 09 Juin 2014, 19:54, édité 1 fois.
-
grosgedVIP++
Niveau 14: CI (Calculateur de l'Infini)- Messages: 770
- Images: 75
- Inscription: 14 Sep 2011, 12:29
- Genre:
- Calculatrice(s):→ MyCalcs profile
Re: Opti-Défi n°2 : Snake
- Code: Tout sélectionner
Repeat L1(T // tant que la tête va sur des cases vides (mis à part la denrée)
Ca serait pas plutôt Lbl 1 ? ^^
-
m@thieu41Premium
Niveau 11: LV (Légende Vivante)- Messages: 230
- Inscription: 20 Juin 2013, 14:24
- Genre:
- Calculatrice(s):→ MyCalcs profile
- Classe: TS
48 messages
• Page 3 sur 5 • 1, 2, 3, 4, 5
Qui est en ligne
Utilisateurs parcourant ce forum: Aucun utilisateur enregistré et 6 invités