Autorisation : Membre
Nb de messages : 23
Inscrit le : Dim 13 Nov 2011, 20:13
Posté le : Ven 03 Fév 2012, 18:00
Bonjour. J'ai créé un jeu de morpion de maniere un peu arnachique comme vous allez le voir ^^ Je n'arrive pas a faire en sorte que la calculatrice reconnaisse le gagnant meme en ayant trouver une partie de code intéréssante sur ce forum ^^
Voici mon code :
Code
effecr
programme qui remet le graph en place
{3,3}->dim([J]
remplir(0,[J]
ligne(20,0,20,-62
ligne(40,0,40,-62
ligne(60,0,60,-62
ligne(0,-20,60,-20
ligne(0,-40,60,-40
22->A:-22->B:16->c:-38->D:0->N
texte(1,80,"J1
lbl 1
repeat K=105
ligne(A,B,A+C,B
ligne(A,D,A+C,D
ligne(A,B,A,D
ligne(A+C,B,A+C,D
codetouche->K
if K=24:then
ligne(A,B,A+C,B,0
ligne(A,D,A+C,D,0
ligne(A,B,A,D,0
ligne(A+C,B,A+C,D,0
A-20->A
end
if K=26:then
ligne(A,D,A+C,D,0
ligne(A,B,A+C,B,0
ligne(A,B,A,D,0
ligne(A+C,B,A+C,D,0
A+20->A
End
If K=34:then
ligne(A,B,A+C,B,0
ligne(A,D,A+C,D,0
ligne(A,B,A,D,0
ligne(A+C,B,A+C,D,0
B-20->B:D-20->D
End
If K=25:then
ligne(A,B,A+C,B,0
ligne(A,D,A+C,D,0
ligne(A,B,A,D,0
ligne(A+C,B,A+C,D,0
B+20->B:D+20->D
end
end
ligne(A,B,A+C,B,0
ligne(A,D,A+C,D,0
ligne(A,B,A,D,0
ligne(A+C,B,A+C,D,0
If A=2:1->X
If A=22:2->X
If A=42:3->X
If B=-2:1->Y
If B=-22:2->Y
If B=-42:3->Y
N+1->N
If N=1 ou N=3 ou N=5 ou N=7 ou N=9:then
1->T
ligne(A,B,A+C,D
ligne(A,D,A+C,B
1->[J](Y,X):[J]
goto 2
lbl 3
texte(1,80,"J2
end
If N=2 ou N=4 ou N=6 ou N=8:then
(A+A+C)/2->E:(B+D)/2->F
cercle(E,F,7
2->T
2->[J](Y,X):[J]
goto 2
lbl 4
texte(1,80,"J1
end
goto1
lbl 2 ->c'est la ou il y a un pb
For(H,1,3
For(G,1,2
If [J](H,1)=G et[J](H,2)=G et [J](H,3)=G ou [J](1,H)=G et [J](2,H)=G et [J](3,H)=G ou [J](1,1)=G et [J](2,2)=G et [J](3,3)=G ou [J](1,3)=G et [J](2,2)=G et [J](3,1)=G:then
effecr
disp "OWNED BY","JOUEUR",T
goto 5
else
if T=1:goto 3
if T=2:goto 4
end
end
lbl 5
disp " "
end
en espérant que je n'ai pas fait de fautes^^
vos solutions seront les bienvenues et m'aidera beaucoup puisque j'ai aussi fait un puissance 4 ou il manque cette partie ^^
Autorisation : Membre
Nb de messages : 3293
Inscrit le : Sam 31 Déc 2005, 19:48
Posté le : Ven 03 Fév 2012, 18:35
Si cette partie du programme ne s'affiche pas, c'est que le programme ne va pas jusqu'au lbl 2.
Aussi je te conseil de revoir soit les conditions dans la ligne "If N=2 ou N=4 ou N=6 ou N=8:then" soit à rajouter un end avant le goto 2.
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Ven 03 Fév 2012, 21:46
Enlève le End tout à la fin.
Le problème est que tu utilises des Goto sans refermer les boucles donc un End de trop ramène à pétaouch'nok.
[J](H,1)=G et [J](H,2)=G et [J](H,3)=G
[J](H,1)[J](H,2)[J](H,3)=G^3
Ce changement est valide dans ce cas particulier car G vaut 1 ou 2.
---------------------- 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 : 23
Inscrit le : Dim 13 Nov 2011, 20:13
Posté le : Sam 04 Fév 2012, 13:59
merci pour vos reponses et linkakro pour le raccourci ^^
sinon je peux mettre un end devant le goto 2 et la boucle continue, mais si j'en met 2 devant les 2 goto 2 la boucle se finit...
apres le message s'affiche par exemple quand toute la ligne du haut est remplie mais pas dans d'autres situations comme la colonne du milieu
Autorisation : Membre
Nb de messages : 23
Inscrit le : Dim 13 Nov 2011, 20:13
Posté le : Dim 05 Fév 2012, 12:44
J'ai fait quelques changements ^^ au niveau de la condition de N et la structure puisque il y a moins de lbl maintenant.
Code
effecr
programme qui remet le graph en place
{3,3}->dim([J]
remplir(0,[J]
ligne(20,0,20,-62
ligne(40,0,40,-62
ligne(60,0,60,-62
ligne(0,-20,60,-20
ligne(0,-40,60,-40
22->A:-22->B:16->c:-38->D:0->N
texte(1,80,"J1
lbl 1
repeat K=105
ligne(A,B,A+C,B
ligne(A,D,A+C,D
ligne(A,B,A,D
ligne(A+C,B,A+C,D
codetouche->K
if K=24:then
ligne(A,B,A+C,B,0
ligne(A,D,A+C,D,0
ligne(A,B,A,D,0
ligne(A+C,B,A+C,D,0
A-20->A
end
if K=26:then
ligne(A,D,A+C,D,0
ligne(A,B,A+C,B,0
ligne(A,B,A,D,0
ligne(A+C,B,A+C,D,0
A+20->A
End
If K=34:then
ligne(A,B,A+C,B,0
ligne(A,D,A+C,D,0
ligne(A,B,A,D,0
ligne(A+C,B,A+C,D,0
B-20->B:D-20->D
End
If K=25:then
ligne(A,B,A+C,B,0
ligne(A,D,A+C,D,0
ligne(A,B,A,D,0
ligne(A+C,B,A+C,D,0
B+20->B:D+20->D
end
end
ligne(A,B,A+C,B,0
ligne(A,D,A+C,D,0
ligne(A,B,A,D,0
ligne(A+C,B,A+C,D,0
If A=2:1->X
If A=22:2->X
If A=42:3->X
If B=-2:1->Y
If B=-22:2->Y
If B=-42:3->Y
N+1->N
If partdec((N+1)/2)=0:then
1->T
ligne(A,B,A+C,D
ligne(A,D,A+C,B
1->[J](Y,X):[J]
Else
(A+A+C)/2->E:(B+D)/2->F
cercle(E,F,7
2->T
2->[J](Y,X):[J]
End
For(H,1,3
For(G,1,2
If [J](H,1)=G et[J](H,2)=G et [J](H,3)=G ou [J](1,H)=G et [J](2,H)=G et [J](3,H)=G ou [J](1,1)=G et [J](2,2)=G et [J](3,3)=G ou [J](1,3)=G et [J](2,2)=G et [J](3,1)=G:then
effecr
disp "OWNED BY","JOUEUR",T
goto 5
else
if T=1:texte(1,80,"J2
if T=2:texte(1,80,"J1
goto 1
end
end
lbl 5
disp " "
Le jeu fonctionne. Cependant il ne dis pas quand quelqu'un a gagné sauf quand on remplit la ligne du haut.
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Dim 05 Fév 2012, 17:23
If partDéc(N/2
aurait permi de simplifier If partDéc((N+1)/2)=0 sans même modifier l'usage de N.
J'ai peut-être commis des erreurs dans le code suivant car je n'ai pas testé.
Néansmoins cela me paraît plus propre à plusieurs endroits.
Il doit rester encore de grosses modifs possibles pour la partie graphique.
Code
Effecr
EffVar [J]
{3,3->dim([J]
Ligne(20,0,20,-62
Ligne(40,0,40,-62
Ligne(60,0,60,-62
Ligne(0,-20,60,-20
Ligne(0,-40,60,-40
22->A:-22->B:16->C:-38->D:0->N
Lbl 1
Texte(1,80,"J1
If N
Texte(1,80,"J2
Repeat K=105
Ligne(A,B,A+C,B
Ligne(A,D,A+C,D
Ligne(A,B,A,D
Ligne(A+C,B,A+C,D
codeTouche->K
If K=24:Then
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
A-20->A
End
If K=26:Then
Ligne(A,D,A+C,D,0
Ligne(A,B,A+C,B,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
A+20->A
End
If K=34:then
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
B-20->B:D-20->D
End
If K=25:Then
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
B+20->B:D+20->D
End
End
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
If A=2:1->X
If A=22:2->X
If A=42:3->X
If B=-2:1->Y
If B=-22:2->Y
If B=-42:3->Y
non(N->N
If N
Then
Ligne(A,B,A+C,D
Ligne(A,D,A+C,B
Else
(A+C)/2->E:(B+D)/2->F
Cercle(E,F,7
End
N+1->[J](Y,X)
For(H,1,3
For(G,1,2
If [J](H,1)[J](H,2)[J](H,3)=G^3 ou [J](1,H)[J](2,H)[J](3,H)=G^3 ou [J](1,1)[J](2,2)[J](3,3)=G^3 ou [J](1,3)[J](2,2)[J](3,1)=G^3:Then
Effecr
Disp "OWNED BY","JOUEUR",N+1
Goto 5
End
Goto 1
Lbl 5
Disp " "
EDIT : j'ai effectivement commis au moins une erreur, c'est d'avoir oublié que 0 représentait une case vide et donce que qu'y stocker N entre 0 et 1 était idiot.
Je corrige. (longtemps après)
G vaut maintenant 1 ou 2, Je teste G^3, Je stocke N+1 dans la matrice.
---------------------- 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 : 23
Inscrit le : Dim 13 Nov 2011, 20:13
Posté le : Dim 05 Fév 2012, 19:12
Et voila ca donne ceci =D Merci beaucoup pour vos conseils, le jeu marche tres bien mais prends un petit peu de temps pour les vérifications ^^ Je me demande si la calculatrice ne va pas ramer si je le fais sur un jeu de puissance 4 non?
Code
Effecr
EffVar [J]
{3,3->dim([J]
Ligne(20,0,20,-62
Ligne(40,0,40,-62
Ligne(60,0,60,-62
Ligne(0,-20,60,-20
Ligne(0,-40,60,-40
22->A:-22->B:16->C:-38->D:1->N
Lbl 1
Texte(1,80,"J1
If partdec(N/2)=0:Texte(1,80,"J2
Repeat K=105
Ligne(A,B,A+C,B
Ligne(A,D,A+C,D
Ligne(A,B,A,D
Ligne(A+C,B,A+C,D
codeTouche->K
If K=24:Then
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
A-20->A
End
If K=26:Then
Ligne(A,D,A+C,D,0
Ligne(A,B,A+C,B,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
A+20->A
End
If K=34:then
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
B-20->B:D-20->D
End
If K=25:Then
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
B+20->B:D+20->D
End
End
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
If A=2:1->X
If A=22:2->X
If A=42:3->X
If B=-2:1->Y
If B=-22:2->Y
If B=-42:3->Y
1-N->N
If partdec (N/2)=0:then
Ligne(A,B,A+C,D
Ligne(A,D,A+C,B
1->[J](Y,X):[J]
Else
(A+C)/2->E:(B+D)/2->F
Cercle(E,F,7
2->[J](Y,X):[J]
End
For(H,1,3
For(G,1,2
If [J](H,1)[J](H,2)[J](H,3)=G ou [J](1,H)[J](2,H)[J](3,H)=G ou [J](1,1)[J](2,2)[J](3,3)=G ou [J](1,3)[J](2,2)[J](3,1)=G:Then
Effecr
Disp "OWNED BY","JOUEUR",N+1
Goto 5
End
End
End
Goto 1
Lbl 5
Disp " "
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Dim 05 Fév 2012, 20:19
çadépend, si tu ne teste pas la victoire (ou alors que si l'on appuye sur une touche donnée), on peut faire quelquechose d'assez rapide. Si on vérifie tout d'un cups, c'est long.
Par contre j'ai jamais aissayé en testant que ce qu'il y a autour.
Sandro
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes
Autorisation : Membre
Nb de messages : 23
Inscrit le : Dim 13 Nov 2011, 20:13
Posté le : Lun 06 Fév 2012, 9:46
est-ce que je peux utiliser ce systeme pour mon puissance 4 ou il y a une matrice de 7x6 ou dois-je trouver un autre moyen? Si je dois trouver d'autres moyens avez vous des idees? merci
Autorisation : Membre
Nb de messages : 23
Inscrit le : Dim 13 Nov 2011, 20:13
Posté le : Lun 06 Fév 2012, 12:56
ca donnerait :
Code
For(X,1,7
For(Y,1,6
For(G,1,2
If [J](Y,X)[J](Y,X+1)[J](Y,X+2)[J](Y,X+3)=G^4 ou [J](Y,X)[J](Y+1,X)[J](Y+2,X)[J](Y+3,X)=G^4 ou [J](Y,X)[J](Y+1,X+1)[J](Y+2,X+2)[J](Y+3,X+3)=G^4 ou [J](Y,X)[J](Y-1,X-1)[J](Y-2,X-2)[J](Y-3,X-3)=G^4:Then
Mais est-ce que cela ne va pas buger puisque il va devoir chercher des chiffres hors de la matrice non? exemple quand X=7 X+1=8 or la matrice est de {6,7}.
Donc faudrait plutot utiliser ça non?
Code
For(X,1,4
For(Y,1,6
For(G,1,2
If [J](Y,X)[J](Y,X+1)[J](Y,X+2)[J](Y,X+3)=G^4:Then
For(X,1,7
For(Y,1,3
For(G,1,2
If [J](Y,X)[J](Y+1,X)[J](Y+2,X)[J](Y+3,X)=G^4:Then
For(X,1,4
For(Y,1,3
For(G,1,2
If [J](Y,X)[J](Y+1,X+1)[J](Y+2,X+2)[J](Y+3,X+3)=G^4:Then
For(X,4,7
For(Y,4,6
For(G,1,2
If [J](Y,X)[J](Y-1,X-1)[J](Y-2,X-2)[J](Y-3,X-3)=G^4:Then
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Lun 06 Fév 2012, 13:27
soit tu sépare la matrice en plusieurs zonnes, soit tu fait une matrice plus grande et utilise un "cadre" autour de la partie intéressante pour pouvoir faire une seule boucle de tests.
Sinon, il pourrait aussi être intéréssant de ne tester que les nouvelles possibilitées de victoire, mais là, c'est un peu plus dure.
sandro
PS : pour un puissance 4, il te faudrait pas plutôt du G^4?
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes
Autorisation : Membre
Nb de messages : 3738
Inscrit le : Lun 19 Oct 2009, 21:25
Posté le : Lun 06 Fév 2012, 13:57
Tu utilises une seule boucle For, tu pratiques un test de validité des coordonnées, puis tu effectues un test d'alignement, et tu reccomences pour tester au final les quatres orientations.
Voilà comment je le vois :
Code
For(X,1,7
For(Y,1,6
For(G,1,2
If coordonnées valides:Then // horizontal
If alignement:Goto 5:End
If coordonnées valides:Then //vertical
If alignement:Goto 5:End
// et caetera
End:End:End // fin des For
Lbl 5
Effecr
Disp "OWNED BY","JOUEUR",N+1
----
Il pourrait être possible de pratiquer un test sur les cases autour du pion joué plutôt que de pratiquer un test sur toute la matrice. Et aussi tester uniquement la couleur de pion du joueur qui vient de jouer.
Un peu à l'instar de ceci ou cela
---------------------- 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 : 23
Inscrit le : Dim 13 Nov 2011, 20:13
Posté le : Lun 06 Fév 2012, 15:12
J'ai tester une matrice plus grande avec toutes les boucles. elle fait {12,13} cependant le temps d'attente est trop long.(plus de 10 secondes) Que veut tu dire par faire des zones dans la matrice?
linkakro je suis allé voir sur tes liens. J'essaye de comprendre et il y a beaucoup de choses qui peuvent me faire progresser comme ceci :
Autorisation : Membre
Nb de messages : 23
Inscrit le : Dim 13 Nov 2011, 20:13
Posté le : Mar 07 Fév 2012, 20:20
Code
Repeat K=105
Ligne(A,B,A+C,B
Ligne(A,D,A+C,D
Ligne(A,B,A,D
Ligne(A+C,B,A+C,D
codeTouche->K
If K=24:Then
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
A-20->A
End
If K=26:Then
Ligne(A,D,A+C,D,0
Ligne(A,B,A+C,B,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
A+20->A
End
If K=34:then
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
B-20->B:D-20->D
End
If K=25:Then
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
B+20->B:D+20->D
End
End
Ce code peut il etre remplacé par :
Code
Repeat K=105
Ligne(A,B,A+C,B
Ligne(A,D,A+C,D
Ligne(A,B,A,D
Ligne(A+C,B,A+C,D
codeTouche->K
min(3,max(1,X-(K=24)+(K=26->X
min(3,max(1,Y-(K=25)+(K=34->Y
A+X*20->A
B+Y*20->B
D+Y*20->D
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
End
End
Autorisation : Membre
Nb de messages : 23
Inscrit le : Dim 13 Nov 2011, 20:13
Posté le : Mer 08 Fév 2012, 9:58
Ce sont des points du graphique qui permettent de faire le curseur qui est un carré.
A est labscisse du côté gauche du carré. À+C est labscisse du côté droit du carré. B et D sont les ordonnées des côtés du haut et du bas du carré.
Autorisation : Membre
Nb de messages : 1366
Inscrit le : Ven 25 Mar 2011, 22:58
Posté le : Mer 08 Fév 2012, 11:36
Désolé, ce n'est malheureusement pas possible (le premier code permet à A de diminuer, mais pas le second.
Par contre, je crois qe tu peut faire à la place du 1er programme:
Code
Repeat K=105
Ligne(A,B,A+C,B
Ligne(A,D,A+C,D
Ligne(A,B,A,D
Ligne(A+C,B,A+C,D
codeTouche->K
(K=26)-(K=26->U
(K=34)+(K=25->V
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
A+20U -> A
B+20V -> B
D+20V -> D
End
et si tu veut controler la position, prend plutôt celui-ci:
Code
Repeat K=105
Ligne(A,B,A+C,B
Ligne(A,D,A+C,D
Ligne(A,B,A,D
Ligne(A+C,B,A+C,D
codeTouche->K
X -> U
Y -> V
min(3,max(1,X-(K=24)+(K=26->X
min(3,max(1,Y-(K=25)+(K=34->Y
Ligne(A,B,A+C,B,0
Ligne(A,D,A+C,D,0
Ligne(A,B,A,D,0
Ligne(A+C,B,A+C,D,0
A+20(X-U -> A
B+20(Y-V -> B
D+20(Y-V -> D
End
Sandro
PS : pourquoi ne pas exprimer D comme étant B+K ?
---------------------- mort à l'inutile, place à la mémoire libre et aux programmes
Autorisation : Membre
Nb de messages : 23
Inscrit le : Dim 13 Nov 2011, 20:13
Posté le : Sam 03 Mar 2012, 17:37
vu que je fais les programmes comme je peux, j'ai a ce moment la choisi de mettre D et non B+C ^^'
Merci pour le morceau du programme, il marche tres bien mais j'ai du changer les positions initiales des points A, B et D et je ne sais pas pourquoi =O. Le curseur clignote mais ce n'est pas grave puisque cela a permis de raccourcir mon programme. =)