Author Topic: [Axe Parser] Problème dans la programmation d'un morpion  (Read 6881 times)

0 Members and 1 Guest are viewing this topic.

Offline reop

  • LV1 Newcomer (Next: 20)
  • *
  • Posts: 6
  • Rating: +0/-0
    • View Profile
[Axe Parser] Problème dans la programmation d'un morpion
« on: June 01, 2011, 04:05:43 pm »
Bonjour tout le monde,

suite à la lecture du tutoriel du maintenant célèbre kindermoumoute sur la programmation en Axe Parser, j'ai décidé de créer un petit morpion, jeu assez simple pour commencer, pour m'exercer un peu dans ce langage. Mais je rencontre quelques difficultés. Voici l'état du code actuellement :

Code: [Select]
.A
for(Z,0,713
0=>{l1+Z}
end
clrdraw
1=>Y=>T=>A-1=>P=>Q
31=>X
line(31,20,94,20
line(31,41,94,41
line(51,1,51,60
line(29,0,29,63
line(73,1,73,60
.mise en place de la grille dans le buffer
storepic
lbl 1
recallpic
repeat getkey(15) or getkey(33)
line(X,Y,X+18,Y
line(X,Y,X,Y+17
line(X,Y+17,X+18,Y+17
line(X+18,Y,X+18,Y+17
dispgraph
.Affichage du curseur permettant le choix de la case où l'on souhaite poser son pion

(getkey(3) and (X≠75))-(getkey(2) and (X≠31))=>V
V*22+X=>X
(getkey(1) and (Y≠43))-(getkey(4) and (Y≠1))=>W
W*21+Y=>Y
if V≠0 or W≠0
(X-31)/22=>P
(Y-1)/21=>Q
pause 250
goto 1
end
.déplacement du curseur

end
if getkey(33)
.si l'utilisateur appuie sur "0"

if {l1+(P+3Q}=0
.si la case est vide ...

if T=1
recallpic
circle(X+9,Y+9,8
storepic
end
.si c'est au joueur 1, trace un cercle

if T=0
line(X+1,Y+1,X+17,Y+16)r
line(X+17,Y+1,X+1,Y+16)r
end
.si c'est au joueur 2, trace une croix

T+1=>{l1+(P+3Q)}

1-T=>T
.changement de tour
end
goto 1
end
clrhome

Je n'obtiens pas ce que j'aurais souhaité. Quand j'appuie sur la touche "0", les ronds et les cercles s'affichent aléatoirement, quand ils le souhaitent .... L'appuie sur cette touche provoque même parfois l'arrêt du programme ! Et je ne vois pas l'erreur commise. Là est le problème.

En espérant que vous ayez la réponse à mon problème,

Au revoir !
« Last Edit: June 01, 2011, 04:12:28 pm by reop »

Offline kindermoumoute

  • LV8 Addict (Next: 1000)
  • ********
  • Posts: 836
  • Rating: +54/-3
    • View Profile
Re: [Axe Parser] Problème dans la programmation d'un morpion
« Reply #1 on: June 01, 2011, 08:52:22 pm »
Bienvenue à toi !
suite à la lecture du tutoriel du maintenant célèbre kindermoumoute
Il ne faut pas exagérer quand même. ^^'

Si j'ai bien compris il n'y a pas tout ton code. Dans ce que tu montre il y a un truc un peu violent à voir :


Code: [Select]
(getkey(3) and (X≠75))-(getkey(2) and (X≠31))=>V
V*22+X=>X
(getkey(1) and (Y≠43))-(getkey(4) and (Y≠1))=>W
W*21+Y=>Y
if V≠0 or W≠0
(X-31)/22=>P
(Y-1)/21=>Q
Je ne comprend pas ce que tu essaye de faire. D'abord explique ce que tu compte faire exactement avec ce calcul, puis vérifie que c'est bien comme ça qu'il faut faire. Comme il n'y a pas de variable oublié, ou de fonction rand, c'est forcément ce calcul qui te donne des nombres non voulu.
Projects :

Worms armageddon z80 :
- smoothscrolling Pixelmapping : 100%
- Map editor : 80%
- Game System : 0%

Tutoriel français sur l'Axe Parser
- 1ère partie : en ligne.
- 2ème partie : en ligne.
- 3ème partie : en ligne.
- 4ème partie : 10%
- Annexe : 100%

Offline DJ Omnimaga

  • Clacualters are teh gr33t
  • CoT Emeritus
  • LV15 Omnimagician (Next: --)
  • *
  • Posts: 55941
  • Rating: +3154/-232
  • CodeWalrus founder & retired Omnimaga founder
    • View Profile
    • Dream of Omnimaga Music
Re: [Axe Parser] Problème dans la programmation d'un morpion
« Reply #2 on: June 02, 2011, 12:46:23 am »
Bienvenue sur le forum :D

Offline reop

  • LV1 Newcomer (Next: 20)
  • *
  • Posts: 6
  • Rating: +0/-0
    • View Profile
Re: [Axe Parser] Problème dans la programmation d'un morpion
« Reply #3 on: June 02, 2011, 05:05:31 am »
Bienvenue à toi !

Bienvenue sur le forum :D

Merci à vous deux !

Si j'ai bien compris il n'y a pas tout ton code.

Le code n'est en fait pas terminé. Pour l'instant il affiche la grille, le curseur de déplacement et l'affichage des pions (enfin presque, sinon je ne serais pas là ^^).

Dans ce que tu montre il y a un truc un peu violent à voir :

Code: [Select]
(getkey(3) and (X≠75))-(getkey(2) and (X≠31))=>V
V*22+X=>X
(getkey(1) and (Y≠43))-(getkey(4) and (Y≠1))=>W
W*21+Y=>Y
if V≠0 or W≠0
(X-31)/22=>P
(Y-1)/21=>Q

Je vais expliquer cette partie du code pas à pas pour que tu comprennes mieux.

Code: [Select]
(getkey(3) and (X≠75))-(getkey(2) and (X≠31))=>V
V*22+X=>X

Si le joueur appuie sur la flèche droite, V=1 et V*22 c'est-à-dire 22 s'ajoute à X tant que le curseur reste dans les limites du plateau c'est-à-dire si X≠75 pour que le déplacement ne s'opère pas pixel par pixel mais case par case. De même pour la flèche de gauche, sauf que dans ce cas-là V=-1 et on enlève 22 à X toujours s'il est dans les limites du plateau.

Code: [Select]
(getkey(1) and (Y≠43))-(getkey(4) and (Y≠1))=>W
W*21+Y=>Y

C'est exactement le même principe pour les Y.

Code: [Select]
if V≠0 or W≠0
Si V≠0 ou W≠0, c'est-à-dire si le curseur a bougé ...

Code: [Select]
(X-31)/22=>P
(Y-1)/21=>Q

Je pense que c'est cela qui est peu compréhensible pour toi. En fait, je n'est pas trouvé comment fonctionnaient les matrices. J'ai fais sous forme de liste où {l1+0}= la case 1, {l1+1}= la case 2, etc jusqu'à la case 9 qui est égale à {l1+8} en comptant à partir de la case en haut à gauche et à la fin de la ligne en revenant à gauche une ligne en-dessous. Pour associer les abscisses et les ordonnées à ce seul chiffre, j'ai donc procéder à un petit calcul. Et P+3Q donne le numéro à associer à la liste pour tomber sur la bonne case.
Petit exemple :
Le curseur est placé à X=31 et Y=1 au début du programme. Donc imaginons que le curseur est au centre de la grille, c'est-à-dire à la case (2;2). X est donc égale à 31+22*1=53 et Y est donc égale à 1+21*1=22
Cela donne :
P=(X-31)/22=(53-31)/22=22/22=1
Q=(Y-1)/21=(22-1)/21=21/21=1
P+3*Q=1+3*1=4
Or {l1+4} est bien associé à la case du centre puisque :
{l1+0}=case en haut à gauche (1;1)
{l1+1}=case en haut au centre (2;1)
{l1+2}=case en haut à droite (3;1)
{l1+3}=case au milieu à gauche (1;2)

Donc voilà ce calcul permet juste cela. A chaque fois que le joueur bouge le curseur, les variables sont mises à jour.

J'espère que mon explication t'auras aidé à comprendre.

Si tu veux tester pour encore plus de compréhension : http://www.mediafire.com/?d5bhyd4c9cgb7f3

Salut !
« Last Edit: June 02, 2011, 05:10:59 am by reop »

Offline kindermoumoute

  • LV8 Addict (Next: 1000)
  • ********
  • Posts: 836
  • Rating: +54/-3
    • View Profile
Re: [Axe Parser] Problème dans la programmation d'un morpion
« Reply #4 on: June 02, 2011, 06:10:54 am »
Ok, donc en fait ce sont tes coordonnées X qui sont mal formulé. Pour mieux comprendre ton code, il faut que X et Y correspondent aux coordonnées comme tu l'a dis (X;Y), c'est à dire compris entre 1 et 3. En gros ce qu'il faut faire c'est un mini tilemapping, sauf qu'ici on utilisera des cercles e des ronds. Pour simplifier les choses, les coordonnées de X et Y seront entre 0 et 2 (tu verra pourquoi). En gros, avant chaque affichage en fonction de X et Y, il faudra faire un calcul du genre X*22+31=>X, et à la fin X-31/22 (c'est ce que tu avais commencé à peu près à faire). Le déplacement est donc à peu près similaire :
Code: [Select]
:(getKey(3) and (X≠2))-(getKey(2) and (X≠0))+X→X
:(getKey(1) and (Y≠0))-(getKey(4) and (Y≠2))+Y→Y
Lorsqu'on appuie sur la touche pour jouer :
Code: [Select]
:If getKey(33) and ({Y*3+X+L1}=0)
:T=>{Y*3+X+L1}
:End
Et pour afficher après c'est à peu près la même chose que le tilemapping :
Code: [Select]
:For(Y,0,2)
:For(X,0,2)
:X*22+31=>X
:If T
:.Cercle
:Else!If T
:.Carre
:End
:X-31/22=>X
:End
:End

Si ton programme se quitte de temps en temps, c'est que dans ta boucle principale tu as autorisé la touche "0" pour le quitter :
Code: [Select]
:Repeat getKey(15) or getKey(33)

Voili voilou, tu me redis si ça ne marche toujours pas.

PS : C'est marrant, c'est en faisant un programme de morpion que j'ai appris l'astuce 1-T=>T, c'est là que c'est très puissant. :)
« Last Edit: June 02, 2011, 06:11:50 am by kindermoumoute »
Projects :

Worms armageddon z80 :
- smoothscrolling Pixelmapping : 100%
- Map editor : 80%
- Game System : 0%

Tutoriel français sur l'Axe Parser
- 1ère partie : en ligne.
- 2ème partie : en ligne.
- 3ème partie : en ligne.
- 4ème partie : 10%
- Annexe : 100%

Offline reop

  • LV1 Newcomer (Next: 20)
  • *
  • Posts: 6
  • Rating: +0/-0
    • View Profile
Re: [Axe Parser] Problème dans la programmation d'un morpion
« Reply #5 on: June 02, 2011, 06:50:50 am »
En effet, quand j'enlève la condition :
Code: [Select]
if {l1+(P+3Q}=0 tout fonctionne bien. Ce doit être donc que c'est mal formulé. Mais pourtant que je fais les calculs avec n'importe quel position du curseur, tout est juste.

Deuxième truc bizarre, tu me dis :

Si ton programme se quitte de temps en temps, c'est que dans ta boucle principale tu as autorisé la touche "0" pour le quitter :
Code: [Select]
:Repeat getKey(15) or getKey(33)

Oui mais il y a une condition juste à la sortie de la boucle :
Code: [Select]
if getkey(33)
.si l'utilisateur appuie sur "0"

if {l1+(P+3Q}=0
.si la case est vide ...

if T=1
recallpic
circle(X+9,Y+9,8
storepic
end
.si c'est au joueur 1, trace un cercle

if T=0
line(X+1,Y+1,X+17,Y+16)r
line(X+17,Y+1,X+1,Y+16)r
end
.si c'est au joueur 2, trace une croix

T+1=>{l1+(P+3Q)}

1-T=>T
.changement de tour
end
goto 1

... qui finalement se termine par un Goto qui se dirige juste avant le début de la boucle principale. Donc cela ne devrait pas quitter.

Offline kindermoumoute

  • LV8 Addict (Next: 1000)
  • ********
  • Posts: 836
  • Rating: +54/-3
    • View Profile
Re: [Axe Parser] Problème dans la programmation d'un morpion
« Reply #6 on: June 02, 2011, 08:22:14 am »
Cela dépend de quand est ce que tu appuie sur la touche. ;)
Projects :

Worms armageddon z80 :
- smoothscrolling Pixelmapping : 100%
- Map editor : 80%
- Game System : 0%

Tutoriel français sur l'Axe Parser
- 1ère partie : en ligne.
- 2ème partie : en ligne.
- 3ème partie : en ligne.
- 4ème partie : 10%
- Annexe : 100%

Offline reop

  • LV1 Newcomer (Next: 20)
  • *
  • Posts: 6
  • Rating: +0/-0
    • View Profile
Re: [Axe Parser] Problème dans la programmation d'un morpion
« Reply #7 on: June 02, 2011, 12:37:23 pm »
J'ai résolu une partie du problème. La condition est maintenant placé dans la boucle principale.
Le deuxième problème qui affichait les pions aléatoirement était en fait du au fait qu'il ne fallait pas mettre :
Code: [Select]
P+3Q
mais :
Code: [Select]
P+3*Q
Cependant ce n'est pas entièrement résolu puisque maintenant seul un des trois case du haut peut être occupé par un pion sinon cela ne fonctionne pas et, bizarrement les deux dernières case sont identifiés par {l+8} et {l+10} alors que toutes les autres ont le bon emplacement.

Offline reop

  • LV1 Newcomer (Next: 20)
  • *
  • Posts: 6
  • Rating: +0/-0
    • View Profile
Re: [Axe Parser] Problème dans la programmation d'un morpion
« Reply #8 on: June 02, 2011, 12:42:28 pm »
En fait oublie mon message précédent. J'avais oublié que l'Axe Parser ne tenait pas compte des priorités. Il fallait donc mettre :
Code: [Select]
P+(3*Q)Le jeu a l'air de fonctionner parfaitement pour l'instant, sans aucun problème !
« Last Edit: June 02, 2011, 12:43:38 pm by reop »

Offline kindermoumoute

  • LV8 Addict (Next: 1000)
  • ********
  • Posts: 836
  • Rating: +54/-3
    • View Profile
Re: [Axe Parser] Problème dans la programmation d'un morpion
« Reply #9 on: June 03, 2011, 06:05:23 am »
En fait oublie mon message précédent. J'avais oublié que l'Axe Parser ne tenait pas compte des priorités. Il fallait donc mettre :
Code: [Select]
P+(3*Q)Le jeu a l'air de fonctionner parfaitement pour l'instant, sans aucun problème !
Ou plus simplement Q*3+P ;)
Projects :

Worms armageddon z80 :
- smoothscrolling Pixelmapping : 100%
- Map editor : 80%
- Game System : 0%

Tutoriel français sur l'Axe Parser
- 1ère partie : en ligne.
- 2ème partie : en ligne.
- 3ème partie : en ligne.
- 4ème partie : 10%
- Annexe : 100%

Offline reop

  • LV1 Newcomer (Next: 20)
  • *
  • Posts: 6
  • Rating: +0/-0
    • View Profile
Re: [Axe Parser] Problème dans la programmation d'un morpion
« Reply #10 on: June 04, 2011, 08:03:37 am »
Ah oui je n'y avais pas pensé sur le coup. Merci !