Autorisation : Membre
Nb de messages : 122
Inscrit le : Sam 23 Avr 2011, 10:47
Posté le : Ven 06 Mai 2011, 19:13
Bonjour a tous a la demande de Patate007 sut le chat de fofo dont voici le lien http://tchat-tout82.webuda.com/(ben oui ya jamais personne )
Bon je note ici mon 1er vrai jeu, un pong qui se joue seul.
Edit: Il fait 637 octets
RE EDIT: Ici il fait un peu moins je lai condensé jai enleve tous les menu, high score etc.
Code
lbl A
1->0
-1->P
0->S
-1>M
entaleat(0,1)->N
if N=0:-1->N
5->A
7->C
8->D
While 1=1
effecran
output(8,15,S
if A<1:1->A
output(7,A,"----"
output(C,D,"°
C+M->C
D+N->D
if C=1:1->M
if C=7 et D=A ou C=7 et D=A+1 ou C=7 et D=A+2 ou C=7 et D=A+3:then
P->M
S+1->S
End
if C=8 et D=!A ou C=8 et D=!A+1 ou C=8 et D=! A+2 ou C=8 et D=!A+3:then
disp"partie terminée
disp"Score=",S
Pause
menu("reessayer?","oui",A,"non",Q
Lbl Q
Effecran
stop
end
if A>12:12->A
if D=16:P->N
if D=1:0->N
codetouche->K
if K=24:A-1->A
if K=26:A+1->A
end
Voila, merci de me dire vos commentaires Et surtout de me soumettre les multiples ameliorations possibles.
Voili voilou
Autorisation : Membre
Nb de messages : 103
Inscrit le : Mar 09 Fév 2010, 8:49
Posté le : Ven 06 Mai 2011, 20:53
Salut Tilo !
Je viens de le tester, il marche très bien !
Cependant je ferai quelques petites retouches.
Commençons par la deuxième ligne ? Elle ne sert à rien visiblement ? Hop, -3 octets !
Ensuite le While 1=1, on peut mettre tout simplement While 1. -2 octets.
La deuxième condition. Au finale, on peut la racourcir par If C=8:Then
Voilà pour le recourcicement
Ensuite les améliorations :
Les 2 longues conditions avec un Then, il me semble qu'elle ralentissent le programme au cours du temps... Pour éviter le Then, tu pourrai mettre qu'une seule chose à l'interieur : un goto, qui enverrai à l'extérieur de la boucle, ensuite les instruction pour un goto vers le début de la boucle
Ensuite, tu pourrais rendre l'affichage du score final plus joli avec un Output, non ?
Et enfin, Ce qui serai génial, c'est que la boule parte à gauche ou à droite selon le point d'inpacte avec la barre =D Je te laisse chercher
J'espère que j'ai été clair, en tous cas, félicitation pour ce programme !
Autorisation : Membre
Nb de messages : 122
Inscrit le : Sam 23 Avr 2011, 10:47
Posté le : Ven 06 Mai 2011, 21:02
Je prends note, je modifie sur ma calto en meme temps ^^. J'ajoute quand meme que jai condensé le programe que je vien de recopier. Au debut ya une petite présentation avec le meilleur score et le nom du meilleur "scoreur"
Ensuite pour la condition je ne vois ABSOLUMENT pas ou tu veux en venir
Et enfin pour le rebond je pense qu'en ajoutant une ligne ou deux pour la condition precedente serait suffisant
Voila, merci pour tout il va deja plus vite rien qu'en remplacant ma looooongue condition par If C=8 ^^
Autorisation : Membre
Nb de messages : 103
Inscrit le : Mar 09 Fév 2010, 8:49
Posté le : Ven 06 Mai 2011, 21:39
Pour la condition, j'ai entendu dire que mettre un then dans une boucle ralentissait peu à peu le programme. Pour y remédier il suffit de mettre juste un goto dans la condition (donc une seule ligne, pas de then) ce goto enverra vers les commandes à exécuter en dehors de la boucle.
:0->A
:10->B
:
:Lbl 1
:While 1
:If A=B:Goto A
:A+1->A
:End
:
:Lbl A
:Disp A
:B+10->B
:Goto 1
Ces deux codes permettent de compter jusqu'à 10. C'est un programme inutile et bien plus facilement réalisable mais je le fait fonctionner de cette manière pour l'exemple.
Le premier prend un peu moins de place. Cependant, le 2ème évite le ralentissement du programme (à long terme).
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 06 Mai 2011, 23:00
Tu viens de créer un ralentissement pire que celui que tu voulais éviter car le goto est à l'intérieur d'un while ! C'est la pire cause de ralentissement !
Hormis le coup du goto, c'est vrai que les Then sont un peu lents.
D'autre part, si le programme est très gros, ce sont les goto qui ralentiront le plus (dans une boucle ou non).
Je n'ai pas vraiment le temps de me pencher sur le prog mais je suis d'accord avec ce que tu as globalement proposé.
---------------------- 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 : 122
Inscrit le : Sam 23 Avr 2011, 10:47
Posté le : Sam 07 Mai 2011, 7:27
Deja jajoute que la 2eme ligne sert mais pour UNE ligne de programme Il s'agit de la ligne avant celle ou je definis K
Voila, maintenant la version 2 qui gere la direction des rebonds sur la palette
Code
lbl A
-1->P
1->O
0->S
-1->M
entaleat(0,1)->N
if N=0:-1->N
5->A
7->C
8->D
While 1
effecran
output(8,15,S
if A<1:1->A
output(7,A,"----
output(C,D,"°
C+M->C
D+N->D
If C=1:1->M
If C=7 et D=A ou C=7 et D=A+1:then
P->M
entaleat(1,10)->F
if F=1;then
S+10->S
output(8,2,"critique!
Else
S+1->S
End
-1->N
End
If C=7 et D=A+2 ou C=7 et D=A+3:then
P->M
entaleat(1,10)->F
If F=1:then
S+10->S
output(8,3,"critique!
Else
S+1->S
End
1->N
End
If C=8:Then
Effecran
Disp"Partie terminée
Disp"score=
output(2,7,S
Pause
Menu("réessayer?","oui",A,"non",Q
Lbl Q
effecran
stop
end
If A<12:12->A
If D=16;P->N
If D=1:O->N
codetouche->K
If K=24:A-1->A
If K=26:A+1->A
End
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 08 Mai 2011, 22:18
C'est globalement bon mais j'ai rencontré des problèmes sur lesquels je ne me suis pas attardé malgré que j'en sois sûrement responsable.
Quit à bidouiller, j'ai conçu cette version : Edit= j'ai ajoûté des commentaires pour limiter le besoin de se reporter aux messages suivants.
Code
Lbl A
0->S
-1->M
2randInt(0,1)-1->N //N vaut 1 ou 0
5->A
7->C
8->D
While 1
ClrHome
Output(8,15,S
Output(7,A,"----
Output(C,D,"°
If C=7 and abs(A+1.5-D)<2:Then //balle sur raquette (distance centre-balle inférieure à 2)
-1->M
9not(randInt(0,9->F //vaut 9 si randint=0 ou vaut 0 si randint=/=0
S+1+F->S //S+1 ou S+10
If F:Output(8,2,"CRITIQUE
2(A+1.5-D<0)-1->N //vaut 1 si balle à droite et 0 si gauche
End
If C=8:Goto Z
If C=1:1->M
If D=16 or D=1:-N->N
getKey->K
If K=24:A-1->A
If K=26:A+1->A
max(1,min(13,A->A //A confiné entre 1 et 13
C+M->C
D+N->D
End
Lbl Z
ClrHome
Disp "GAME OVER
Disp "SCORE=
Output(2,7,S
Pause
Menu("REESAYER?","OUI",A,"NON",Q
Lbl Q
ClrHome
PS à PATATE007 : Tant qu'il y aura un while, le problème du goto/end se posera. Toutefois le ralentissement est négligeable (uniquement à chaque game over) comparé au gain de temps du simple while sur toute la durée.
Mes dernières remarques étaient excessives.
---------------------- 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 : 122
Inscrit le : Sam 23 Avr 2011, 10:47
Posté le : Lun 09 Mai 2011, 18:25
Ouh la je ne comprends pas tout ...
principalement le 2eme "paragraphe" avec la fonction abs( ainsi que la ligne
9not(randind(0,9->F
ainsi que cette ligne (decidemanet )
2(A+1.5-D<0)-1->N
et puis celle ci vers la fin du programme
max(1,min(13,A->A
Voila, Merci d'avance pour expliciter le fonctionnement de ces fonctions
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Lun 09 Mai 2011, 21:15
C'est vrai que j'ai cumulé pas mal d'astuces.
abs(A+1.5-D)<2
abs est la valeur absolu. Ici elle donne la distance entre la balle (D) et le centre de la raquette (A+1.5). Si la distance est suppérieure ou égale à 2, alors la balle est hors de la raquette. ( inférieur à 2 la balle est dessus)
9not(randInt(0,9->F
L'aléatoire est entre 0 et 9 inclus. S'il est nul, alors not(aleat) vaut 1.
Si L'aléat est nul alors F vaut 9*not(0)=9*1=9. Et S+1+F=S+10 ->S
Sinon F vaut 9*not(z)=9*0=0. Et S+1+F=S+1 ->S
2(A+1.5-D<0)-1->N
A+1.5-D est positif si la balle est à gauche de la raquette. Je le teste entre parenthèse pour obtenir 0 (faux) ou 1 (vrai) selon que A+1.5-D est positif ou négatif (donc selon le côté de la balle).
2*0-1=-1 si balle à gauche
2*1-1=1 si balle à droite
(2X-1 est aussi dans l'initialisation mais avec un aléatoire) (Ici j'aurai aussi pu pratiquer abs(z)/z= 1 ou -1 selon le signe de z.)
max(1,min(13,A->A
Si A<13 alors min(13,A)=A
Si A>13 alors min(13,A)=13
Le min n'agit pas si A<13. Donc pour la suite min(13,A)=A
Si A<1 alors max(1,A)=1
Si A>1 alors max(1,A)=A
Donc A ne peut pas dépasser 1 et 13.
Selon ses goût et le contexte, certaines méthodes ne sont pas les plus recommandées.
---------------------- 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)