Forum

Catégorie : Programmes
Forum : Les programmes des internautes
Vues : 6063
Réponses : 63
Type : discussion
Etat : réponses autorisées

Morpion-3D - Page 1 / 4

Persalteas le 13/04/2012 à 17:13
Voilà, je vous poste le code de mon dernier morpion de 3000 octets environ, qui a récement remporté la deuxième place au TI-Concours 2012 happy.gif


Ce programme était fait à la base pour TI 83+, j'ai donc du un peu modifier le code pour qu'il fonctionne sur TI-82 Stats (fr). (l'image animée est celle de 83+, le programme est légèrement différent (au niveau du titre et au niveau de la vitesse de chargement des cercles en 3D)

Image manquante


lien de téléchargement version 83+

(pour transformer la version 83+ en 82 stats, remplacez les minuscules par des majuscules, et supprimez les {i , comme dans le code ci-dessous: )


Ce code est plutôt compliqué a recopier, (en code anglais en plus), si vous ne trouvez pas une fonction ou une lettre, n'hésitez pas a demander.


Code

:FnOff
:AxesOff
:0->Xmin:94->Xmax
:0->Ymin:62->Ymax
:ClrDraw
:Horizontal 0
:Vertical 0
:Horizontal 62
:Vertical 94
:Vertical 1
:Vertical 93
:Line(0,60,20,60
:Line(74,35,94,35
:"        M o r p i o n->Str1
:For(A,1,94,2
:Pt-Off(A,60
:Pt-Off(A+1,60
:Pt-Off(94-A,35
:Pt-Off(95-A,35
:Pt-On(A+20,60
:Pt-On(A+21,60
:Pt-On(74-A,35
:Pt-On(75-A,35
:If A<8:Then
:For(B,0,2
:Text(4,4A+25+B,sub(Str1,A,1
:End
:End
:If A>7 and A<23:Then
:For(B,0,2
:Text(14,4A+B-18,sub(Str1,A,1
:End
:End
:If A=75:Text(54,20,"(c) persa1teas
:End
:Horizontal 60
:Horizontal 35
:Horizontal 34
:Line(8,9,86,9
:Line(8,28,86,28:Line(86,9,86,28
:Line(8,9,8,28
:Pt-On(20,14,2
:Pt-On(20,23,2
:Text(36,26,"JOUEUR / JOUEUR
:Text(44,26,"JOUEUR / TI
:23->C
:Repeat K=105
:getKey->K
:Pt-Off(20,C
:C+9(K=25 and C=14)-9(K=34 and C=23->C
:Pt-On(20,C
:69!:69!:69!
:End
:If C=14:1->W
:If C=23:0->W
:0->S:0->R
:1->P:0->V
:Lbl Z
:0->Y
:ClrDraw
:If not(V:Then
:For(C,1,12
:If C=1:{3,42,21,42,21,58,24,58,24,42,41,42,41,58,44,58,44,42,62,42
:If C=2:{62,42,62,39,44,39,44,22,62,22,62,19,44,19,44,2,41,2,41,19,24,19
:If C=3:{24,19,24,2,21,2,21,19,3,19,3,22,21,22,21,39,3,39,3,42
:If C=4:{24,39,41,39,41,22,24,22,24,39
:If C=5:{3,42,5,44,21,44
:If C=6:{3,22,5,24,20,24
:If C=7:{24,2,26,4,26,19
:If C=8:{44,2,46,4,46,18
:If C=9:{26,39,26,24,41,24
:If C=10:{46,39,46,24,64,24,64,21,62,19
:If C=11:{41,58,43,60,46,60,46,44,64,44,64,41,62,39
:If C=12:{21,58,23,60,26,60,26,44,40,44
:For(D,1,dim(Ans)-3,2
:Line(Ans(D),Ans(D+1),Ans(D+2),Ans(D+3
:End
:End
:{25,59,45,59,25,43,45,43,63,43,25,23,45,23,63,23
:For(D,1,16,2
:Pt-On(Ans(D),Ans(D+1
:End
:{67,9,67,52,69,54,93,54,93,11,91,9,91,52,92,53
:For(C,1,13,2
:Line(Ans(C),Ans(C+1),Ans(C+2),Ans(C+3
:End
:{52,37,27,23,13,9
:For(C,1,6
:Line(67,Ans(C),91,Ans(C
:End
:Text(11,69,"Partie
:Text(26,69,"J1.
:If not(W:Text(40,69,"J2.
:If W:Text(40,69,"TI.
:StorePic 6
:1->V
:Else
:RecallPic 6
:End
:Text(17,75,P
:Text(27,80,S
:Text(41,80,R
:1->C:1->D
:2->A:2->B
:0->T
:If fPart(P.5:1->T
:{3,3->dim([A]
:Fill(0,[A]
:Repeat 0
:getKey->K
:A->C
:B->D
:If T or not(W:Then
:B-(K=24)+(K=26->B
:A-(K=34)+(K=25->A
:End
:If not(A:3->A
:If A=4:1->A
:If not(B:3->B
:If B=4:1->B
:Line(69,29,77,29,T
:Line(69,15,77,15,not(T
:Pt-Off(20D-7,20C-9,3
:If T or not(W:Pt-On(20B-7,20A-9,3
:If Wnot(T:Then
:Matr>list([A],L1,L2,L3                    // L1, L2 etc... sont les listes
:Matr>list([A]{^T},L4,L5,L6                // le {^T} est le petit T du menu [matrice]
:0->M:0->N
:For(K,1,6
:If K=1:L1
:If K=2:L2
:If K=3:L3
:If K=4:L4
:If K=5:L5
:If K=6:L6
:Ans->L1
:abs(sum(DeltaList(L1->L
:If (sum(L1)=4 and L=2) or (sum(L1)=2 and (L=1 or not(L:Then
:For(J,1,3
:If not(L1(J:J->N
:End
:1->M
:If K<4:Then
:K->B
:N->A
:Else
:K-3->A
:N->B
:End
:End
:If sum(L1)=4 and L=2:7->K
:End
:If not(M:Then
:Lbl V
:randInt(1,3->A
:randInt(1,3->B
:If [A](A,B:Goto V
:End
:105->K
:End
:If K=45:Goto Q
:If K=105 and [A](A,B:0->K
:If K=105 and T:Then
:1->[A](A,B
:20A-13->C
:20B-13->D
:For(J,1,4
:If J=1:{4,4,0,0,3,0,6,3,9,0,12,0,8,4
:If J=2:{4,5,0,9,3,9,6,6,9,9,12,9,8,5
:If J=3:{1,10,4,10,6,8
:For(L,1,dim(Ans)-3,2
:Line(D+Ans(L),C+Ans(L+1),D+Ans(L+2),C+Ans(L+3
:End:End
:Line(D+9,C+5,D+13,C+1
:Line(D+10,C+10,D+13,C+10
:End
:If K=105 and not(T:Then
:20A-15->C
:20B-14->D
:Circle(D+7,C+7,5
:Circle(D+6,C+6,5
:Circle(D+6,C+6,3
:Line(D+7,C+2,D+5,C+2,0
:Line(D+2,C+5,D+2,C+8,0
:2->[A](A,B
:End
:If K=105:not(T->T
:[A](1,1->J
:[A](1,2->K
:[A](1,3->L
:[A](2,1->M
:[A](2,2->E
:[A](2,3->F
:[A](3,1->G
:[A](3,2->H
:[A](3,3->I
:If JKL=1 or MEF=1 or GHI=1 or JMG=1 or KEH=1 or LFI=1 or JEI=1 or LEG=1:Then
:Line(0,11,94,11
:For(K,12,50
:Line(0,K,94,K,0
:End
:Line(0,50,94,50
:Text(28,20,"JOUEUR 1 GAGNE!
:P+1->P
:S+1->S
:1->Y
:Pause
:End
:If JKL=8 or MEF=8 or GHI=8 or JMG=8 or KEH=8 or LFI=8 or JEI=8 or LEG=8:Then
:Line(0,11,94,11
:For(K,12,50
:Line(0,K,94,K,0
:End
:Line(0,50,94,50
:If not(W:Text(28,20,"JOUEUR 2 GAGNE !
:If W:Then
:Text(24,15,"COMME QUOI UNE TI
:Text(31,11,"VAUT BIEN UN CERVEAU
:Text(38,30,"HUMAIN !
:End
:P+1->P
:R+1->R
:1->Y
:Pause
:End
:If J+K+L+M+E+F+G+H+I>=13 and not(Y:Then
:Line(0,11,94,11
:For(K,12,50
:Line(0,K,94,K,0
:End
:Line(0,50,94,50
:Text(28,32,"Fai1ed  =P
:P+1->P
:1->Y
:Pause
:End
:If Y:Goto Z
:End
:Lbl Q
:ClrDraw
:ClrHome
:ZStandard
:AxesOn
:DelVar [A]DelVar Pic6DelVar L1DelVar L2DelVar L3DelVar L4DelVar L5DelVar L6
:Output(1,1,"   MOrpiOn-3D   by persa1teas.


Encore une fois, ce code est difficile a recopier puisqu'il est en anglais. N'hésitez pas a poser des questions.

je rappelle à tout hasard que mon catalogue du TI Basic est très utile pour traduire et trouver les fonctions. glasses.gif
The K le 14/04/2012 à 11:01
Bah mon coco ...j'te dis bravo xD
Déja que moi je peine a faire un morpion tout simple alors la ... j'serai toujours bluffé x')

(ah euh aussi le code que tu as posté ne marche pas sur TI-82/82-stats etc ... j'ai vu notamment un "Text(-1,..." et ça je crois pas que ça marche si ?)
Persalteas le 14/04/2012 à 11:59
EXACT j'ai oublié de l'enlever.

J'édite mon message. Il faut enlever le "-1,"

Est-ce qu'un Sandro/Linka/Sangohan (ou un autre ^^ ) trouve quelque chose a optimiser, par hasard ?
linkakro le 14/04/2012 à 12:43
Je suis blousé par ton usage de Ans en tant que liste.
Aussi loin que je me souvienne, mes essais n'étaient pas concluants. cry.gif
C'est déjà un bon point pour toi. happy.gif persi= glasses.gif

J'aime bien ton usage de la transposition de matrice, même si je n'ai pas encore saisi toutes les subtilités.

J'ai oublié à quoi sert DeltaList mais je sais qu'on a déjà discuté de ça avec sandro pour les recherches de valeurs.

L'usage des listes et des For pour les tests sont bien fichus mais personnellement je préfère le test barbare en argument d'un Repeat. (cela me paraît plus léger mais ça reste à vérifier)

J'aime bien le commentaire de victoire de la TI. laugh.gif

Je ne voie pas par où commencer pour une hypothétique optimisation car c'est déjà dense. Je pense que c'est déjà très bien comme c'est maintenant.
Persalteas le 14/04/2012 à 15:18
Citation
L'usage des listes et des For pour les tests sont bien fichus mais personnellement je préfère le test barbare en argument d'un Repeat. (cela me paraît plus léger mais ça reste à vérifier)


ça, c'est mon IA, c'est pas le test de victoire... Personnellement c'est le seul moyen a peu près léger que j'ai trouvé... Comment tu ferais ? (si t'as la flemme de répondre, j'irai voir ton morpion a toi...)

Et sinon DeltaList c'est toi qui m'a appris a quoi elle sert happy.gif

ça ressort l'intervalle entre chaque valeur. C'est donc une liste avec une dimension de 1 de moins.

exemple:

DeltaList({0,2,6,1,-4,-2} = {2,4,-5,-5,2}
linkakro le 14/04/2012 à 17:44
Je n'ai pas écrit de bonne IA et je n'en ai pas mis dans mon morpion.
Je ne l'ai même pas finit.
Ce que j'avais bidouillé contenait des For pour passer en revue chaque ligne et chaque colonne, et les positions dans chaque ligne/colonne étaient gérées de façon barbare dans des If.
Ainsi chaque If teste une ligne, une colonne ou une diagonale et les For passent tout en revue.
Et un For autour du tout pour tester d'abord les positions qui complètent des lignes puis celles qui bloquent l'adeversaire.
J'ai commencé à m'embrouiller lorsque j'ai voulu que la calculatrice choisisse en priorité les positions qui font d'une pierre deux coup.
Quelques cas de figure supplémentaires seraient la cerise sur le gateau.

Et ce qui m'a manqué est la transposition de matrice, que toi tu as utilisé.

J'ai bien dit que mon goût pour la barbarie de If m'est personnelle, et ce n'est pas forcément la meilleure méthode.
Et puis chaque programmeur a sa façon de faire, c'est ce qui rend la programmation originale. winkle.gif
sandro le 14/04/2012 à 18:01
Citation
Code
Text(36,26,"JOUEUR / JOUEUR
:Text(44,26,"JOUEUR / TI
:23->C
:Repeat K=105
:getKey->            //il manquerait pas une variable ici???
:Pt-Off(20,C


Code
:If sum(L1)=4 and L=2:7->K
peut devenir
Code
:If L=2 and 4=sum(L1
:7->K


Sandro
Persalteas le 14/04/2012 à 21:29
Waw, alors là Sandro, je suis épaté beer.gif

Je ne m'attendais sérieusement pas à un oubli ridicule de ce genre, pourquoi n'y ai-je pas pensé...

et sinon, la variable manquante, c'est un K, bien sur.
The K le 14/04/2012 à 21:35
Code
:If Wnot(T:Then


C'est pas une coquille ça ?
Persalteas le 14/04/2012 à 21:37
Qu'est-ce que tu entends par une coquille ?

en tout cas cette ligne est telle que je la voulais, c'est un calcul avec des booléens.
The K le 14/04/2012 à 21:41
Ah très bien.

*s'enfonce encore un peu plus*

Non je pensais que c'était peut-être un If W et non(T:Then j'ai pensé après coup à la multiplication. minied.gif
sandro le 14/04/2012 à 22:27
autre optimisation : remplace :69!:69!:69! par rand(N ou N est un entier : ça te tire une liste de N nombres rand et ça ralentit donc aussi.

EDIT : encore une :
Code
:0->T
:If fPart(P.5:1->T

devient
Code
:DelVar TIf fPart(P.5:1->T


EDIT2 :
Code
:DelVar [A]DelVar Pic6DelVar L1DelVar L2DelVar L3DelVar L4DelVar L5DelVar L6
:Output(1,1,"   MOrpiOn-3D   by persa1teas.

Devient
Code
:DelVar [A]DelVar Pic6DelVar L1DelVar L2DelVar L3DelVar L4DelVar L5DelVar L6Output(1,1,"   MOrpiOn-3D   by persa1teas.
Persalteas le 14/04/2012 à 22:46
En effet, j'avais essayé les delvar (parce que sourcecoder me l'avait dit), mais la TI me donnait des erreurs "invalide", alors je les ai retirés.

Et puis ça tue la lisibilité.

sinon, faudrait que je teste rand(N, j'ai jamais essayé, ça peut être utile.


pas grave, the K happy.gif
linkakro le 15/04/2012 à 00:15
Un DelVar pour les listes L1 à L6 est pour moi une bêtise car cela perturbe le menu stat>edit, et que les listes L1 à L6 sont incontournables.
Je préfère largement écrire " ClrList L1,L2,L3,L4,L5,L6 " plutôt que la série de DelVar.
tapenad le 15/04/2012 à 00:16
la classe le morpion ( ça doit presque pouvoir çe vendre des jeux comme ça godgrace.gif )
sandro le 15/04/2012 à 15:01
pas sur, TI essaye bien pour certaines applications pour la TI83+, mais la concurence de la communotée est tout simplement trop forte. Donc de là à vendre un morpion ...
A la limite, il y en a qui vendent des livres et/ou CDs avec des programmes, mais là il y en a des dizzaines, et généralement bien expliqués.

Sandro
tapenad le 15/04/2012 à 15:06
je pensais plutôt à pigeonner un kikoo de ma classe qui s'ennuie en cours de math
Persalteas le 15/04/2012 à 18:24
Eh ben tu peux.

Je me suis fait 122,30 euros en 4 ans avec des programmes (et j'ai perdu 44 amis tongue.gif )

80 euros en seconde (principalement avec Herssahe), 12 euros 30 en première avec de divers trucs, et la fin en vendant des programmes a ceux qui flippaient au moment des bacs de physique/maths, ce sont des clients faciles godgrace.gif

(j'espère au moins les avoir aidés ^^ )

Je t'autorise a vendre mon programme a condition que ce soit hors de Rhône-Alpes, et que ce soit de TI à TI, pas en passant par internet, et que tu ne dises pas que c'est toi qui l'a fait, bien sur winkle.gif
tapenad le 15/04/2012 à 18:28
pourquoi hors Rhone-Alpes!!! j'habite dans cette région! et comment tu vas vérifier si je le fais sur internet ou en disant que c'est moi qui l'a crée! godgrace.gif
Persalteas le 15/04/2012 à 21:19
Comme si j'allais te dire comment je vais vérifier...

Il suffirait que je te le dise pour que tu trouves le moyen de passer outre mes yeux-de-Sauron.

Eh ben désolé, tu ne les vends pas en Rhone-Alpes, c'est MOI qui assure le commerce de mes programmes dans cette région tongue.gif
Ou sinon, je veux 20% de tes recettes. winkle.gif
A prendre ou à laisser.

(en plus je suis bête tu me l'avais dit par mail ou tu habitais... j'aurais du m'en douter.)