Forum

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

Mon morpion éctronique

perimgui le 14/01/2011 à 20:26
Bonjour, j'ai enfin réussi à créer mon propre jeu de morpion qui malheuresement se joue à 2 obligatoirement.

Malgrès cela, il comporte des erreurs et j'aimerais votre avis pour me dire d'ou viennent ces erreurs.

Voici le code :

Code

:Lbl 1
:EffEcr
:Output(1,2,"MORPION TI")
:Output(3,8,"V1.01")
:Output(6,3,"PERIMGUI")
:Pause
:EffEcr
:Lbl 2
:EffEcr
:Menu("MENU","JEU",3,"QUITTER",4)
:Lbl 4
:EffEcr
:Stop
:Lbl 3
:0->J
:0->A
:0->B
:0->C
:0->D
:0->E
:0->F
:0->G
:0->H
:0->I
:1->L
:0->W
:{0,0,0,0,0,0,0,0,0}->L1
:{0,0,0,0,0,0,0,0,0}->L2
:EffEcr
:Input "J1 NOM:",Chaine1
:EffEcr
:Input "J2 NOM:",Chaine2
:EffEcr
:For(T,2,15)
:Output(3,T,"-")
:Output(6,T,"-")
:End
:For(T,1,8)
:Output(T,6,"I")
:Output(T,11,"I")
:End
:Output(3,6,"+")
:Output(3,11,"+")
:Output(6,6,"+")
:Output(6,11,"+")
:While J=0
:If L=1
:Then
:"X"->Chaine3
:2->L
:Else
:If L=2
:Then
:"O"->Chaine3
:1->L
:End
:End
:codeTouche->K
:If K=72
:Then
:If A=1:73->K
:If A=0
:Then
:1->A
:Output(2,3,Chaine3)
:If L=1:1->L2(1)
:If L=2:1->L1(1)
:End
:End
::If K=73
:Then
:If B=1:74->K
:If B=0
:Then
:1->B
:Output(2,8,Chaine3)
:If L=1:1->L2(2)
:If L=2:1->L1(2)
:End
:End
:If K=74
:Then
:If C=1:82->K
:If C=0
:Then
:1->C
:Output(2,13,Chaine3)
:If L=1:1->L2(3)
:If L=2:1->L1(3)
:End
:End
:If K=82
:Then
:If D=1:83->K
:If D=0
:Then
:1->D
:Output(5,3,Chaine3)
:If L=1:1->L2(4)
:If L=2:1->L1(4)
:End
:End
:If K=83
:Then
:If E=1:84->K
:If E=0
:Then
:1->E
:Output(5,8,Chaine3)
:If L=1:1->L2(5)
:If L=2:1->L1(5)
:End
:End
:If K=84
:Then
:If F=1:92->K
:If F=0
:Then
:1->F
:Output(5,13,Chaine3)
:If L=1:1->L2(6)
:If L=2:1->L1(6)
:End
:End
::If K=92
:Then
:If G=1:93->K
:If G=0
:Then
:1->G
:Output(8,3,Chaine3)
:If L=1:1->L2(7)
:If L=2:1->L1(7)
:End
:End
::If K=93
:Then
:If H=1:94->K
:If H=0
:Then
:1->H
:Output(8,8,Chaine3)
:If L=1:1->L2(8)
:If L=2:1->L1(8)
:End
:End
:If K=94
:Then
:If I=1:72->K
:If I=0
:Then
:1->I
:Output(8,13,Chaine3)
:If L=1:1->L2(9)
:If L=2:1->L1(9)
:End
:End
:If L1(1)+L1(2)+L1(3)+L1(4)+L1(5)+L1(6)+L1(7)+L1(8)+L1(9)
+L2(1)+L2(2)+L2(3)+L2(4)+L2(5)+L2(6)+L2(7)+L2(8)+L2(9) = 9
:Then
:1->J
:End
:If L1(1)+L1(2)+L1(3)=3 ou L1(1)+L1(4)+L1(7)=3 ou
 L1(1)+L1(5)+L1(9)=3 ou L1(2)+L1(5)+L1(8)=3 ou
 L1(3)+L1(6)+L1(9)=3 ou L1(3)+L1(5)+L1(7)=3 ou
 L1(4)+L1(5)+L1(6)=3 ou L1(7)+L1(8)+L1(9)=3 ou
 L2(1)+L2(2)+L2(3)=3 ou L2(1)+L2(4)+L2(7)=3 ou
 L2(1)+L2(5)+L2(9)=3 ou L2(2)+L2(5)+L2(8)=3 ou
 L2(3)+L2(6)+L2(9)=3 ou L2(3)+L2(5)+L2(7)=3 ou
 L2(4)+L2(5)+L2(6)=3 ou L2(7)+L2(8)+L2(9)=3
:Then
:1->J
:1->W
:End
:End
:Lbl 8
:EffEcr
:If W=1
:Then
:Output(2,2,"FELICITATIONS")
:If L=1
:Then
:Output(4,2,Chaine2)
:Else
:Output(4,2,Chaine3)
:End
:Pause
:Else
:Output(4,2,"MATCH NUL")
:Pause
:End
:EffEcr
:Menu("REJOUER ?","OUI",3,"NON",4)


Si vous avez des questions, n'hésitez pas !

En espèrant que vous réussirez à trouver des erreurs !
Akmdad le 14/01/2011 à 22:27
on peut faire 100 fois plus simple.
tu connais les matrices?
perimgui le 14/01/2011 à 22:35
Mais oui ! Les matrices bigmouth.gif Pourquoi je n'y est pas pensé !

C'est qu'avec des tableaux, ça réduit de beaucoup l'algortihme.

Sinon, tu as décelé ds erreurs ?

Merci encore !
linkakro le 15/01/2011 à 00:18
Je ne trouve pas (ou peu) d'erreur, mais des simplifications.
------

Un simple If Then Else suffit pour le stockage de la chaîne. Et on peut encore faire mieux avec un autre point.

Code
If L1(1)+L1(2)+L1(3)+L1(4)+L1(5)+L1(6)+L1(7)+L1(8)+L1(9)
+L2(1)+L2(2)+L2(3)+L2(4)+L2(5)+L2(6)+L2(7)+L2(8)+L2(9) = 9

If somme(L1)+somme(L2)=9


Je ne suis pas fan de l'utilisation de la chaîne, mais après tout cela évite des If.

3-L->L inverse tout seul la valeur de L entre 1 et 2.

--
Je te proposes de remplir une seule liste avec des valeurs différentes selon le joueur, et d'adapter les tests en conséquence.

Code
If L=2:1->L1(8)
If L=1:2->L1(8)
// devient
L->L1(8


Code
If L1(1)+L1(2)+L1(3)=3 ou L1(1)+L1(4)+L1(7)=3 ... L2(1)+...  // avec L1 et L2
// devient
If L1(1)L1(2)L1(3)=L^3 ou L1(1)L1(4)L1(7)=L^3 ...        // avec L1 seulement


Code
If somme(L1)+somme(L2)=9
// devient
If prod(L1


--
Remplacer les variables qui verrifient les remplissages par des tests sur les listes. (mon exemple tient compte des améliorations ci-dessus).
Code
If I=0
// devient
If L1(x)
Ce point est moins important que le reste. J'ai peut-être mal choisi.

--
C'est ici qu'une simplification élimine peut-être un bug : Si la case est remplie, le programme prend en compte la prochaine case vide (du moins je l'analyse mais ce n'est pas véridique).
Code
:If K=73
:Then
:If B=1:74->K
:If B=0
:Then
:1->B
:Output(2,8,Chaine3)
:L->L1(2)
:End
:End

// devient

:If K=73 et L1(2)=0
:Then
:Output(2,8,Chaine3)
:L->L1(2)
:End


------

Je ne suis pas sûr que les matrices soient la meilleur idée car elles nécessitent des lignes supplémentaires par-ci et cela peut simplifier par-là.

Je n'ai pas tout mentionné ni fait.

Mes idées restent à vérifier.

Si des questions te viennent concernant mes choix technologiques, n'hésite pas.

=====================================

Le premier niveau de convertion donne ça
Code
:EffEcr
:Output(1,2,"MORPION TI")
:Output(3,8,"V1.01")
:Output(6,3,"PERIMGUI")
:Pause
:Menu("MENU","JEU",3,"QUITTER",4)
:Lbl 3
:EffEcr
:0->J
:1->L
:0->W
:EffListe L1
:9->dim(L1
:EffEcr
:Input "J1 NOM:",Chaine1
:EffEcr
:Input "J2 NOM:",Chaine2
:EffEcr
:For(T,2,15)
:Output(3,T,"-")
:Output(6,T,"-")
:End
:For(T,1,8)
:Output(T,6,"I")
:Output(T,11,"I")
:End
:Output(3,6,"+")
:Output(3,11,"+")
:Output(6,6,"+")
:Output(6,11,"+")
:Repeat J
:If L=1
:"X"->Chaine3
:If L=2
:"O"->Chaine3
:3-L->L
:codeTouche->K
:If K=72 et L1(1)=0
:Then
:Output(2,3,Chaine3)
:L->L1(1)
:End
:If K=73 et L1(2)=0
:Then
:Output(2,8,Chaine3)
:L->L1(2)
:End
:If K=74 et L1(3)=0
:Then
:Output(2,13,Chaine3)
:L->L1(3)
:End
:If K=82 et L1(4)=0
:Then
:Output(5,3,Chaine3)
:L->L1(4)
:End
:If K=83 et L1(5)=0
:Then
:Output(5,8,Chaine3)
:L->L1(5)
:End
:If K=84 et L1(6)=0
:Then
:Output(5,13,Chaine3)
:L->L1(6)
:End
:If K=92 et L1(7)=0
:Then
:Output(8,3,Chaine3)
:L->L1(7)
:End
:If K=93 et L1(8)=0
:Then
:Output(8,8,Chaine3)
:L->L1(8)
:End
:If K=94 et L1(9)=0
:Then
:Output(8,13,Chaine3)
:L->L1(9)
:End
:If prod(L1)
:1->J
:If L1(1)L1(2)L1(3)=L^3 ou L1(1)L1(4)L1(7)=L^3 ou
 L1(1)L1(5)L1(9)=L^3 ou L1(2)L1(5)L1(8)=L^3 ou
 L1(3)L1(6)L1(9)=L^3 ou L1(3)L1(5)L1(7)=L^3 ou
 L1(4)L1(5)L1(6)=L^3 ou L1(7)L1(8)L1(9)=L^3
:Then
:1->J
:1->W
:End
:End
:Lbl 8
:EffEcr
:If W=1
:Then
:Output(2,2,"FELICITATIONS")
:If L=1
:Then
:Output(4,2,Chaine2)
:Else
:Output(4,2,Chaine3)
:End
:Pause
:Else
:Output(4,2,"MATCH NUL")
:Pause
:End
:EffEcr
:Menu("REJOUER ?","OUI",3,"NON",4)
:Lbl 4
:EffEcr
perimgui le 15/01/2011 à 14:21
1°)
citation:
Code

If somme(L1)+somme(L2)=9

Là, ok, je comprends (en fait, je ne connaissais pas la fonction somme)
______________________________________________________________________________
2°)

citation:

"3-L->L inverse tout seul la valeur de L entre 1 et 2."
Là, je comprends aussi (c'est logique en même temps)
______________________________________________________________________________

3°)

citation:

Code

If L=2:1->L1(8)
If L=1:2->L1(8)
devient :
L->L1(x

Je ne comprends pas: quand tu dis "devient", ça sous-entends que je l'ai mis dans mon programme, mais je ne le vois nul part, j'ai peu être mal lu où mal compris moodforlove.gif mais je crois que ça correspond à la phrase que tu as dit juste avant

Et enfin, je ne comprends pas le "L->L1(x"
Selon moi, tu mets le numéro du joueur dans la case correpondante pour savoir, quel joueur a jouer sur cette case , c'est bien ça ? Et si je ne me suis pas trompé sur ton raisonnement, j'ai juste à laisser 0 si la case n'est pas cochée, non ?
____________________________________________________________________________

4°)


Code
If prod(L1)


Que fais-cette fonction ?

Peut-être que c'est identique à ça:
Code

If somme(L1)+somme(L2)=9


_______________________________________________________________________________

Et surtout merci ! Le programme que tu m'a donné fonctionne bien je suppose, je n'ai plus qu'à l'essayer. happy.gif
linkakro le 16/01/2011 à 00:36
Les citations peuvent être faites avec la balise quote (à coté de code). Mais une citation de balise de code est indigeste. ^^
--

Au point 3 tu as compris. Le x était en fait à décliner selon la case.
J'utilise bien la valeur 0 pour tester si la case est jouée. Cela économise les variables mais pas le code notgood.gif

Le "devient" montrait que les lignes au dessus sont remplacées par celles en dessous.

point 4 : la somme était juste quand on avait deux liste remplies de 1. Maintenant que j'utilise une seule liste remplie de valeurs différentes, je pratique le produit pour savoir si toutes les cases sont remplies : Le produit est non-nul si toutes les cases sont remplies.


===
J'ai trouvé un possible bug. Que le joueur ai joué ou non, le prog passe au deuxième joueur et vice-versa. On ajoûte un if-then-end :
Code
:If K   //
:Then         //
:If L=1
:"X"->Chaine3
:If L=2
:"O"->Chaine3
:3-J->J
:End          //
perimgui le 16/01/2011 à 13:45
Ah oui, comme ça; si K vaut 0, on ne change pas de symbole ! C'est bien ça ? En tout cas je te remercie randement !
perimgui le 16/01/2011 à 14:07
Ca marche, un grand merci !

PS : La case qui correspond au 1 ne se coche pas, d'où cela peut-il venir ?

Je reposte le code de là partie qui correspond:

Code

:If K=92 et L1(7)=0
:Then
:Output(2,3,Chaine3)
:L->L1(7)
:End


Et je ne vois nul part ailleurs une utilisation de L1(7) qui pourr
linkakro le 16/01/2011 à 20:03
J'ai peut-être bafouillé avec des copier/coller.

Sache aussi que les numéros cases ne correspondent pas aux chiffres dessinés sur les touches.
Si tu baptises case 1 celle de la touche [1], alors l'erreur se trouve probablement parmi ce que tu as posté.
Si tu baptises case 1 celle de L1(1) alors alors l'erreur se trouve probablement parmi le If-Then-End de L1(1).

J'ai oublié des Then pour des If de case. J'édite mon post.
Wirekey le 16/01/2011 à 22:14
Je pari que je peux réduire les conditionnels :p

(C'est linéaire tout ça)
linkakro le 16/01/2011 à 22:34
Moi aussi mais je ne veux pas griller les étapes.

Edit : Ca y est !
Code
EffEcr
Output(1,2,"MORPION TI")
Output(3,8,"V1.01")
Output(6,3,"PERIMGUI")
Pause
EffEcr
Menu("MENU","JEU",3,"QUITTER",4)
Lbl 3
0->J
0->W
1->L
0->K
ClrList L1
9->dim(L1
Input "J1 NOM=",Chaine1
Input "J2 NOM=",Chaine2
EffEcr
For(T,2,15)
Output(3,T,"-")
Output(6,T,"-")
End
For(T,1,8)
Output(T,6,"I")
Output(T,11,"I")
End
Output(3,6,"+")
Output(3,11,"+")
Output(6,6,"+")
Output(6,11,"+")
Repeat J+W
If K
3-L->L
If L=2
"X"->Chaine3
If L=1
"O"->Chaine3
codetouche->K
10partDéc(K/10)-1->X
ent(K/10)-6->Y
If abs(Y-2)>1 or abs(X-2)>1
End
3Y-3+X->A
5X-2->X
3Y-1->Y
If L1(A)=0
Then
L->L1(A)
Output(Y,X,Chaine3
End
If prod(L1)
1->J
If L1(1)L1(2)L1(3)=L^3 ou L1(1)L1(4)L1(7)=L^3 ou L1(1)L1(5)L1(9)=L^3 ou L1(2)L1(5)L1(8)=L^3 ou L1(3)L1(6)L1(9)=L^3 ou L1(3)L1(5)L1(7)=L^3 ou L1(4)L1(5)L1(6)=L^3 ou L1(7)L1(8)L1(9)=L^3
1->W
End
Lbl 8
EffEcr
If W
Then
Output(2,2,"FELICITATIONS")
If L=1
Output(4,2,Chaine1)
If L=2
Output(4,2,Chaine2)
End
If J
Output(4,2,"MATCH NUL")
Pause
EffEcr
Menu("REJOUER ?","OUI",3,"NON",4)
Lbl 4

J'ai trafiqué une formule remplaçant les If et bidouillé quelques détails.
J'ai renoncé aux matrices quand elles ont compliqué les tests de victoire.
metallica le 18/01/2011 à 17:57
Ce code peut beaucoup s'optimiser en taille:
Code
EffEcr
Output(1,2,"MORPION TI
Output(3,8,"V1.01
Output(6,3,"PERIMGUI
Pause
EffEcr
Menu("MENU","JEU",3,"QUITTER",4
Lbl 3
EffVar JEffVar WEffVar K
1->L
ClrList L1
9->dim(L1
Input "J1 NOM=",Chaine1
Input "J2 NOM=",Chaine2
EffEcr
For(T,2,15
Output(3,T,"-
Output(6,T,"-
End
For(T,1,8
Output(T,6,"I
Output(T,11,"I
End
Output(3,6,"+
Output(3,11,"+
Output(6,6,"+
Output(6,11,"+
Repeat J+W
If K
3-L->L
If L=2
"X"->Chaine3
If L=1
"O"->Chaine3
codetouche->K
10partDéc(K/10)-1->X
ent(K/10)-6->Y
If abs(Y-2)>1 or abs(X-2)>1
End
3Y-3+X->A
5X-2->X
3Y-1->Y
If non(L1(A
Then
L->L1(A
Output(Y,X,Chaine3
End
If prod(L1
1->J
If L1(1)L1(2)L1(3)=L^3 ou L1(1)L1(4)L1(7)=L^3 ou L1(1)L1(5)L1(9)=L^3 ou L1(2)L1(5)L1(8)=L^3 ou L1(3)L1(6)L1(9)=L^3 ou L1(3)L1(5)L1(7)=L^3 ou L1(4)L1(5)L1(6)=L^3 ou L1(7)L1(8)L1(9)=L^3
1->W
End
Lbl 8
EffEcr
If W
Then
Output(2,2,"FELICITATIONS
If L=1
Output(4,2,Chaine1
If L=2
Output(4,2,Chaine2
End
If J
Output(4,2,"MATCH NUL
Pause
EffEcr
Menu("REJOUER ?","OUI",3,"NON",4
Lbl 4
Monsieur le 27/02/2011 à 17:53
Bonjour, y a-t-il une fonction "Chaine1" et "Chaine2" pour la TI-82 non stats???
Sangohan38 le 27/02/2011 à 20:50
Non.

Sangohan38
ld le 01/03/2011 à 16:30
Qui sait comment on renomme une liste via un prgm ? SVP. ahh.gif
Autre question: Une fonction permet de rechercher un caractère dans une chaine...
(Elle donne sa position à partir d'un nombre donner.); Qu'elle est sont nom en fr ? crazy.gif
Sangohan38 le 01/03/2011 à 16:38
On ne peut pas renommé une liste grâce à un programme. Tout au plus, on peut changer les nombres de liste mais ça nécessite de créer une liste et de copier chaque valeur ce qui prend de la mémoire.

Pour rechercher un caractère dans une chaîne, je pense qu'il faut utiliser la fonction sous-chaine:

Code
If "A"=sous-chaine(chaine3,2)
...


Par contre, comme je ne connais pas bien les chaines, demande confirmation.

Sangohan38
ld le 01/03/2011 à 16:59
Merci pour la réponse, c'étais très rapide...
Mais dans les deux cas je suis persuader qu'il existe une commande spécifique.
Merci qu'en même ! kiss.gif
Persalteas le 01/03/2011 à 17:41
Oui: c'est carchaine ( instring en anglais)

carchaine( chaine3 , "A" )

va te donner un nombre: la position du A dans ta chaine 3.
S'il n'y a pas de A, le nombre est 0.

donc pour détecter un A dans une chaine:

If carchaine(Chaine3,"A":Then
Disp "il y a un A"
Else
Disp "il n'y en a pas"
End
ld le 01/03/2011 à 17:45
Pile poil Persalteas !
Je viens justement trouver le terme anglais "inString("...
En fr çà donne...? ahh.gif
Persalteas le 01/03/2011 à 17:47
je viens de te le dire: carchaine(
ld le 01/03/2011 à 17:54
OK ! C'est juste. Punaise je fatigue...
Persalteas le 01/03/2011 à 17:59
t'es en vacances ou pas toi, en ce moment?

EDIT:puisqu'on floode, là, ça m'a fait penser...

tu en es exactement à 200 messages.
et moi je viens de passer les 920, je suis le troisième du forum!! j'avais complètement oublié de regarder ça!!
ld le 01/03/2011 à 18:02
Ouaip ! Et vivement l'école, je revient de vacance nature dans les Vosges et là je tourne un peu en rond...
visiteur le 18/02/2014 à 19:08
J'ai un problème au niveau de l1(a qui me donne dim invalide. Vous pourriez m'aider ?
linkakro le 18/02/2014 à 19:16
Quelle ligne ? Il y a plusieurs L1.
L1=2nde+1
Skyerz le 19/08/2014 à 20:17
Bonjours, je viens de recopier ce programme propose précédemment (le dernier)mais le jeu ne se lance pas. on m'indique erreur a la fin de la ligne if prod(L1

Et je sais que L1 se fait avec [seconde]+[1]

Cordiallement
linkakro le 19/08/2014 à 23:02
Quel type d'erreur ? C'est-à-dire le titre du menu d'erreur.
Si le type est Syntax alors vérifie qu'il n'y a pas d'espace en fin de ligne.
Bosetti06 le 20/10/2014 à 23:03
Bonsoir désolé de faire remonter le topic mais j'ai une erreur argument à "quitter",4 (précisément sur le 4)
linkakro le 22/10/2014 à 18:04
erreur sur des guillemets ou des virgules dans la commande du menu sur la même ligne.
flush le 31/07/2022 à 09:30
j'ai commencé le morpion de perimgui et franchement il a l'air trop bien je vous le recommande a tous (:
flush le 01/08/2022 à 09:20
j'ai copié le morpion de perimgui et j'aimerais bien savoir comment on y joue godgrace.gif