Omnimaga: The Coders Of Tomorrow
Welcome, Guest. Please login or register.
 
Omnimaga: The Coders Of Tomorrow
24 May, 2013, 08:38:57 *
Welcome, Guest. Please login or register.

Login with username, password and session length
 
   home   news downloads projects tutorials misc forums rules new posts irc about Login Register  
+-OmnomIRC

You must Register, be logged in and have at least 40 posts to use this shout-box! If it still doesn't show up afterward, it might be that OmnomIRC is disabled for your group or under maintenance.

Note: You can also use an IRC client like mIRC, X-Chat or Mibbit to connect to an EFnet server and #omnimaga.

Pages: [1]   Go Down
  Print  
Author Topic: [Axe Parser] Problème dans la programmation d'un morpion -  (Read 1091 times) Bookmark and Share
0 Members and 1 Guest are viewing this topic.
reop
LV1 Newcomer (Next: 20)
*
Offline Offline

Last Login: 02 December, 2011, 22:25:58
Date Registered: 01 June, 2011, 21:09:54
Posts: 6

Topic starter
Total Post Ratings: 0

View Profile
« on: 01 June, 2011, 22:05:43 »
0

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 :


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
.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: 01 June, 2011, 22:12:28 by reop » Logged
kindermoumoute
LV8 Addict (Next: 1000)
********
Offline Offline

Last Login: 20 May, 2013, 23:02:59
Date Registered: 15 May, 2010, 17:53:56
Posts: 836


Total Post Ratings: +51

View Profile
« Reply #1 on: 02 June, 2011, 02:52:22 »
0

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 :



1
2
3
4
5
6
7
(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.
Logged

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%
DJ Omnimaga
Retired Omnimaga founder (Site issues must be PM'ed to Netham45, Eeems, Shmibs, Deep Thought and AngelFish, not me.)
Editor
LV15 Omnimagician (Next: --)
*
Online Online

Gender: Male
Last Login: Today at 08:21:29
Date Registered: 25 August, 2008, 07:00:21
Location: Québec (Canada)
Posts: 50232


Total Post Ratings: +2615

View Profile WWW
« Reply #2 on: 02 June, 2011, 06:46:23 »
0

Bienvenue sur le forum Cheesy
Logged

Retired 83+ coder, Omnimaga/TIMGUL founder. Now doing power metal music (formerly did electronica)

Follow me on Bandcamp|Facebook|Reverbnation|Youtube|Twitter|Myspace
reop
LV1 Newcomer (Next: 20)
*
Offline Offline

Last Login: 02 December, 2011, 22:25:58
Date Registered: 01 June, 2011, 21:09:54
Posts: 6

Topic starter
Total Post Ratings: 0

View Profile
« Reply #3 on: 02 June, 2011, 11:05:31 »
0

Bienvenue à toi !

Bienvenue sur le forum Cheesy

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 :


1
2
3
4
5
6
7
(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.


1
2
(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.


1
2
(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.


1
if V≠0 or W≠0

Si V≠0 ou W≠0, c'est-à-dire si le curseur a bougé ...


1
2
(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: 02 June, 2011, 11:10:59 by reop » Logged
kindermoumoute
LV8 Addict (Next: 1000)
********
Offline Offline

Last Login: 20 May, 2013, 23:02:59
Date Registered: 15 May, 2010, 17:53:56
Posts: 836


Total Post Ratings: +51

View Profile
« Reply #4 on: 02 June, 2011, 12:10:54 »
0

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 :

1
2
:(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 :

1
2
3
: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 :

1
2
3
4
5
6
7
8
9
10
11
: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 :

1
: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. Smiley
« Last Edit: 02 June, 2011, 12:11:50 by kindermoumoute » Logged

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%
reop
LV1 Newcomer (Next: 20)
*
Offline Offline

Last Login: 02 December, 2011, 22:25:58
Date Registered: 01 June, 2011, 21:09:54
Posts: 6

Topic starter
Total Post Ratings: 0

View Profile
« Reply #5 on: 02 June, 2011, 12:50:50 »
0

En effet, quand j'enlève la condition :

1
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 :

1
:Repeat getKey(15) or getKey(33)

Oui mais il y a une condition juste à la sortie de la boucle :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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.
Logged
kindermoumoute
LV8 Addict (Next: 1000)
********
Offline Offline

Last Login: 20 May, 2013, 23:02:59
Date Registered: 15 May, 2010, 17:53:56
Posts: 836


Total Post Ratings: +51

View Profile
« Reply #6 on: 02 June, 2011, 14:22:14 »
0

Cela dépend de quand est ce que tu appuie sur la touche. Wink
Logged

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%
reop
LV1 Newcomer (Next: 20)
*
Offline Offline

Last Login: 02 December, 2011, 22:25:58
Date Registered: 01 June, 2011, 21:09:54
Posts: 6

Topic starter
Total Post Ratings: 0

View Profile
« Reply #7 on: 02 June, 2011, 18:37:23 »
0

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 :

1
P+3Q

mais :

1
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.
Logged
reop
LV1 Newcomer (Next: 20)
*
Offline Offline

Last Login: 02 December, 2011, 22:25:58
Date Registered: 01 June, 2011, 21:09:54
Posts: 6

Topic starter
Total Post Ratings: 0

View Profile
« Reply #8 on: 02 June, 2011, 18:42:28 »
0

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 :

1
P+(3*Q)
Le jeu a l'air de fonctionner parfaitement pour l'instant, sans aucun problème !
« Last Edit: 02 June, 2011, 18:43:38 by reop » Logged
kindermoumoute
LV8 Addict (Next: 1000)
********
Offline Offline

Last Login: 20 May, 2013, 23:02:59
Date Registered: 15 May, 2010, 17:53:56
Posts: 836


Total Post Ratings: +51

View Profile
« Reply #9 on: 03 June, 2011, 12:05:23 »
0

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 :

1
P+(3*Q)
Le jeu a l'air de fonctionner parfaitement pour l'instant, sans aucun problème !
Ou plus simplement Q*3+P Wink
Logged

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%
reop
LV1 Newcomer (Next: 20)
*
Offline Offline

Last Login: 02 December, 2011, 22:25:58
Date Registered: 01 June, 2011, 21:09:54
Posts: 6

Topic starter
Total Post Ratings: 0

View Profile
« Reply #10 on: 04 June, 2011, 14:03:37 »
0

Ah oui je n'y avais pas pensé sur le coup. Merci !
Logged
Pages: [1]   Go Up
  Print  
 
Jump to:  

Powered by EzPortal
Powered by MySQL Powered by SMF 1.1.18 | SMF © 2013, Simple Machines Powered by PHP
Page created in 0.668 seconds with 31 queries.
Skin by DJ Omnimaga edited from SMF default theme with the help of tr1p1ea.
All programs, games and songs avaliable on this website are property of their respective owners.
Best viewed in Opera, Firefox, Chrome and Safari with a resolution of 1024x768 or above.