Mai 2024 | Lun | Mar | Mer | Jeu | Ven | Sam | Dim |
---|
| | 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 | | | Calendrier |
|
| | Jeu d'Echecs | |
| | |
Auteur | Message |
---|
Marc
Nombre de messages : 2392 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Jeu d'Echecs Jeu 7 Jan 2021 - 18:45 | |
| Bonjour à tous ! Rubrique: Et bien j’ai envie de développer un jeu d’échecs. Un jeu d’échecs tout simple, où l’on joue à deux personnes physiques. Hors de question de créer une intelligence artificielle pour jouer contre l’ordinateur : j’en serais bien incapable et de plus, je ne connais quasiment rien aux échecs. Après avoir lu l’article de Wikipédia sur le sujet -ce qui m’a permis d’apprendre beaucoup de choses sur le jeu d’échecs-, je souhaiterais créer un simple plateau de jeu équipé de ses pièces. Puis, si tout va bien, y adjoindre une pendule avec les différents modes de jeu. Et pour finir, ajouter une feuille de partie avec sauvegarde et possibilité de rejouer une partie. J’ai déjà couché sur papier pas mal d’idées et de dessins. Je ne sais pas encore comment je vais pouvoir gérer les différents évènements avec une pendule qui tourne en tache de fond… On verra le moment venu ! Et puis l'union fait la force, avec l'aide de tous les Panoramiciens, nous devrions y arriver ! Allez hop, c’est parti ! En espérant que mon projet ne se termine pas par un échec ! A bientôt ! | |
| | | Jack Admin
Nombre de messages : 2386 Date d'inscription : 28/05/2007
| Sujet: Re: Jeu d'Echecs Jeu 7 Jan 2021 - 22:21 | |
| Très bonne idée que de lancer un tel projet ! _________________ username : panoramic@jack-panoramic password : panoramic123 | |
| | | mimic
Nombre de messages : 103 Localisation : france Date d'inscription : 02/09/2009
| Sujet: Re: Jeu d'Echecs Ven 8 Jan 2021 - 11:26 | |
| Bonjour, J'ai déjà essayé d'implémenter une variante personnelle (règles différentes) du jeu d’échecs, le code n'est pas commenté, mais si cela peut aider je peux le poster. | |
| | | Marc
Nombre de messages : 2392 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Jeu d'Echecs Ven 8 Jan 2021 - 12:07 | |
| Bonjour tous ! - Jack a écrit:
- Très bonne idée que de lancer un tel projet !
Merci Jack ! - Mimic a écrit:
- ...mais si cela peut aider je peux le poster.
Merci Mimic ! Oui, je suis intéressé. Je suis preneur de tous renseignements, idées, suggestions, critiques… Voici une première vue, accompagnée de son code-source, du plateau de jeu. Vous pouvez cliquer dessus ! Les coordonnées de la souris et de la case cliquée s’afficheront dans la caption 0. Bien entendu, ceci est provisoire, juste le temps de la mise au point. - Code:
-
' Jeu d'Echecs ' Janvier 2021
label clic
interfaceUtilisateur()
on_click 10,clic
end
clic: identiferCaseCliquee() return
sub identiferCaseCliquee() dim_local x%,y%,a,o x% = mouse_x_position(10)-30 y% = 590 - mouse_y_position(10) if x% > 0 and y% > 0 and x% < 560 and y% < 560 a = int(x% / 70) + 1 o = int(y% / 70) + 1 end_if caption 0,str$(x%) + " / "+str$(y%) + " Case : "+str$(a) + " / " + str$(o) end_sub
sub interfaceUtilisateur() width 0,width(0) - width_client(0) + 619 height 0,height(0) - height_client(0) + 619 top 0,(screen_y - height(0)) / 2 left 0,(screen_x - width(0)) / 2 picture 1 2d_target_is 1 ' hide 1
scene2d 10 width 10,619 height 10,619 hide 10
creerUneCaseFoncee() creerUneCaseClaire() creerDamier() creerCadreDamier() creerReglesCoordonnees() assemblagePlateauJeu()
show 10 end_sub
sub creerUneCaseFoncee() dim_local i%,x%,y%,r%,v%,b%,c% r% = 222 v% = 195 b% = 160 width 1,71 height 1,71 color 1,r%,v%,b% for i% = 1 to 1500 c% = rnd(25) 2d_pen_color r%-c%,v%-c%,b%-c% x% = rnd(71) y% = rnd(71) 2d_line x%,y%,x%+rnd(5),y% next i% 2d_pen_color 51,51,0 2d_fill_off 2d_rectangle 0,0,71,71 image 2 2d_image_copy 2,0,0,71,71 end_sub
sub creerUneCaseClaire() dim_local i%,x%,y%,r%,v%,b%,c% r% = 245 v% = 228 b% = 200 width 1,71 height 1,71 color 1,r%,v%,b% for i% = 1 to 1500 c% = rnd(25) 2d_pen_color r%-(c%/2),v%-c%,b%-(c%/4) x% = rnd(71) y% = rnd(71) 2d_line x%,y%,x%,y%+rnd(5) next i% 2d_pen_color 51,51,0 2d_fill_off 2d_rectangle 0,0,71,71 image 3 2d_image_copy 3,0,0,71,71 end_sub
sub creerDamier() dim_local n%,x%,y% width 1,617 height 1,617 for n% = 1 to 32 if odd(y%) = 0 2d_image_paste 3,x%*70,y%*70 x% = x% + 1 2d_image_paste 2,x%*70,y%*70 x% = x% + 1 else 2d_image_paste 2,x%*70,y%*70 x% = x% + 1 2d_image_paste 3,x%*70,y%*70 x% = x% + 1 end_if if x% > 7 x% = 0 y% = y% + 1 end_if next n% image 4 2d_image_copy 4,0,0,561,561 sprite 50 sprite_image_load 50,4 end_sub
sub creerCadreDamier() dim_local i%,x%,y%,r%,v%,b%,c% r% = 222 v% = 195 b% = 160 ' bordure horizontale haute width 1,619 height 1,29 color 1,r%,v%,b% for i% = 1 to 3000 c% = rnd(25) 2d_pen_color r%-c%,v%-c%,b%-c% x% = rnd(619) y% = rnd(29) 2d_line x%,y%,x%+rnd(5),y% next i% 2d_pen_color 0,0,0 ' découpe à 45° extrémité gauche for i% = 1 to 28 2d_line 0,i%,i%,i% next i% ' découpe à 45° extrémité droite for i% = 1 to 28 2d_line 619-i%,i%,619,i% next i% image 5 2d_image_copy 5,0,0,619,29 sprite 51 sprite_image_load 51,5
' bordure verticale droite width 1,29 height 1,619 color 1,r%,v%,b% for i% = 1 to 3000 c% = rnd(25) 2d_pen_color r%-c%,v%-c%,b%-c% x% = rnd(29) y% = rnd(619) 2d_line x%,y%,x%,y%+rnd(5) next i% 2d_pen_color 0,0,0 ' découpe à 45° extrémité haute for i% = 0 to 28 2d_line 0,i%,28-i%,i% next i% ' découpe à 45° extrémité droite for i% = 0 to 28 2d_line 0,590+i%,i%,590+i% next i% image 6 2d_image_copy 6,0,0,29,619 sprite 52 sprite_image_load 52,6
' bordure horizontale basse width 1,619 height 1,29 color 1,r%,v%,b% for i% = 1 to 3000 c% = rnd(25) 2d_pen_color r%-c%,v%-c%,b%-c% x% = rnd(619) y% = rnd(29) 2d_line x%,y%,x%+rnd(5),y% next i% 2d_pen_color 0,0,0 ' découpe à 45° extrémité gauche for i% = 0 to 28 2d_line 0,i%,28-i%,i% next i% ' découpe à 45° extrémité droite for i% = 0 to 28 2d_line 591+i%,i%,619,i% next i% image 7 2d_image_copy 7,0,0,619,29 sprite 53 sprite_image_load 53,7
' bordure verticale gauche width 1,29 height 1,619 color 1,r%,v%,b% for i% = 1 to 3000 c% = rnd(25) 2d_pen_color r%-c%,v%-c%,b%-c% x% = rnd(29) y% = rnd(619) 2d_line x%,y%,x%,y%+rnd(5) next i% 2d_pen_color 0,0,0 ' découpe à 45° extrémité haute for i% = 0 to 29 2d_line i%+1,i%,29,i% next i% ' découpe à 45° extrémité droite for i% = 0 to 28 2d_line 28-i%,591+i%,29,591+i% next i% image 8 2d_image_copy 8,0,0,29,619 sprite 54 sprite_image_load 54,8 end_sub
sub creerReglesCoordonnees() ' règle abscisse lettres width 1, 503 height 1,12 color 1,0,0,0 2d_pen_color 51,51,0 ' lettre A 2d_line 6,0,6,2 2d_line 5,2,5,4 2d_line 4,4,4,6 2d_line 3,6,3,9 2d_line 2,9,2,12 2d_line 0,11,4,11 2d_point 1,10 2d_line 4,7,9,7 2d_line 7,0,7,5 2d_line 8,2,8,8 2d_line 9,5,9,12 2d_line 10,8,10,12 2d_line 8,11,13,11 2d_point 11,10 ' lettre B 2d_line 70,0,79,0 2d_line 72,1,72,11 2d_line 73,1,73,11 2d_line 70,11,79,11 2d_line 74,5,79,5 2d_line 78,0,78,7 2d_line 79,1,79,5 2d_line 79,6,79,11 2d_line 80,7,80,10 2d_point 78,10 ' lettre C 2d_line 140,4,140,9 2d_line 141,2,141,10 2d_line 142,1,142,3 2d_line 142,9,142,11 2d_point 143,1 2d_point 143,10 2d_line 144,0,148,0 2d_line 148,1,151,1 2d_line 150,0,150,4 2d_line 143,11,149,11 2d_point 149,10 2d_point 150,9 ' lettre D 2d_line 210,0,219,0 2d_line 212,0,212,11 2d_line 213,0,213,11 2d_line 210,11,218,11 2d_line 218,1,220,1 2d_line 219,2,221,2 2d_line 220,3,220,10 2d_line 221,3,221,9 2d_line 219,9,221,9 2d_line 218,10,220,10 ' lettre E 2d_line 280,0,290,0 2d_line 289,0,289,3 2d_line 282,1,282,11 2d_line 283,1,283,11 2d_line 280,11,290,11 2d_point 289,10 2d_point 290,9 2d_line 284,5,288,5 2d_line 287,3,287,8 ' lettre F 2d_line 350,0,360,0 2d_line 359,0,359,3 2d_line 352,1,352,11 2d_line 353,1,353,11 2d_line 350,11,356,11 2d_line 354,5,358,5 2d_line 357,3,357,8 ' lettre G 2d_line 420,3,420,9 2d_line 421,2,421,10 2d_line 422,1,422,3 2d_point 423,1 2d_line 422,8,422,11 2d_line 422,10,425,10 2d_line 424,11,430,11 2d_line 427,5,433,5 2d_line 429,6,429,11 2d_line 430,6,430,11 2d_line 424,0,428,0 2d_line 428,1,431,1 2d_line 430,0,430,4 ' lettre H 2d_line 490,0,496,0 2d_line 497,0,503,0 2d_line 492,1,492,11 2d_line 493,1,493,11 2d_line 490,11,496,11 2d_line 497,11,503,11 2d_line 494,5,499,5 2d_line 499,1,499,11 2d_line 500,1,500,11 2d_image_copy 2,0,0,503,12 sprite 55 sprite_image_load 55,2
' règle Ordonnee chiffres width 1, 8 height 1,502 color 1,0,0,0 2d_pen_color 51,51,0 ' chiffre 8 2d_line 1,0,6,0 2d_line 0,1,0,4 2d_line 1,0,1,5 2d_line 5,0,5,4 2d_line 6,1,6,3 2d_line 2,4,2,7 2d_line 4,4,4,7 2d_point 3,5 2d_line 1,6,1,12 2d_line 0,7,0,11 2d_line 5,6,5,11 2d_line 6,7,6,11 2d_point 2,10 2d_line 1,11,5,11 ' chiffre 7 2d_line 1,70,8,70 2d_line 1,71,7,71 2d_point 0,72 2d_point 6,72 2d_line 5,73,5,76 2d_line 4,76,4,78 2d_line 3,78,3,81 2d_point 2,81 ' chiffre 6 2d_line 5,140,8,140 2d_line 3,141,6,141 2d_line 2,142,4,142 2d_line 1,143,3,143 2d_point 1,144 2d_line 3,144,6,144 2d_line 0,145,3,145 2d_line 5,145,7,145 2d_line 0,145,0,150 2d_line 1,145,1,151 2d_point 2,150 2d_line 2,151,6,151 2d_point 5,150 2d_line 6,146,6,151 2d_line 7,146,7,150 ' cjiffre 5 2d_line 3,210,7,210 2d_line 2,211,7,211 2d_point 2,212 2d_line 2,213,4,213 2d_line 1,214,6,214 2d_line 4,215,7,215 2d_point 5,216 2d_line 6,215,6,220 2d_point 5,220 2d_line 0,220,2,220 2d_line 0,221,5,221 ' chiffre 4 2d_line 5,280,5,292 2d_line 6,280,6,292 2d_point 4,282 2d_point 3,283 2d_line 2,284,2,286 2d_point 1,286 2d_point 0,287 2d_line 0,288,8,288 ' chiffre 3 2d_line 2,350,6,350 2d_line 0,351,2,351 2d_point 0,352 2d_line 4,351,7,351 2d_line 5,352,7,352 2d_line 5,353,7,353 2d_line 4,354,6,354 2d_line 3,355,7,355 2d_point 5,356 2d_line 6,356,6,361 2d_line 7,356,7,360 2d_line 5,360,7,360 2d_line 0,360,2,360 2d_line 0,361,5,361 ' chiffre 2 2d_line 2,420,6,420 2d_point 1,421 2d_point 0,422 2d_point 4,421 2d_line 5,420,5,426 2d_line 6,421,6,425 2d_line 4,426,4,428 2d_line 3,427,3,429 2d_point 2,429 2d_point 7,429 2d_line 1,430,8,430 2d_line 0,431,7,431 ' chiffre 1 2d_line 1,491,3,491 2d_line 3,490,3,501 2d_line 4,490,4,501 2d_line 1,501,7,501 2d_image_copy 2,0,0,8,502 sprite 56 sprite_image_load 56,2 end_sub
sub assemblagePlateauJeu() sprite_position 50,29,29 sprite_position 51,0,0 sprite_position 52,590,0 sprite_position 53,0,590 sprite_position 54,0,0 sprite_position 55,58,598 sprite_position 56,11,59 end_sub
Bonne journée à tous ! | |
| | | jjn4
Nombre de messages : 2704 Date d'inscription : 13/09/2009
| Sujet: Re: Jeu d'Echecs Ven 8 Jan 2021 - 14:32 | |
| J'avais travaillé un peu le même projet que toi, il y a quelques années, en moins ambitieux mais avec quelques idées créatives. Je te le mets sur le webdav n° 1 (panoramic@jjn4 + panoramic123) au cas où tu voudrais t'en inspirer (il est trop long pour rentrer dans ce forum). Pareil, ce n'est pas un simulateur qui joue, c'est juste une table d'exercice pour apprendre). (et il est trop long pour rentrer directement dans ce forum). | |
| | | Marc
Nombre de messages : 2392 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Jeu d'Echecs Ven 8 Jan 2021 - 17:30 | |
| Merci beaucoup JJN4 !
C'est fait, j'ai téléchargé le dossier "Echecs" présent dans ton Webdav. | |
| | | Marc
Nombre de messages : 2392 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Jeu d'Echecs Dim 17 Jan 2021 - 1:46 | |
| Bonjour à tous ! J'ai commencé à dessiner le contour des différentes pièces du jeu. Chaque pièce est un sprite. Je les ai placées sur l'échiquier pour avoir un premier aperçu : Le code-source est disponible dans mon WebDav. A bientôt ! | |
| | | jjn4
Nombre de messages : 2704 Date d'inscription : 13/09/2009
| Sujet: Re: Jeu d'Echecs Dim 17 Jan 2021 - 14:34 | |
| Bon courage ! Parce que jusque là, c'est simple ! C'est après que ça se complique... | |
| | | Klaus
Nombre de messages : 12295 Age : 74 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Jeu d'Echecs Lun 18 Jan 2021 - 0:38 | |
| J'apporte également une petite contribution au jeud d'échecs. Il faut télécharger KGF.dll sur mon site (voir dans la signature de ce post). Puis exécuter le code suivant: - Code:
-
' test_jeu_echecs.bas
label close0
dim res%, CNV%, w%, h%, hc%, x1%, y1%, row1%, col1%, x2%, y2%, row2%, col2%, CB%
w% = 1 + 8*(48+1) h% = w% width 0,w%+50 height 0,h%+200 edit 101 : top 101,50+h%+10 : left 101,10 : width 101,w% edit 102 : top 102,top(101)+30 : left 102,10 : width 102,w%
dll_on "KGF.dll"
CB% = dll_call6("CreateChessBoard",handle(0),48,10,50,hex("8080FF"),hex("FFF0F0")) res% = dll_call2("SetChessBoardTrace",CB%,handle(102))
on_close 0,close0
end close0: res% = dll_call1("FreeCanvas",CNV%) return
On affiche un plateau de jeu d'échecs avec les figures en position initiale, les blans ayant le premier coup. On peut cliquer sur une case et un EDIT en bas de la fenêtre montre la pièce trouvée. On peut "tirer" un pion avec la souris sur une case autorisée, il se déplace et le mouvement est affiché en bas. Les mouvements interdits pour un pion sont bloqués. Un pion peut prendre une pièce adverse mais mas une pièce de la même couleur. Si un pion atteint la ligne de base adverse, il se transforme en dame. Si un pion prend le roi, on détecte "victoire" et aucun autre mouvement n'est possible. Après un mouvement d'un pion blanc, seul un pion noir peut bouger, et vice-versa. | |
| | | Marc
Nombre de messages : 2392 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Jeu d'Echecs Lun 18 Jan 2021 - 1:47 | |
| Merci et bravo Klaus ! La possibilité de "tirer" les pièces est sympa. Pour mon jeu, je ne sais pas encore comment je vais opérer le déplacement. Une autre possibilité serait de cliquer la pièce à déplacer puis cliquer la case de destination. Les algorithmes de gestion de ton jeu sont très poussés. Impossible de se tromper, tout est surveillé et verrouillé. Je suis curieux de connaître les techniques employées. J'ai remarqué quelques points : Je n'ai pas réussi à déplacer les cavaliers. Je ne peux pas avancer les pions blancs a2,b2,d2,g2 et h2 de deux cases lors de leur premier déplacement. Idem pour certains pions noirs. - Citation :
- Si un pion atteint la ligne de base adverse, il se transforme en dame.
J'ai lu que l'on avait le choix de la promotion : dame, tour, cavalier ou fou. Je vais prévoir ces différentes possibilités. Lors du jeux, j'ai assez souvent une "violation d'accès...." - Spoiler:
En tout cas encore bravo ! De mon coté la route est encore très longue et les heures disponibles pour programmer ne sont pas assez nombreuses. | |
| | | Klaus
Nombre de messages : 12295 Age : 74 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Jeu d'Echecs Lun 18 Jan 2021 - 2:25 | |
| Merci d'avoir testé, Marc. Je vais vérifier ce défaut de déplacement des pions que tu as constaté. En attendant, je suis en train de coder le déplacement des tours. Ca marche déjà chez moi, pour les tours blanches. Ta remarque sur le remplacement du pion arrivé en bout de course est judicieuse. Je vais prévoir un choix à ce niveau, également. Juste pour donner une idée, je poste ci-après le code de "verrouillage" pour un pion blanc (enn fait, tout le traitement du déplacement d'un pion blanc): - Code:
-
0: begin // white pawn // vérifier l'autorisation de déplacement bad := false; if (EndRow<=StartRow) or (EndRow>StartRow+2) then bad := true; if not bad then if (StartRow>1) and (EndRow>StartRow+1) then bad := true; if not bad then if StartCol<>EndCol then begin if (StartCol<>EndCol-1) and (StartCol<>EndCol+1) then bad := true; if not bad then if fField[EndCol,EndRow].Piece=cpNone then bad := true; if not bad then if (fField[EndCol,EndRow].Piece<>cpNone) and (fField[EndCol,EndRow].Color=ccWhite) then bad := true; end else begin if not bad then if (EndRow=StartRow+2) and (fField[EndRow-1,EndCol].Piece<>cpNone) then bad := true; if not bad then if fField[EndCol,EndRow].Piece<>cpNone then bad := true; end;
// déplacer le pion blanc if bad then begin s := 'Mouvement impossible'; end else begin s := 'Déplacer Pion blanc de '+chr(64+StartCol)+chr(48+StartRow)+' en '+chr(64+EndCol)+chr(48+EndRow); victory := (fField[EndCol,EndRow].Piece=cpKing) and (fField[EndCol,EndRow].Color=ccBlack); if victory then s := s + ' *** VICTORE ***'; fField[EndCol,EndRow].Piece := fField[StartCol,StartRow].Piece; fField[EndCol,EndRow].Color := fField[StartCol,StartRow].Color; if EndRow=7 then fField[EndCol,EndRow].Piece := cpQueen; // white pawn gains a white queen ! fField[StartCol,StartRow].Piece := cpNone; fField[StartCol,StartRow].Color := ccNone; NextMove := ccBlack; if victory then NextMove := ccNone; self.Paint; end;
// log if Trace<>0 then SendMessage(Trace,WM_SetText,0,integer(@s[1])); end; | |
| | | Klaus
Nombre de messages : 12295 Age : 74 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Jeu d'Echecs Lun 18 Jan 2021 - 9:30 | |
| - Citation :
- La possibilité de "tirer" les pièces est sympa. Pour mon jeu, je ne sais pas encore comment je vais opérer le déplacement. Une autre possibilité serait de cliquer la pièce à déplacer puis cliquer la case de destination.
Pour ce faire, il te faut: - 2 jeux de variables: le premier identifiant la case et la pièce d'origine, le second identifiant la case (et éventuellement la pièce) de destination - tu n'utiliseras pas l'évènement 0N_CLICK - tu utilises l'évènement ON_MOUSE_DOWN pour la case de départ, et tu gardes le bouton gauche enfoncé - tu "tires" la pièce jusqu'à la case de destination et tu relâches le bouton gauche - tu utilises l'évènement ON_MOUSE_UP pour identifier la cible. - dans ON_MOUSE_DOWN, tu utilises la fonction MOUSE_X_LEFT_DOWN et MOUSE_Y_LEFT_DOWN pour obtenir les coordoonnées en pixels, relatifs à l'objet - dans ON_MOUSE_UP, tu utilises la fonction MOUSE_X_LEFT_UP et MOUSE_Y_LEFT_UP pour obtenir les coordoonnées en pixels, relatifs à l'objet - tu effectues ensuite un savant calcul pour convertir les pixels en numéros de ligne et de colonne, et le tout est joué. EDITLe problème de la violation de mémoire vient d'être corrigé également. EDITJ'ai corrigé le mouvement des pions dont tu m'as indiqué les anomalies. Voici la partie concernant le pion blanc: - Code:
-
0: begin // white pawn // vérifier l'autorisation de déplacement bad := false; if (EndRow<=StartRow) or (EndRow>StartRow+2) then bad := true; if not bad then if (StartRow>1) and (EndRow>StartRow+1) then bad := true; if not bad then if StartCol<>EndCol then begin if (StartCol<>EndCol-1) and (StartCol<>EndCol+1) then bad := true; if not bad then if fField[EndCol,EndRow].Piece=cpNone then bad := true; if not bad then if (fField[EndCol,EndRow].Piece<>cpNone) and (fField[EndCol,EndRow].Color=ccWhite) then bad := true; end else begin if not bad then if (EndRow=StartRow+2) and (fField[EndCol,EndRow-1].Piece<>cpNone) then bad := true; if not bad then if fField[EndCol,EndRow].Piece<>cpNone then bad := true; end;
// déplacer le pion blanc if bad then begin s := 'Mouvement impossible'; end else begin s := 'Déplacer Pion blanc de '+chr(64+StartCol)+chr(48+StartRow)+' en '+chr(64+EndCol)+chr(48+EndRow); victory := (fField[EndCol,EndRow].Piece=cpKing) and (fField[EndCol,EndRow].Color=ccBlack); if victory then s := s + ' *** VICTORE ***'; fField[EndCol,EndRow].Piece := fField[StartCol,StartRow].Piece; fField[EndCol,EndRow].Color := fField[StartCol,StartRow].Color; if EndRow=7 then fField[EndCol,EndRow].Piece := cpQueen; // white pawn gains a white queen ! fField[StartCol,StartRow].Piece := cpNone; fField[StartCol,StartRow].Color := ccNone; NextMove := ccBlack; if victory then NextMove := ccNone; self.Paint; end;
// log if Trace<>0 then SendMessage(Trace,WM_SetText,0,integer(@s[1])); end;
D'ailleurs, les tours blanches et noires peuvent bouger aussi, maintenant. Le reste suivra.. EDITCes cavaliers blancs et noirs bougent aussi, maintenant ! EDITLes fous blancs et noirs bougent aussi, maintenant ! EDITUn pion arrivant sur la ligne de base adverse peut se changer en un officier au choix (tout, cavalier, fou ou reine). Un petit dialogue s'affiche automatiquement. Il suffit de cocher la bonen option (défaut: reine), et le pion est remplacé par la pièce choisie. | |
| | | jjn4
Nombre de messages : 2704 Date d'inscription : 13/09/2009
| Sujet: Re: Jeu d'Echecs Lun 18 Jan 2021 - 15:59 | |
| - Marc a écrit:
- Pour mon jeu, je ne sais pas encore comment je vais opérer le déplacement.
Une autre possibilité serait de cliquer la pièce à déplacer puis cliquer la case de destination. Oui, en général, dans les jeux d'échec électronique, c'est comme ça que ça marche, l'ordinateur ne pouvant pas deviner quelle pièce on veut déplacer et où on veut la mettre Bon courage pour la suite ! (je sens qu'un nouveau Kasparov est en train de naître...) | |
| | | Klaus
Nombre de messages : 12295 Age : 74 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Jeu d'Echecs Lun 18 Jan 2021 - 16:14 | |
| Dans ma version, les reines blanches et noires bougent aussi, maintenant !
Prochainement, les rois bougeront aussi. Et je suis en train de créer une fonction permettant de déplacer une pièce par programme, en donnant les oordonnées de départ et d'arrivée, avec tous les contrôles nécessaires. Cette fonction pourra également effectuer un Roque.
| |
| | | Klaus
Nombre de messages : 12295 Age : 74 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Jeu d'Echecs Lun 18 Jan 2021 - 17:07 | |
| Les rois blancs et noirs bougent aussi !
Maintenant, toutes les pièces sont mobiles, avec contrôle des règles de déplacement, de prise de pièces et de victire d'un camp ou d'un autre.
Prochaine étape: commander les deplacements par une fonction, y compris le roque. | |
| | | Klaus
Nombre de messages : 12295 Age : 74 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Jeu d'Echecs Lun 18 Jan 2021 - 18:25 | |
| Les déplacements par programme sont maintenant possibles, y compris le grand et petit roque pour joeur blanc ou noir. Voici un aperçu des fonctions créées: - Code:
-
CB% = dll_call6("CreateChessBoard",handle(dest%),IconSize%,left%,top%,CouleurSombre%,CouleurClaire%) dest% = numéro d'objet dans lequel l'échiquer doit apparaître IconSize: taille des icônes valeurs possibles: 16 ou 48 left%, top%: position de l'échiquier dans l'objet dest% CouleurSombre%, CouleurClaire%: couleurs RBG pour les nuances des cases
Résultat: CB% = identifiant de l'échiquer créé
res% = dll_call2("SetChessBoardTrace",CB%,handle(edit%)) edit% = numéro d'un objet EDIT Panoramic recevant la trace de chaque mouvement
Résultat: res%: -1=erreur 0=ok
res% = dll_call6("MoveChessBoardPiece",CB%,StartCol%,StartRow%,EndCol%,EndRow%,Roque%) StartCol%, StartRow%: coordonnées de la pièce à déplacer (1...8) EndCol%, EndRow%: coordonnées de la case recevant la pièce à déplacer (1...8) Roque%: 0=pas de roque 1=petit roque 2=grand roque
Résultat: res%: -1=erreur 0=ol
Si la pièce à déplacer n'appartient pas au joueur dont c'est le tour, le mouvement est rejeté et le tour reste à qui de droit.
Si un roque est demandé, les paramètres StartCol%,StartRow%,EndCol%,EndRow% sont ignorés. Dans ce cas, le roque s'applique au joueur dont c'est le tour. Le tout passe au joueur opposé.
Quelque soit le type de mouvement demandé, il est soumis au contrôle des règles de déplacements et est rejeté si elles sont violées. Le tour reste au joueur ciblé par le mouvement. Si tout est valide, le résultat est affiché et le tour passe au joueur opposé.
Utilisation ? Développer vos propres interfaces utilisateur, intégrer un jeu d'échecs dans une application (je rappelle que la taille des icônes peut être 48x48 pixels, mais également 16x16 pixels ce qui permet un "mini-jeu" parfaitement fonctionnel), même des démos "téléguidées" à l'aide de MoveChessBoardPiece et d'un timer, par exemple. Il y aura bientôt une fonction permettant de "peubler" un échiquier afin de créer des exemples, de démstration de problèmes d'échecs etc. | |
| | | Marc
Nombre de messages : 2392 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Jeu d'Echecs Lun 18 Jan 2021 - 20:40 | |
| Bonsoir à tous !
@Klaus Je rentre à la maison et je vois que tu as abattu un travail énorme !
Quelle belle avancée !
Merci pour le code source d’exemple pour le pion, et merci pour tout le reste !
Je vais prendre un peu de temps pour tester ton jeu. Je continuerai le mien ultérieurement. | |
| | | Klaus
Nombre de messages : 12295 Age : 74 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Jeu d'Echecs Lun 18 Jan 2021 - 21:53 | |
| Eh bien, en voilà encore un rajout important: le peuplement du plateau avec une configuration quelconque ! On prépare la configuration dans un MEMO, et on appelle: - Code:
-
res% = dll_call3("PopulateChessBoard",CB%,handle(memo%),StartColor%) memo% = numéro d'un objet MEMO contenant la configuration StartColor: couleur du joueur de départ 1=blanc 2=noir Voici le programme de démo avec un bouton de peuplement: - Code:
-
' test_jeu_echecs.bas
label peupler
dim res%, w%, h%, hc%, x1%, y1%, row1%, col1%, x2%, y2%, row2%, col2%, CB%
w% = 1 + 8*(48+1) h% = w% width 0,w%+50 height 0,h%+200 button 101 : top 101,50+h%+10 : left 101,10 : width 101,w% : caption 101,"Peupler l'échiquer avec un exemple" on_click 101,peupler edit 102 : top 102,top(101)+30 : left 102,10 : width 102,w% memo 103 : hide 103 : bar_both 103
dll_on "KGF.dll"
CB% = dll_call6("CreateChessBoard",handle(0),48,10,50,hex("8080FF"),hex("FFF0F0")) res% = dll_call2("SetChessBoardTrace",CB%,handle(102))
end peupler: clear 103 item_add 103,"*****k**" item_add 103,"**b*****" item_add 103,"******r*" item_add 103,"********" item_add 103,"********" item_add 103,"**Q*****" item_add 103,"*****K**" item_add 103,"********" res% = dll_call3("PopulateChessBoard",CB%,handle(103),1) if res%<0 then message "Echec du peublement" return
P.S. Faudra recharger KGF.dll, bien sûr ! Pour le codage du conten du mémo, il faut: - 8 lignes de 8 caractères (chaque caractère représentant une case) - le caractère "*" représente une case vide - les caractères an majuscules sont des pièces blanches - les caractères an minuscules sont des pièces noires Les pièces sont codées comme suit: - PRHBQK = Pawn (pion), Rook (tour), Horse (cavalier), Bishop (fou), Queen (reine), King (roi), couleur blanche - idem avec prhbqk pour la couleur noire Amusez-vous ! Cela devrait même permettre de jouer contre l'ordinateur (l'ordinateur utilisant la fonction MoveChessBoardPiece pour jouer ses coups, et le joueur humain utilise la souris pour déplacer ses pions. Il vous reste à inventer une intelligence artificielle pour animer le jeu de l'ordinateur. Je peux même créer une fonctionnalité de mémoire des coups, avec possibilité d'annulation de chaque coup, jusqu'à la configuration de départ, si cela intéresse quelqu'un. Tel que c'est conçu, ce serait extrêmement simple. EDITPetit ajout de fonctionnalité: la prise "en passant" d'un pion par un autre est implémentée, selon les règles du jeu d'échecs. | |
| | | Marc
Nombre de messages : 2392 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Jeu d'Echecs Mar 19 Jan 2021 - 18:47 | |
| Excellent ! Bravo Klaus ! Reste un petit bug "violation..." lorsque l'on clique dans les dix derniers pixels de la colonne H. J'ai matérialisé cette zone en bleu : Bonne continuation ! Edit : J'ai évalué la zone critique à une largeur de 10 pixels, ce serait plutôt 15, voire 20 pixels de large. | |
| | | Klaus
Nombre de messages : 12295 Age : 74 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Jeu d'Echecs Mar 19 Jan 2021 - 20:10 | |
| Merci pour le diagnostic, Marc ! J'avais noté des crashs aléatoires, mais je n'avais pas pu trouver un diagnistic aussi précis. Cela me permettra de corriger ce problème.
As-tu vu le roque et la prise "en passant" ? | |
| | | Marc
Nombre de messages : 2392 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Jeu d'Echecs Mar 19 Jan 2021 - 20:59 | |
| @Klaus, En fait, les coordonnées sont légèrement décalées en abscisse sur toutes les cases. Ceci explique peut-être le plantage en fin de ligne, colonne H. Je n’ai pas réussi à effectuer le grand ou le petit roque. Je pense avoir bien respecté les règles dictées dans Wikipédia pour roquer : "Les conditions suivantes sont nécessaires pour pouvoir roquer : 1. aucune pièce ne se trouve entre le roi et la tour concernée ; 2. le roi et la tour concernée n'ont encore jamais joué ; 3. le roi n'est pas en échec ; 4. la case traversée par le roi n'est contrôlée par aucune pièce adverse."Je ne peux pas déplacer le roi de deux cases pour provoquer le roque. La prise en passant : excellent ! | |
| | | Klaus
Nombre de messages : 12295 Age : 74 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Jeu d'Echecs Mer 20 Jan 2021 - 0:42 | |
| - Citation :
- Je ne peux pas déplacer le roi de deux cases pour provoquer le roque.
Je n'ai pas pu imaginer un moyen non équivoque pour commander cela par la souris. Désolé. Mais le roque est accessible via la fonction MoveChessBoardPiece, par son dernier paramètre. Il suffit de placer un bouton dans la fenêtre et d'appeler cette fonction dans la routine ON_CLICK du bouton. Par contre, je remarque que je n'ai pas eu conscience de toutes les conditions nécessaires pour le roque. Je vais intégrer cela dans mes contrôles. | |
| | | Klaus
Nombre de messages : 12295 Age : 74 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Jeu d'Echecs Mer 20 Jan 2021 - 2:04 | |
| Le codage des contrôles du roque est en cours, selon les règles que tu as postées.
J'ai trouvé un moyen simple de commander le roque par la souris: faire glisser le roi sur la case vide juste à-côté de la tour. La distance horizontale dépassant alors 1 case, je déclenche le contrôle de légalité pour le roque potentiel. Si tout est bon, j'effectue le roque, sinon je rejette le déplacement.
J'ai déjà le contrôle si les cases entre le roi et la tour sont vides (condition 1). Je suis en train de coder la condition 2: ni roi ni tour concernée ont bougé auparavant. Les conditions 3 et 4 étant similaires (une aucune pièce adverse ne doit menacer la case concernée), ce contrôle sera réalisé en bloc après la condition 2.
Je te suis très reconnaissant de m'aider à progresser ainsi ! | |
| | | Marc
Nombre de messages : 2392 Age : 63 Localisation : TOURS (37) Date d'inscription : 17/03/2014
| Sujet: Re: Jeu d'Echecs Mer 20 Jan 2021 - 7:29 | |
| - Citation :
- J'ai trouvé un moyen simple de commander le roque par la souris: faire glisser le roi sur la case vide juste à-côté de la tour.
Ceci n’est valable que pour le petit roque. La détection serait plutôt : Si le roi se déplace de 2 cases en abscisse, vers la droite ou vers la gauche, alors il y a roque. Ce déplacement exceptionnel du roi de 2 cases n’étant autorisé que si les 4 conditions énumérées sont vraies. Puis, si un déplacement de 2 cases a été effectué, alors la tour concernée prend sa nouvelle place. Autre approche : Pour les blancs : Si les 4 conditions énumérées sont remplies, alors le roi est autorisé à se déplacer de 2 pas. Si le roi se déplace en G1 alors petit roque, la tour H1 va en F1 Si le roi se déplace en C1 alors grand roque, la tour A1 va en D1 Pour les noirs : Si les 4 conditions énumérées sont remplies, alors le roi est autorisé à se déplacer de 2 pas. Si le roi se déplace en G8 alors petit roque, la tour H8 va en F8 Si le roi se déplace en C8 alors grand roque, la tour A8 va en D8 | |
| | | Klaus
Nombre de messages : 12295 Age : 74 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Re: Jeu d'Echecs Mer 20 Jan 2021 - 10:59 | |
| J'ai progressé pour le roque. En déplacement du roi de deux cases latéralement, on vérifie que les conditions 1 et 2 sont remplies. Dans ce cas, le roque est effectué automatiquement.
Je suis en train de coder les conditions 3 et 4.. | |
| | | Contenu sponsorisé
| Sujet: Re: Jeu d'Echecs | |
| |
| | | | Jeu d'Echecs | |
|
| Permission de ce forum: | Vous ne pouvez pas répondre aux sujets dans ce forum
| |
| |
| |