Catégorie :
SupportForum :
TI-82 STATS.frVues : 3806
Réponses : 56
Type : discussion
Etat : réponses autorisées
Avertissement :Il s'agit d'une page optimisée pour la navigation mobile. Voir la
page originale.
Snake - Page 1 / 2
Samos le 29/05/2012 à 16:53
Bonjour,
Depuis quelques temps j'essaie de faire un snake mais quelques problèmes se posent.
Le jeu se joue dans une fenêtre ou Xmin/Ymin =-10. XMax/YMax=10
Code
:EffDessin
:0->X:0->Y:-1->S:0->K:0->L
:Lbl 1
:M+1->M
:Pt-Off(B,C
:entAleat(-10,10->B
:entAleat(-10,10->C
:Pt-On(B,C
:Repeat B=X et C=Y
:Texte(57,0,M
:X+K->X
:Y+L->Y
:Pt-On(X,Y,2
:Pt-Off(X-K,Y-L,2
:If X>10:Then:X-21->X:End
:If Y>10:Then:Y-21->Y:End
:If X<-10:Then:X+21->X:End
:If Y<-10:Then:Y+21->Y:End
:CodeTouche->A
:If A=25
:Then
:0.5->L:0->K:End
:If A=26
:Then
:0->L:0.5->K
:End
:If A=24
:Then
:-0.5->K:0->L
:End
:If A=34
:Then
:0->K:-0.5->L
:End
:End
:Goto 1
Quelques problèmes sont à régler notamment le Goto 1 qui ralentit un peu le jeu.
Il y a aussi le problème de la taille du snake que je ne sais pas modifier.
Pour l'instant le snake est invulnerable ce qui n'est pas si mal

.
.
Persalteas le 29/05/2012 à 17:00
Citation
Le jeu se joue dans une fenêtre ou Xmin/Ymin =-10. XMax/YMax=10
étrange, mais si tu veux...
à première vue, tu peux déjà optimiser
Code
:If X>10:Then:X-21->X:End
:If Y>10:Then:Y-21->Y:End
:If X<-10:Then:X+21->X:End
:If Y<-10:Then:Y+21->Y:End
par
Code
:If X>10:X-21->X
:If Y>10:Y-21->Y
:If X<-10:X+21->X
:If Y<-10:Y+21->Y
Mais c'est déjà vachement bien, j'ai rarement vu un code de snake aussi court... serait-ce parce que ton snake ne mesure que 1 de long ?

Samos le 29/05/2012 à 18:32
Oui xD
S'il est possible de m'apprendre comment modifier sa taille je serai très reconnaissant!Persalteas le 29/05/2012 à 21:36
ah ben ça
Tu demandes un des trucs les plus durs à faire en Basic...
Je n'ai jamais programmé de Snake, je ne sais pas trop comment faire...
Je pense en tout cas que tu vas devoir utiliser des listes pour enregistrer les coordonnées des points composant le serpent.
The K le 29/05/2012 à 21:42
Peut-être deux listes qui sauvegardent les coordonnées du snake.

Persalteas le 29/05/2012 à 22:08
quelle est la différence avec ce que je viens de dire ???The K le 29/05/2012 à 22:14
J'ai optimisé ma phrase elle est plus courte ... (nan bon OK j'avais oublié de lire la fin du message *sifflote*)Samos le 30/05/2012 à 18:28
Code
For(x,0,10,1
X->dim(L1
End
J'ai essayé ce petit programme mais il ne fonctionne pas.
Dans les liste il n'y a que des 0 dans L1.
Je suppose que je suis sur une mauvaise piste...
The K le 30/05/2012 à 18:42
Pas tant que ça.
Juste que l'instruction dim sert à dimensionner une liste. Si tu mets 10->dim(L1) tu auras une liste 1 à 10 emplacements mais vu que tu n'as défini aucun des emplacements en questions, ils seront tous vides ... d'où les 0.
Afin de remplir -par exemple- le cinquième terme de la liste1 tu devras utiliser cette instruction : 1->L1(5)
Je te laisse revoir ton algorithme
(ps : regarde le lien dans ma signature en progra si tu n'as pas compris - chapitre listes)
Persalteas le 30/05/2012 à 18:51
Je sens aussi que tu vas devoir apprendre a utiliser la commande seq( pour ce genre de scrolling de liste...linkakro le 30/05/2012 à 18:59
Ce que tu viens d'écrire correspond à l'allongement de la liste et donc du serpent.
Il faut aussi manipuler les coordonnées.
Voici un exemple grossier.
Code
ClrDraw
ClrList L1
1->X
For(A,1,15 // s'allonger
A->dim(L1
For(B,1,4 // se déplacer plusieurs fois
pxl-Off(1,L1(1
For(C,2,A // permute les valeurs de la liste
L1(C->L1(C-1
End
X+1->X
X->L1(A
pxl-On(1,X
Pause
End
End
Je ne pense pas que la fonction seq() soit très utile.
Si tu y tiens : seq(L1(X),X,2,dim(L1))
En revanche la fonction chaine()/augment est utile pour concaténer des listes.
Je vous invite à utiliser un bug de la TI :
SortA(L1,L2) permute la première valeur de L2 lorsque L1 est constante.
Samos le 31/05/2012 à 18:33
Effectivement je ne connaissait pas très bien les listes.
J'ai réussi a faire un petit programme qui ressemble un peu à celui de Linkakro
mais il y a toujours des points que je ne comprend pas dans son programme.
Notament les For(qui ne contiennent que 3 caractères.
Code
EffDessin
1->A:1->B:5->C
While 1
For(X,1,5,1
For(P,B,C,1
P->L1(X)
Pt-Off(0,L1(X),2
Pt-On(0,L1(X),2 // jusque la ça va!
CodeTouche->F
If F=25
Then
B+1->B:C+1->C
End
If F=34
Then
B-1->B
C-1->C
End
End
End
End
quand je lance ce programme, ce qui est censé ressembler a un snake s'étale sans s'effacer.
P.S le tutoriel m'a bien été utile
Merci de votre aide
Samos le 31/05/2012 à 18:46
Ah aussi j'ai rajouté un sorte de barre de "restatage"(comme j'aime pas mourrir

) à chaque fois que le snake passe dessus les points reviennent à 0. Mais des fois les points apparaissent sur cette barre ce qui est assez embêtant. Je voulais savoir s'il est possible de sortir un nombre aléatoire excepté 1.
The K le 31/05/2012 à 19:00
Un For(A,1,10 sous-entend For(A,1,10,1. C'est exactement la même chose.
Si tu veux plus d'infos tu peux piocher dans mes liens-signature

linkakro le 31/05/2012 à 19:52
Pour générer un nombre aléatoiore autre que la queue, il faut une boucle qui teste la présence de la queue et recommence à générer un aléatoire jusqu'à trouver un aléatoire valide.Samos le 08/06/2012 à 18:39
Bon j'ai trop de mal à le mettre en place

j'arrête pour le moment.
Merci de votre aide.
Samos le 22/06/2012 à 10:18
Code
0->G
:Lbl 1
:M+1->M
:Pt-Off(B,C
:entAleat(-10,10->B
:entAleat(-10,10->C
:Pt-On(B,C
:Repeat B=X et Y=C
:G+1->G
:X+K->X
:Y+L->Y
:Pt-off(L1(G-M),L2(G-M)
:X->L1(G
:Y->L2(G
:L1(G->L1(G-1
:L2(G->L2(G-1
:Pt-on(L1(G),L2(G
Parfait non?
Le serpent grandit en fonction de ce qu'il bouffe!!
Seul petit hic sa remplit trop L1 et L2 ce qui me prend 4000octet par partie de 2min

18 octets par boucle vous pouvez compter!
En fait, il y a 2 petits hic!
Il va trop lentement... Si vous avez des idées pour l'optimiser à part changer de calculette

The K le 22/06/2012 à 11:05
Les snakes ne sont malheureusement jamais très rapide.
Le meilleur snake qui avance a une bonne vitesse (que je conaisse) est celui de Ratuss mais sérieusement je n'ai pas tout compris dans le programme.
Donc voila ...

Samos le 22/06/2012 à 11:08
Dans le mien?
Sinon deja test 1 snake sur TI 84 il allait hiper vite!
Que se passe-t-il si la mémoire de la calculatrice est saturée?The K le 22/06/2012 à 11:51
Non dans le programme de Ratuss. Enfin je comprends l'architecture générale mais dans le détail des fois ...
LA saturation de la mémoire RAM ralentit justela calculatrice. Et si tu n'as plus du tout de RAM tu ne pourras pas faire aucun calcul du genre "1+1=?".
Et si c'est plus rapide sur TI-84 c'est simplement qu'en général on laisse les programmes dont on se sert peu dans l'archive --> beaucoup de RAM dispo. Comme tu n'as pas de flash sur TI-82 j'te laisse imaginer

Persalteas le 22/06/2012 à 12:56
TheK a écrit :
Et si c'est plus rapide sur TI-84 c'est simplement qu'en général on laisse les programmes dont on se sert peu dans l'archive --> beaucoup de RAM dispo. Comme tu n'as pas de flash sur TI-82 j'te laisse imaginer
Faux.
C'est surtout une différence de processeur, la 82 est cadencée a 6MHz, la 84+ à 15MHz, soit plus du double.
The K le 22/06/2012 à 13:04
Ça vient pas également de la RAM disponible ?
Et les 84+ dont tu parles ne sont-elles pas les anciennes à 48Ko de RAM ? Les récentes (dont la mienne) n'en ont que la moitié ...Persalteas le 22/06/2012 à 13:20
La différence de RAM libre vient de l'OS je crois (pas sur).
Les anciennes avec l'OS 2.43 (sans mathprint) en ont plus.
La tienne avec le nouvel OS 2.53Mathprint est plus gourmand en mémoire.
Mais les nouvelles ont aussi le processeur en 15MHz, j'en suis certain.Samos le 22/06/2012 à 16:29
Et pour le snake vous avez des idées pour éviter de se retrouver avec des listes ultralongues? ^^blg_flg le 22/06/2012 à 16:59
Tu dois pouvoir faire ça avec des matrices, je pense. Mais je ne sais pas si ça change bcp. De toute façon la longueur des listes peut être énorme.F-BVXT le 22/06/2012 à 17:29
Tu peux m'expliquer ton programme parce que j'ai pas tous compris là :
Code
0->G
:Lbl 1
:M+1->M //M est égale à combien à l'origine ?
:Pt-Off(B,C
:entAleat(-10,10->B
:entAleat(-10,10->C
:Pt-On(B,C
:Repeat B=X et Y=C
:G+1->G
:X+K->K //qu'est-ce que représente K ?
:Y+L->L //qu'est-ce que représente L ?
:Pt-off(L1(G-M),L2(G-M //M doit donc toujours être inférieur à G mais ici G=0
:X->L1(G
:Y->L2(G
:L1(G->L1(G-1 //G=1 donc G-1=0 ça te fait une erreur non ?
:L2(G->L2(G-1
:Pt-on(L1(G),L2(G
:End
Si j'ai bien compris, L1 et L2, tu t'en sert pour les coordonnées du serpent. Dans ce cas, le grand ralentissement vient selon moi du fait que tu garde des nombres inutiles dans tes listes au lieux de les supprimer au fur et à mesure.
Samos le 22/06/2012 à 17:53
Je vais faire vite et simple
M c'est le compteur de pomme mangées (le programme est pas fini la, tu peu voir la partie presque complete page1)
K et L sont les incréments de X et Y, déterminés par codetouche
Pour G=0 c'est sensé me faire erreur mais en fait je l'ai commencé a 1 sur ma calculatrice et j'ai mal recopié
1->G
puis l'incrémentation donc au final Gmin=2
Au niveau de la vitesse j'avoue il va pas super vite mais pour l'instant la différence de vitesse entre le début et la fin ne se remarque pas troplinkakro le 22/06/2012 à 19:35
Pour accélérer le programme il faut réduire radicalement le poids des instructions
ou changer de structure.
La structure que j'ai posté précédemment est relativement simple mais est loin d'être la plus rapide...
Tu as écrit quelque chose de débile :
Code
:X+K->K // à remplacer par X+K->X
:Y+L->L // à remplacer par Y+L->Y
Cet été je prendrai peut-être le temps d'enfin rassembler les méthodes que j'ai trouvé ou constaté pour des structures de snakes.
( Je devrais d'ailleurs terminer le snake que j'ai bacclé pour le Ti-Concours.
Il est incomplet mais extrèmement rapide. )
( Moi j'ai longement étudié les snakes de vibra et ratuss, j'ai presque tout compris (après des heures de lecture)
Donc si cela vous prend de poser des question à leur propos je peux me pencher à nouveau dessus. )
The K le 22/06/2012 à 21:03
Je ne connais pas celui de vibra ... Je devrais aller jeter un coup d'oeil ... Hé dites qqun (je pense surtout aux anciens ^^) sait si coc5 en à fait un de snake ? Parce vu moment il programmait ses trucs (j'ai son pong contre IA) c'était impressionnant ...Samos le 22/06/2012 à 22:04
pour le X+K->K c’était juste un erreur de recopiage bon je vais essayer de copier sur les autres!The K le 22/06/2012 à 23:24
Pour corriger tes erreurs de frappe il y a un bouton "editer" en haut adroite de ton post

F-BVXT le 22/06/2012 à 23:58
Non mais ce qui ralentit ton programme c'est le fait que tes listes L1 et L2 augmentent à l'infini (999 chacune en fait avant de tomber sur une Erreur : Dim Invalide). Il faudrait donc que les dimensions de chacune soit de la taille du serpent.
Linkakro t'avait dit
plus haut d'utiliser un bug de la TI. Ici, tu peux l'utiliser en remplissant une nouvelle liste L3 de 0. De plus, pour ne pas ralentir avec une nouvelle liste, il faut que ses dimensions augmentent à chaque fois que le serpent à manger une pomme.
Une fois que t'as fait ça, tu mets quelque chose comme ça dans ta boucle :
Code
M+?->dim(L1
M+?->dim(L2
M+?->dim(L3 //Les ? représente la taille initiale du serpent
Repeat...
...
Tricroi(L3,L1
Tricroi(L3,L2
X->L1(M+? //Dans ce cas, ton serpent augmente d'un point à chaque fois que tu manges une pomme
Y->L2(M+? et sa taille initiale est de ?
Bon, vu l'heure j'ai peut être fait une bêtise mais l'idée est là
Sinon, dans un snake quand on appuie sur aucune touche, le serpent "continue sur sa lancée". Et oui, sinon tu n'as qu'à t'arrêter quand il y a une pomme un peu plus dur à attraper mais le jeux serait pas très amusant.
Donc je te conseille d'ajouter ça ou quelque chose de semblable dans ton programme :
Code
If non(A:G->A //G pourrait être n'importe quelle variable mais avec la
méthode décrite au-dessus, tu ne devrait plus en avoir besoin donc j'ai pris G
.5(A=25)-.5(A=34->L //Ca remplace les conditions que tu as mis à l'origine et est plus rapide
.5(A=26)-.5(A=24->K
A->G
Samos le 23/06/2012 à 12:09
Tricroi(L3,L1
Tricroi(L3,L2
Je n'ai pas très bien compris a quoi ça sert, ce sont les coordonnées du snake d’ailleurs ça me met ERREUR DIM dessus
sinon l'idée pour le faire avancer est super

sandro le 23/06/2012 à 12:16
si tu as un erreur dim, c'est soit qu'une des listes est vide, soit qu'elles n'ont pas toute la même dimentionF-BVXT le 23/06/2012 à 12:19
L'erreur dim vient probablement du fait que L3 n'a pas les mêmes dimensions que L1 et L2.
Sinon, pour que tu comprennes bien à quoi sert ce "bug", essaie dans l'écran principal : en fait, quand L3 est remplie de 0 ça décale tous les termes de L1 et L2 vers la gauche

(oui regarde dans essaie dans l'écran principal et tu verras

). Donc le but c'est de ne modifier que le dernier terme de L1 et L2 qui vont être modifiés à chaque fois que le serpent avance.
Samos le 23/06/2012 à 12:30

ça déchire! enfin un snake qui fonctionne correctement et je comprend
comment!
Bon après je ne pourrai pas me vanter de l'avoir fait tout seul
Il faut aussi rajouter
0->L3(M+1
Merci a tous de votre aide

F-BVXT le 23/06/2012 à 12:34
Citation
Il faut aussi rajouter
0->L3(M+1
Met plutôt M+1->dim(L3
Vu que tu n'édites pas les termes de L3 ça revient ua même mais tu gagnes 1 octet
Sinon, comme tu utilises la fonction Pt et non Pxl, tu peux ajouter ",2" à la fin pour que ce ne soit pas des points mais des petits carrés qui composent le serpent. Persalteas décrit cette fonction dans un de ses
articles.
The K le 23/06/2012 à 13:31
Tu peux aussi limiter la taille des listes de ton snake dès le départ, du genre 99->dim(L1 etc. Ou une condition du genre If L1(100:PauseF-BVXT le 23/06/2012 à 13:34
Pour quoi faire ?
Si le serpent est plus grand et qu'il est en train de "péter un score" ça serait quand même bête de l'arrêter, non ?The K le 23/06/2012 à 13:36
Je suis d'accord. 99 et 100 n'étaient que des exemples ...
Il faut trouver le juste milieu

F-BVXT le 23/06/2012 à 13:53
Donc si j'ai bien compris, tu veux définir la taille de la liste dès le départ ?
Dans ce cas, je pense pas que ça soit une bonne idée parce que les listes prendraient énormément de mémoire dès le début et soit elles en prendront plus qu'avec la méthode que j'ai décrite à la page précédente, soit elles en prendront moins mais dans ce cas le jeux s'arrête et le joueur se retrouve pénalisé...blg_flg le 23/06/2012 à 14:07
Peut-être que définir les tailles des listes au départ ne ralentiraient pas le snake dès le début?Samos le 23/06/2012 à 14:12
Je crois que je vais reprend le snake de une case au moin il ralentissait pas et il n'y avait pas à se casser la tête

F-BVXT le 23/06/2012 à 15:10
Citation
Je crois que je vais reprend le snake de une case au moin il ralentissait pas et il n'y avait pas à se casser la tête
Si tu veux mais dans ce cas n'appelle pas ça un snake mais un point qui bouge
Plus sérieusement, utilise la méthode que je t'avais montré à la page précédente qui marche.
The K le 23/06/2012 à 15:19
Ça ne ralentirait pas tant que ça des listes prédéfinies au contraire ! Tu aurais ça de moins à faire (incrémenter les listes) dans la boucle principale. Et si tu me crois pas ben va test le snake de Ratuss

F-BVXT le 23/06/2012 à 15:24
Ca peut ne pas ralentir si on modifie bien le dernier terme de la liste à chaque fois et non toute la liste. Mais par contre la difficulté au niveau des calculs à faire pour estimer la taille des listes...

linkakro le 23/06/2012 à 16:05
La méthode de permutation que je vous ai montré est le gros problème en fait, car toute la liste est manipulée à chaque boucle, ce qui ralentit nécessairement !
L'astuce avec SortA() est intégrée à l'os donc est plus rapide que mon exemple explicite, mais cela ralentit quand même progressivement avec la longueur.
L'autre structure que je connais consiste à utiliser un "pointeur", une référence de position variable dans une liste fixe (on déplace la référence au lieu de déplacer le contenu de la liste).
Ainsi la longueur de la liste n'a aucune influence.
Voici un extrait de mon dernier snake :
Code
Repeat K
Y+A-63int((Y+A)/63->Y
X+B-96int((X+B)/96->X
If pxl-Test(Y,X-1
Then
If X-J and Y-I
Return
Pt-Off(X,-Y
Repeat not(pxl-Test(I,J-1
1+3randInt(0,20->I
1+3randInt(0,31->J
End
Pt-On(J,-I,3
N+1->N
99->L1(N // La commande d'effacement suivante sera en dehors de l'écran.
99->L2(N // On retarde un effacement, d'où (
) un allongement.
End
M+1->M
If M=N+1
1->M
Pt-Off(L2(M),-L1(M),2 // effacement d'une queue
Pt-On(X,-Y,2 // affichage d'une tête
X->L2(M
Y->L1(M
getKey->K
End
// ici est effectué le changement de direction, la pause, ...code édité le 24juin avec quelques autres commentaires
F-BVXT le 23/06/2012 à 16:26
Ah oui, je ne connaissais pas du tout cette méthode.
Du coup, ça m'a fait pensé à quelque chose, ne calculer que les coordonnées de la "tête" et effacer les points X+K(M+1 et Y+L(M+1. Je pense que c'est faisable vu qu'il n'y a que la tête qui peut faire perdre le joueur (rentrer en contact avec les parois ou avec le serpent lui-même).
Ca accélérerait sacrément le jeux ça, non ?Samos le 24/06/2012 à 11:50
Je doit avoir un problème ou alors mon niveau est loin du votre mais je ne comprend (presque) jamais les programmes de Linkakro
d'ailleurs j'ai comme l'impression que mon niveau en ti basic régresse
Si on presse une touche la boucle ne se répète plus?
63/96 correspondent aux dimensions de l'écran à quoi servent-ils?
If pxl-test(Y,X-1 pourquoi X-1
"return" c'etait un sous programme? ^^
pareil pourquoi -Y dans pt-off(X,-Y
99->L1(N 99 est une valeur spéciale ou un nombre qui paraissait etre un juste milieu?
je crois avoir presque tout demandé, il y a tellement de négatifs que je ne m'y retrouve plus
peu-être que si je faisais quelques efforts sa passerai mieu

Avertissement :Il s'agit d'une page optimisée pour la navigation mobile. Voir la
page originale.