Merci beaucoup ,
J'ai résoud le bug en mettant dans la méthode RAZ :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 public void RAZ() { for (int ligne = 0; ligne < 8; ligne++) for (int colonne = 0; colonne < 8; colonne++) { tab[colonne][ligne].setIcon(null); e.getCase(colonne, ligne).setPiece(null); tab[colonne][ligne].setCoupPossible(null); tab[colonne][ligne].setBorder(null); } champTexte.setText(""); boutonDebuter.setEnabled(true); e.debuter(); panelblanc.removeAll(); panelblanc.repaint(); panelnoir.removeAll(); panelnoir.repaint(); }
Donc grâce a vous , il reste :
- Revoir la fin de partie (echec et mat)
- Prise en passant
en fait j'ai trouvé le problème : le bug n'était pas tout à fait bien décrit
j'ai fait commencer, j'ai bougé des pièces, j'ai fait terminé, j'ai fait commencé et là impossible de cliquer sur des pièces : le cadre rouge ne s'affichait plus
je pouvais faire terminé, commencer autant de fois que je voulais ça marchait plus : et c'est là que j'ai cru qu'il y avait un bug
mais le bug était déjà le coup d'avant quand j'avais bougé mes pièces
en fait si tu fais terminé alors que c'est au noir de jouer, si tu fais commencer : tu joues les noirs pour commencer : donc impossible de cliquer sur la blancs (enfin les sang et or) : moi je croyais que tout était bloqué parce que je cliquais que sur les blancs évidemment, c'était le début de partie donc forcément
en fait il manque la réinitialisation de la variable couleurControle !
Ah oui en effet, je la réinitialise a String couleurControle = COULEUR_JOUEUR_BLANC; ? (j'ai essayé dans RAZ ) sauf que couleurControle n'ai pas utilisé d'après Eclispe,
Après j'ai essayé :Mais en vain
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if (eve.getSource() == boutonDebuter) { String couleurControle = COULEUR_JOUEUR_BLANC; //initialise le champ texte, apelle la methode debuter, et initialise toute les variables champTexte.setText(COULEUR_JOUEUR_BLANC + " a vous de jouer");
en fait la variable couleurControl est déclarée dans la classe GestionnaireEvenement
et la méthode RAZ est déclarée dans la classe FenetreJeu qui n'a pas de référence sur l'instance de GestionnaireEvenement, et donc ne peut pas modifier la variable couleurControle.
dans ton code :
tu déclares une nouvelle variable couleurControle locale au bloc if de la méthode mouseClicked, qui remplace la variable couleurControle de la classe GestionnaireEvenement dans le bloc
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 if (eve.getSource() == boutonDebuter) { String couleurControle = COULEUR_JOUEUR_BLANC; //initialise le champ texte, apelle la methode debuter, et initialise toute les variables champTexte.setText(COULEUR_JOUEUR_BLANC + " a vous de jouer");
comme dans le petit programme suivant, ou le résultat est "toto", pas "jambon"
donc il suffit que tu fasses :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public class TestVar { private String test; public void test() { test="toto"; if ( true ) { String test="jambon"; } System.out.println(test); } static void main(String[] args) { new TestVar().test(); } }
tant qu'à faire autant faire ce que j'ai mis en orange aussi
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 if (eve.getSource() == boutonDebuter) { couleurControle = COULEUR_JOUEUR_BLANC; // les blancs commencent //initialise le champ texte, apelle la methode debuter, et initialise toute les variables champTexte.setText(couleurControle + " a vous de jouer");
autre solution : on pourrait aussi déplacer la déclaration de couleurControle dans FenetreJeu ce qui permettrait à RAZ d'y avoir accès et de la modifier
nouvelle étape : la prise en passant
rappelons les règles :
- lorsqu'un pion est sur la cinquième ligne (dans le sens de sa couleur), et qu'un pion adverse d'une colonne adjacente qui se trouve dans sa position de départ avance de 2 cases se trouvant donc dans une case adjacente de la même ligne que ce pion, il peut prendre le pion adverse
on a donc 2 problèmes à gérer :
1) on a besoin de connaitre le coup précédent (pour savoir que le pion adverse s'est déplacé de 2 cases à partir de sa position de départ)
2) on a besoin de prévoir qu'un déplacement en diagonal du pion vers une case vide est exceptionnellement possible et permet de prendre le pion qui est dans une case à coté
on pourrait pour résoudre ça ajouter une variable à état qui permet de savoir qu'un pion s'est déplacé de 2 cases le coup d'avant
mais je pense à une autre solution, qui nous permettra plus tard de faire la sauvegarde de partie et aussi l'annulation de coup si on veut
pour cela on va créer une nouvelle classe
ensuite il faut "piloter" cette classe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80 import java.util.ArrayList; import java.util.List; /** * stocke les différents coups d'une partie */ public class Partie { private static List<Coup> coupsjoues = new ArrayList<Coup>(); /** * recommence une partie à zéro */ public static void reset() { coupsjoues.clear(); } /** * stocke un nouveau coup sans prise de pièce */ public static void nouveauCoup(String couleur, Piece piecejouee, Deplacement deplacement) { nouveauCoup(couleur, piecejouee, deplacement, null); } /** * stocke un nouveau coup avec prise de pièce */ public static void nouveauCoup(String couleur, Piece piecejouee, Deplacement deplacement, Piece pieceprise) { Coup coup = new Coup(); coup.couleur = couleur; coup.piecejouee = piecejouee; coup.depart = deplacement.getDepart(); coup.arrivee = deplacement.getArrivee(); coup.pieceprise = pieceprise; coupsjoues.add(coup); } /** * récupère le dernier coup joué */ public static Coup getDernierCoupJoue() { if ( coupsjoues.isEmpty() ) { return null; } else { return coupsjoues.get(coupsjoues.size()-1); } } /** * représente un coup */ public static class Coup { private String couleur; private Piece piecejouee; private Position depart, arrivee; private Piece pieceprise; public String getCouleur() { return couleur; } public Piece getPieceJouee() { return piecejouee; } public Position getDepart() { return depart; } public Position getArrivee() { return arrivee; } public Piece getPiecePrise() { return pieceprise; } } }
- dans RAZ ajouter un appel à Partie.reset()
- dans le code de la méthode mouseClicked, ajouter les appels à Piece.nouveauCoup(...) aux différents endroits nécessaire (déplacement vers une case vide, prise de pièce adverse,
- pour le roque, on stocke que le déplacement du roi (c'est suffisant puisqu'on déplace le roi de 2 cases, on peut reconnaitre que c'est un roque)
pour tester la prise en passant on va modifier captureParUnPionPossible : je te laisse réfléchir à cette modification (indice : utiliser la méthode Partie.getDernierCoupJoue())
Je me répète encore mais merci beaucoup !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 public void RAZ() { for (int ligne = 0; ligne < 8; ligne++) for (int colonne = 0; colonne < 8; colonne++) { tab[colonne][ligne].setIcon(null); e.getCase(colonne, ligne).setPiece(null); tab[colonne][ligne].setCoupPossible(null); tab[colonne][ligne].setBorder(null); } champTexte.setText(""); boutonDebuter.setEnabled(true); e.debuter(); panelblanc.removeAll(); panelblanc.repaint(); panelnoir.removeAll(); panelnoir.repaint(); Partie.reset(); }Au niveau des paramètres , est-ce les bons ?
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 else//si on depose la piece sur une case vide { //on met le tampon sur la case vide et on vide le tampon apres e.getCase(temp.getColonne(), temp.getLigne()).setPiece(null); tab[temp.getColonne()][temp.getLigne()].setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0),0)); // j'enleve le cadre rouge de la piece selectionne tab[colonneClic][ligneClic].setIcon(iconeTampon); e.getCase(colonneClic, ligneClic).setPiece(pieceTampon); // pour pouvoir le rebouger plusieurs fois dans une partie tab[temp.getColonne()][temp.getLigne()].setIcon(null); // permet de faire bouger la piece selectionne en supprimant la piece bouger de sa position initiale pieceTampon.enregistreDeplacement(true); Piece.nouveauCoup(couleurControle,pieceTampon,tab[temp.getColonne()][temp.getLigne()],null);
ça c'est bon.
là non
c'est plus ou moins le bon endroit
déjà pourquoi créer une méthode dans Piece ?
suffit
Code : Sélectionner tout - Visualiser dans une fenêtre à part Partie.nouveauCoup(...)
en plus le troisième argument de la méthode est de classe Deplacement, toi tu passes tab[temp.getColonne()][temp.getLigne()], qui est du type CaseLabel
et l'argument null fait qu'on ne stocke pas la pièce prise, ce qui nous posera pas de problème pour l'instant mais plus tard
en passant, une remarque sur le bout de code suivant :
pas terrible : si on ne mange pas de pièce on créé quand même un panel, vide, certes, mais bon pas terrible
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 //je cree un jLabel avec l'icone de la piece manger JLabel manger = new JLabel(tab[colonneClic][ligneClic].getIcon()); manger.setHorizontalAlignment(SwingConstants.CENTER); //je l'ajoute au bon jPanel if (couleurControle==(COULEUR_JOUEUR_BLANC)) panelblanc.add(manger); else panelnoir.add(manger);
on va remplacer ça déjà par :
en orange je récupère la pièce prise
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 Piece piecePrise = e.getCase(colonneClic, ligneClic).getPiece(); Icon iconPiecePrise = tab[colonneClic][ligneClic].getIcon(); if ( iconPiecePrise!=null ) { //je cree un jLabel avec l'icone de la piece manger JLabel manger = new JLabel(iconPiecePrise); manger.setHorizontalAlignment(SwingConstants.CENTER); //je l'ajoute au bon jPanel if (couleurControle==(COULEUR_JOUEUR_BLANC)) panelblanc.add(manger); else panelnoir.add(manger); }
et l'appel devient
ensuite le test, c'est à dire la modification captureParUnPionPossible
Code : Sélectionner tout - Visualiser dans une fenêtre à part Partie.nouveauCoup(couleurControle,pieceTampon,deplacement,piecePrise);
fait une méthode à part (dans Echiquier), qui teste le cas de la prise de la case ou ira le pion qui prend en passant, par exemple prisePionEnPassant(), ce qui nous sera utile pour effectuer le mouvement, et appelle là dans captureParUnPionPossible, sachant que si prisePionEnPassant renvoit true, captureParUnPionPossible retourne true, sinon le test normal (déjà fait) captureParUnPionPossible doit être fait.
le test prisePionEnPassant :
- si le dernier mouvement est celui d'un pion
- si le dernier mouvement est un déplacement de 2 lignes
- si la colonne de ce pion est adjacente à la colonne de la piece de départ (c'est à dire si la distance entre les deux est 1)
- si la ligne de ce pion est la même que la ligne de départ
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17 if ((pieceTampon.estValide(deplacement) && e.cheminPossible(deplacement)) | e.captureParUnPionPossible(deplacement)) { Piece piecePrise = e.getCase(colonneClic, ligneClic).getPiece(); Icon iconPiecePrise = tab[colonneClic][ligneClic].getIcon(); if ( iconPiecePrise!=null ) { //je cree un jLabel avec l'icone de la piece manger JLabel manger = new JLabel(iconPiecePrise); manger.setHorizontalAlignment(SwingConstants.CENTER); //je l'ajoute au bon jPanel if (couleurControle==(COULEUR_JOUEUR_BLANC)) panelblanc.add(manger); else panelnoir.add(manger); } Partie.nouveauCoup(couleurControle,pieceTampon,deplacement,piecePrise);
Je dois l'appeler a des autres endroits il me semble?
J'ai un soucis car depart n'est pas un int ...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 public boolean prisePionEnPassant(){ if(getDernierCoupJoue().piecejouee instanceof Pion){ if((Math.abs(getDernierCoupJoue().depart)-(getDernierCoupJoue().arrivee==2))){ return true; } } return false; }
ok, c'est vrai, c'est mieux en effet de le mettre ici l'appel nouveauCoup(...), comme ça on a aussi la prise du roi en fin de partie
non pas la peine : on enregistre bien tous les coups joués en passant par là
déjà il faut que utilises les méthodes de la classe Coup, pas directement ses variables. Ta méthode prisePionEnPassant est bien dans la classe Echiquier ?
ensuite Coup.getDepart() retourne une instance de classe Position
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 public boolean prisePionEnPassant(){ Partie.Coup dernierCoupJoue=Partie.getDernierCoupJoue(); if( dernierCoupJoue!=null ) { // si le coup est null, c'est le tout premier coup de la partie if ( dernierCoupJoue.getPieceJouee() instanceof Pion ) { ... } } }
donc pour calculer la distance verticale :
Code : Sélectionner tout - Visualiser dans une fenêtre à part Math.abs(dernierCoupJoue.getDepart().getLigne()-dernierCoupJoue.getArrivee().getLigne())==2
Autant pour moi, je l'avais mis dans Partie :
J'ai des erreurs au niveau de nouveauCoup car elle retourne rien cette fonction.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 public boolean prisePionEnPassant(){ Partie.Coup dernierCoupJoue=Partie.getDernierCoupJoue(); if( dernierCoupJoue!=null ) { // si le coup est null, c'est le tout premier coup de la partie if ( dernierCoupJoue.getPieceJouee() instanceof Pion ) { if(Math.abs(dernierCoupJoue.getDepart().getLigne()-dernierCoupJoue.getArrivee().getLigne())==2){ if(Math.abs(nouveauCoup.getDepart().getColonne()-nouveauCoup.getArrivee().getColonne())==1){ if(nouveauCoup.getDepart().getLigne()==nouveauCoup.getArrivee().getLigne()){ return true; }return false; }return false; } return false; } return false; }return false; }
Question appart,
A quoi sert la classe MethodeEchiquier svp ?
Merci
Les erreurs que tu as sont surement dues à tes multiples return false; (sans else en plus) : surement un copier-coller sans faire attention
tu n'en a besoin que d'un à la fin de ta méthode !
cette condition est vrai si la ligne de départ du pion est égale à la ligne d'arrivée du pion : ce n'est pas le test que tu voulais faire
Code : Sélectionner tout - Visualiser dans une fenêtre à part nouveauCoup.getDepart().getLigne()==nouveauCoup.getArrivee().getLigne()
c'est presque ça : tu dois comparer la ligne d'arrivée de la dernière pièce jouée avec la ligne de départ du pion qui est en train de jouer
pareil pour :
c'est la distance entre le dernier pion jouée et le pion qui est entrain de jouer que tu dois calculer (ici tu calcules la longueur horizontal du dernier mouvement)
Code : Sélectionner tout - Visualiser dans une fenêtre à part Math.abs(nouveauCoup.getDepart().getColonne()-nouveauCoup.getArrivee().getColonne())==1
pour pouvoir avoir cette information, passe le deplacement en argument de prisePionEnPassant() comme pour captureParUnPionPossible()
la position de départ ton pion qui joue est
la position de d'arrivée ton pion qui joue est
Code : Sélectionner tout - Visualiser dans une fenêtre à part deplacement.getDepart()
Code : Sélectionner tout - Visualiser dans une fenêtre à part deplacement.getArrivee()MethodeEchiquier n'est pas une classe mais une interfaceQuestion appart,
A quoi sert la classe MethodeEchiquier svp ?
Merci
On l'utilise quand on veut décrire quelque chose à manipuler mais que ce quelque chose sera réalisé par d'autres selon leur besoin : on y décrit les différentes méthodes qu'on veut pouvoir utiliser, mais on ne met pas de code
par exemple dans java tu as l'interface Printable qui permet de gérer n'importe quoi d'imprimable : ce qui permet à java d'avoir un système d'impression sans savoir à l'avance tout ce qui pourra être imprimé et comment l'imprimer et qu'on utilise de la manière suivante :
il suffit que machinImprimable implémente l'interface Printable qui dit quelle méthode il faut implémenter pour que machinImprimable s'imprime, à savoir :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 PrinterJob job = PrinterJob.getPrinterJob(); job.setPrintable(machinImprimable); boolean doPrint = job.printDialog(); if (doPrint) { try { job.print(); } catch (PrinterException e) { e.printStackTrace(); } }
implémenter c'est écrire le code de la méthode
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException;
par exemple, si on voulais rendre ton jeu d'echec imprimable, on pourrait implémenter cette interface Printable dans ta classe FenetreJeu : il suffit de faire
ce qui t'oblige à ajouter la méthode suivante dans la classe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part public class FenetreJeu extends JFrame implements Printable {
pour le cas de MethodeEchiquier, va savoir ce que le codeur d'origine de l'exemple à voulu faire exactement :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3 public int print(Graphics graphics, PageFormat pageFormat, int pageIndex) throws PrinterException { // ici on met le code java qui va dessiner le jeu d'echec tel qu'on veut qu'il s'imprime }
peut etre pouvoir implémenter plusieurs algorithmes différents (pour capturePionPossible par exemple)
dans la mesure ou dans FenetreJeu, il appelle directement Echiquier et pas l'interface, ça ne sert à rien son interface.
par contre si FenetreJeu manipulait l'echiquier par l'intermediaire de l'interface et non pas la classe Echiquier, on aurait été obligé de décrire toutes les méthodes qu'on a ajouter dans Echiquier et qu'on appelle dans FenetreJeu dans l'interface, pour pouvoir les manipuler via l'interface
Merci pour toutes ces détails,
Je viens de comprendre que le return nous faisait sortir de la boucle (donc pas nécessaire d'en abusé)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 public boolean prisePionEnPassant(Deplacement deplacement){ Partie.Coup dernierCoupJoue=Partie.getDernierCoupJoue(); if( dernierCoupJoue!=null ) { // si le coup est null, c'est le tout premier coup de la partie if ( dernierCoupJoue.getPieceJouee() instanceof Pion ) { if(Math.abs(dernierCoupJoue.getDepart().getLigne()-dernierCoupJoue.getArrivee().getLigne())==2){ if(Math.abs(dernierCoupJoue.getArrivee().getColonne()-deplacement.getArrivee().getColonne())==1){ if(dernierCoupJoue.getArrivee().getLigne()==deplacement.getDepart().getLigne()){ return true; } } } } } return false; }
Merci
ok vérifions :
- si le dernier mouvement est celui d'un pion
ok
Code : Sélectionner tout - Visualiser dans une fenêtre à part dernierCoupJoue.getPieceJouee() instanceof Pion
- si le dernier mouvement est un déplacement de 2 lignes
ok
Code : Sélectionner tout - Visualiser dans une fenêtre à part Math.abs(dernierCoupJoue.getDepart().getLigne()-dernierCoupJoue.getArrivee().getLigne())==2
- si la colonne de ce pion est adjacente à la colonne de la piece de départ (c'est à dire si la distance entre les deux est 1)
ok
Code : Sélectionner tout - Visualiser dans une fenêtre à part Math.abs(dernierCoupJoue.getArrivee().getColonne()-deplacement.getArrivee().getColonne())==1
- si la ligne de ce pion est la même que la ligne de départ
ok
Code : Sélectionner tout - Visualiser dans une fenêtre à part dernierCoupJoue.getArrivee().getLigne()==deplacement.getDepart().getLigne()
yes !!!![]()
tu as écrit ta condition tout seul
note toutefois qu'il manque un petit truc : on ne teste pas que la pièce de départ est un pion :
en fait on va appeler cette méthode dans capturePossibleParUnPion qui fait déja ce test, donc inutile de le refaire
donc normalement après avoir ajouté l'appel de cette nouvelle méthode dans capturePossibleParUnPion la case derrière le pion qui a avancé de 2 cases tel qu'il arrive à coté d'un pion adverse doit apparaitre en rouge : car on peut la prendre
maintenant tu vas me dire que c'est bizarre : ce serait mieux que la case du pion lui même apparaissent en rouge :
si tu veux tu peux réfléchir à la façon de modifier le test pour que ce la soit la case du pion qui valide le test et donc s'affiche en rouge : en fait il faudrait faire soit 2 méthodes, soit une méthode avec option pour être capable de tester le cas ou on veut afficher la bonne case, et le cas ou on veut tester qu'en allant sur la case, un pion sera pris
mais en attendant, réalise maintenant la prise en passant : dans le code du mouseClicked, puisque ça ne pourra pas marcher sans modif : dans le cas de la prise en passant, le pion qui prend se déplace vers une case vide
que tu progresseset c'est le principal
y'a pas si longtemps tu disais
et tu es entrain de le faire, quasiment tout seul, c'est pas bô ça
il reste à faire disparaître le quasiment et on est pas loin d'y arriver
pour ce moment il faut que je me dégote un smiley de feu d'artifices ou un truc comme ça![]()
Et moi celui la pour tout ce que vous faite :
Vous détaillez bien chaque partie donc c'est pas dur a suivre.
Par contre je ne sais pas comment m'y prendre pour le code dans le mouseCliked :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 //on met le tampon sur la case vide et on vide le tampon apres e.getCase(temp.getColonne(), temp.getLigne()).setPiece(null); tab[temp.getColonne()][temp.getLigne()].setBorder(BorderFactory.createLineBorder(new Color(0, 0, 0),0)); // j'enleve le cadre rouge de la piece selectionne tab[colonneClic][ligneClic].setIcon(iconeTampon); e.getCase(colonneClic, ligneClic).setPiece(pieceTampon); // pour pouvoir le rebouger plusieurs fois dans une partie tab[temp.getColonne()][temp.getLigne()].setIcon(null); // permet de faire bouger la piece selectionne en supprimant la piece bouger de sa position initiale pieceTampon.enregistreDeplacement(true); if ( pieceTampon instanceof Pion ) { } if ( pieceTampon instanceof Roi ) { etc
J'ai modifier capture par un pion possible :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 public boolean captureParUnPionPossible(Deplacement deplacement) { //Je verifie si la piece est un pion if(plateau[deplacement.getDepart().getColonne()][deplacement.getDepart().getLigne()].getPiece() instanceof Pion) { //initialisation des variables, et savoir la couleur de la piece de depart et la case d'arrive. Case Arrive = plateau[(int)deplacement.getArrivee().getColonne()][(int)deplacement.getArrivee().getLigne()]; String couleurDepart = plateau[(int)deplacement.getDepart().getColonne()][(int)deplacement.getDepart().getLigne()].getPiece().getCouleur(); //je verifie d'abord si la piece d'arrive existe et si elle est de la couleur contraire de celle de depart. if(Arrive.estOccupe(couleurDepart==(COULEUR_JOUEUR_BLANC) ? COULEUR_JOUEUR_NOIR : COULEUR_JOUEUR_BLANC)) //on verifie si le deplacement est valide par le produit du deplacement des ordonner et absices et si cela fait 1 pour les noir ou -1 pour les blanc cela sera accepter if(prisePionEnPassant(deplacement)) return true; return (deplacement.getDeplacementY() * Math.abs(deplacement.getDeplacementX()) == (couleurDepart==(COULEUR_JOUEUR_NOIR) ? 1 : -1)); } return false; }
me revoila...
j'ai pas trop le temps ce soir, j'ai séché toute l'après-midi sur un problème ardu sur mon appli,
mais j'ai jeté vite fait un coup d'oeil sur la suite, j'ai fait le code, mais j'ai pas trop le temps à passer pour t'expliquer dans le détail
déjà, la condition qu'on a fait pour la prise en passant ne marche pas bien : en effet, captureParUnPionPossible est appelé même pour des déplacements de plusieurs cases
donc il faut modifier notre condition
bon ensuite j'ai fait la variante qui affiche la case du pion en rouge
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23 public boolean prisePionEnPassant(Deplacement deplacement){ Partie.Coup dernierCoupJoue=Partie.getDernierCoupJoue(); if( dernierCoupJoue!=null ) { // si le coup est null, c'est le tout premier coup de la partie if ( dernierCoupJoue.getPieceJouee() instanceof Pion ) { // si le dernier coup joué l'était par un pion if ( deplacement.getDeplacementY()==(COULEUR_JOUEUR_NOIR.equals(dernierCoupJoue.getCouleur()) ? -1 : 1) ) { // et que le déplacement testé est une case en avant if(Math.abs(dernierCoupJoue.getDepart().getLigne()-dernierCoupJoue.getArrivee().getLigne())==2) { // et que le coup d'avant le pion s'est déplacé de 2 cases if(Math.abs(dernierCoupJoue.getArrivee().getColonne()-deplacement.getArrivee().getColonne())==0){ // et que le déplacement testé arrive sur la colonne du pion du dernier coup joué if(dernierCoupJoue.getArrivee().getLigne()==deplacement.getDepart().getLigne()){ // et que les deux pions sont actuellement sur la même ligne return true; } } } } } } return false; }
pour ça on est obligé d'ajouter un paramètre à captureParUnPionPossible et prisePionEnPassant : un boolean qui va nous permettre d'appeler ces méthodes pour visualiser la case ou pour se déplacer réellement
si tu veux pas modifier captureParUnPionPossible, il suffit de duppliquer le code de captureParUnPionPossible dans prisePionEnPassant, et la d'appeler les deux méthodes à chaque fois au lieu d'appeler que captureParUnPionPossible
si ça te dérange pas de modifier captureParUnPionPossible, il faudra le faire aussi dans l'interface MethodeEchiquier (ou virer cette interface qui ne sert à rien)
donc en gros on passe false tout le temps, sauf pour
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 public boolean prisePionEnPassant(Deplacement deplacement, boolean affichage){ Partie.Coup dernierCoupJoue=Partie.getDernierCoupJoue(); if( dernierCoupJoue!=null ) { // si le coup est null, c'est le tout premier coup de la partie if ( dernierCoupJoue.getPieceJouee() instanceof Pion ) { if ( deplacement.getDeplacementY()==(affichage?0:(COULEUR_JOUEUR_NOIR.equals(dernierCoupJoue.getCouleur()) ? -1 : 1)) ) { if(Math.abs(dernierCoupJoue.getDepart().getLigne()-dernierCoupJoue.getArrivee().getLigne())==2){ if(Math.abs(dernierCoupJoue.getArrivee().getColonne()-deplacement.getArrivee().getColonne())==0){ if(dernierCoupJoue.getArrivee().getLigne()==deplacement.getDepart().getLigne()){ return true; } } } } } } return false; }
pour effectuer le mouvement j'ai ajouté :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2 else if ( e.captureParUnPionPossible(deplacement,true) ) { tab[colonne][ligne].setCoupPossible(CoupPossible.prisepion);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 Piece piecePrise = e.getCase(colonneClic, ligneClic).getPiece(); Icon iconPiecePrise = tab[colonneClic][ligneClic].getIcon(); if ( pieceTampon instanceof Pion && e.prisePionEnPassant(deplacement, false) ) { piecePrise = e.getCase(deplacement.getArrivee().getColonne(),deplacement.getDepart().getLigne()).getPiece(); iconPiecePrise = tab[deplacement.getArrivee().getColonne()][deplacement.getDepart().getLigne()].getIcon(); tab[deplacement.getArrivee().getColonne()][deplacement.getDepart().getLigne()].setIcon(null); // pièce prise } if ( iconPiecePrise!=null ) {...
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager