IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

avec Java Discussion :

Echiquier en Java


Sujet :

avec Java

  1. #101
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 139
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    j'ai vu un autre bug sinon si tu fais commencer, puis terminé, puis commencer, tu ne peux pas bouger les pièces
    Je n'ai pas ce bug moi ..

  2. #102
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 139
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    donc pour jouer le roque maintenant :

    ça se passe dans la méthode ou on gère le déplacement évidemment

    la seule chose c'est qu'on a une pièce a déplacer en plus que d'habitude : la tour quand le roi s'est déplacé de 2 cases (on s'est arrangé avec estValide et cheminPossible pour le seul déplacement de 2 cases soit un roque)

    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
    //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 Roi ) {
    	// est ce qu'on était pas entrain de faire un roque, des fois
    	if ( Math.abs(deplacement.getDeplacementX())==2) {
    		// ah bah si on dirait bien
    		// donc faut que je déplace aussi la tour derrière le roi
    		int xtourDepart, xtourArrivee;
    		if( deplacement.getDeplacementX()<0 ) {
    			// déplacement vers la gauche = grand roque = roque avec la tour gauche (vue des blancs)
    			xtourDepart=0;
    			xtourArrivee=3;
    		}
    		else {
    			// déplacement vers la droite = petit roque = roque avec la tour droite (vue des blancs)
    			xtourDepart=7;
    			xtourArrivee=5;
    		}
                    // on déplace la tour... donc la pièce et l'icone
    		Piece tour = e.getCase(xtourDepart, ligneClic).getPiece();
    		e.getCase(xtourArrivee, ligneClic).setPiece(tour);
    		e.getCase(xtourDepart, ligneClic).setPiece(null);
    		tour.enregistreDeplacement(true); // ce déplacement doit être compté
    		tab[xtourArrivee][ligneClic].setIcon(tab[xtourDepart][ligneClic].getIcon());
    		tab[xtourDepart][ligneClic].setIcon(null);
    	}
    }
    
    pieceTampon = null;
    iconeTampon = null;
    temp = null;
    
    couleurControle = couleurControle==(COULEUR_JOUEUR_BLANC) ? COULEUR_JOUEUR_NOIR : COULEUR_JOUEUR_BLANC;
    champTexte.setText(couleurControle + " , a vous de jouer");
    en passant, autre bug que j'ai vu et que tu peux facilement corriger toi même :
    si on sélectionne une pièce et que ça allume en vert, rouge ou jaune des cases, si là on clique sur terminé, les cases restent en vert, rouge ou jaune : il faut donc les remettre à zéro (tu te souvient setCoupPossible(null)?) lorsqu'on clique sur le bouton terminé comme on l'a fait quand le coup est joué...


    bon sur ce je vais te quitter pour ce soir
    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();
    
    	}

  3. #103
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 139
    Points : 24
    Points
    24
    Par défaut
    Donc grâce a vous , il reste :
    - Revoir la fin de partie (echec et mat)
    - Prise en passant

  4. #104
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jordan62 Voir le message
    Je n'ai pas ce bug moi ..
    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 !

  5. #105
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 139
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    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é :
    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");
    Mais en vain

  6. #106
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jordan62 Voir le message
    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é :
    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");
    Mais en vain
    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 :
    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");
    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

    comme dans le petit programme suivant, ou le résultat est "toto", pas "jambon"
    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();
     
    	}
     
    }
    donc il suffit que tu fasses :

    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");
    tant qu'à faire autant faire ce que j'ai mis en orange aussi

    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

  7. #107
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    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

    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;
    		}
     
    	}
     
    }
    ensuite il faut "piloter" cette classe

    - 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())

  8. #108
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 139
    Points : 24
    Points
    24
    Par défaut
    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();
    
    	}
    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);
    Au niveau des paramètres , est-ce les bons ?

  9. #109
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jordan62 Voir le message
    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();
    
    	}
    ça c'est bon.

    Citation Envoyé par Jordan62 Voir le message

    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);
    Au niveau des paramètres , est-ce les bons ?
    là non

    c'est plus ou moins le bon endroit

    déjà pourquoi créer une méthode dans Piece ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Partie.nouveauCoup(...)
    suffit

    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 :

    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);
    pas terrible : si on ne mange pas de pièce on créé quand même un panel, vide, certes, mais bon pas terrible

    on va remplacer ça déjà par :

    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);
    }
    en orange je récupère la pièce prise

    et l'appel devient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Partie.nouveauCoup(couleurControle,pieceTampon,deplacement,piecePrise);
    ensuite le test, c'est à dire la modification captureParUnPionPossible

    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

  10. #110
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 139
    Points : 24
    Points
    24
    Par défaut
    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?



    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;
    	}
    J'ai un soucis car depart n'est pas un int ...

  11. #111
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jordan62 Voir le message
    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);
    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

    Citation Envoyé par Jordan62 Voir le message

    Je dois l'appeler a des autres endroits il me semble?
    non pas la peine : on enregistre bien tous les coups joués en passant par là

    Citation Envoyé par Jordan62 Voir le message

    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;
    	}
    J'ai un soucis car depart n'est pas un int ...
    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 ?

    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 ) {
                ... 
          }
       }
    }
    ensuite Coup.getDepart() retourne une instance de classe Position

    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

  12. #112
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 139
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    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 ?
    Autant pour moi, je l'avais mis dans Partie :

    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;
    	}
    J'ai des erreurs au niveau de nouveauCoup car elle retourne rien cette fonction.

    Question appart,
    A quoi sert la classe MethodeEchiquier svp ?
    Merci

  13. #113
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jordan62 Voir le message
    Autant pour moi, je l'avais mis dans Partie :

    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;
    	}
    J'ai des erreurs au niveau de nouveauCoup car elle retourne rien cette fonction.
    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 !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nouveauCoup.getDepart().getLigne()==nouveauCoup.getArrivee().getLigne()
    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

    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 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Math.abs(nouveauCoup.getDepart().getColonne()-nouveauCoup.getArrivee().getColonne())==1
    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)

    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    deplacement.getDepart()
    la position de d'arrivée ton pion qui joue est

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    deplacement.getArrivee()
    Question appart,
    A quoi sert la classe MethodeEchiquier svp ?
    Merci
    MethodeEchiquier n'est pas une classe mais une interface

    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 :

    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();
        }
    }
    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
    int print(Graphics graphics, PageFormat pageFormat, int pageIndex)
    	         throws PrinterException;
    implémenter c'est écrire le code de la méthode
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public class FenetreJeu extends JFrame implements Printable {
    ce qui t'oblige à ajouter la méthode suivante dans la classe :
    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
    }
    pour le cas de MethodeEchiquier, va savoir ce que le codeur d'origine de l'exemple à voulu faire exactement :
    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

  14. #114
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 139
    Points : 24
    Points
    24
    Par défaut
    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

  15. #115
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jordan62 Voir le message
    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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dernierCoupJoue.getPieceJouee() instanceof Pion
    ok

    - si le dernier mouvement est un déplacement de 2 lignes

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Math.abs(dernierCoupJoue.getDepart().getLigne()-dernierCoupJoue.getArrivee().getLigne())==2
    ok

    - 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)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Math.abs(dernierCoupJoue.getArrivee().getColonne()-deplacement.getArrivee().getColonne())==1
    ok


    - 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
    dernierCoupJoue.getArrivee().getLigne()==deplacement.getDepart().getLigne()
    ok

    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

  16. #116
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 139
    Points : 24
    Points
    24
    Par défaut
    Citation Envoyé par joel.drigo Voir le message
    yes !!!
    tu as écrit ta condition tout seul
    Je dois le prendre comment ?

  17. #117
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Jordan62 Voir le message
    Je dois le prendre comment ?
    que tu progresses et c'est le principal

    y'a pas si longtemps tu disais

    Citation Envoyé par Jordan62 Voir le message
    J'aurais aimé juste afficher les choix en vert , les cases a prendre en rouge, le roque et si je pouvais la prise en passant mais c'est trop dur pour moi ...
    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

  18. #118
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 139
    Points : 24
    Points
    24
    Par défaut
    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

  19. #119
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    139
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Avril 2013
    Messages : 139
    Points : 24
    Points
    24
    Par défaut
    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;
    	}

  20. #120
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Points : 29 131
    Points
    29 131
    Billets dans le blog
    2
    Par défaut
    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

    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;
    }
    bon ensuite j'ai fait la variante qui affiche la case du pion en rouge

    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)

    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;
    }
    donc en gros on passe false tout le temps, sauf pour

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    else if ( e.captureParUnPionPossible(deplacement,true) ) {
    								        	tab[colonne][ligne].setCoupPossible(CoupPossible.prisepion);
    pour effectuer le mouvement j'ai ajouté :

    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 ) {...

+ Répondre à la discussion
Cette discussion est résolue.
Page 6 sur 12 PremièrePremière ... 2345678910 ... DernièreDernière

Discussions similaires

  1. le Java est la continuité du C++ ???
    Par Vincent PETIT dans le forum Débats sur le développement - Le Best Of
    Réponses: 33
    Dernier message: 25/08/2005, 20h17
  2. Envoi de Datagrames par IP en JAVA
    Par the java lover dans le forum Développement
    Réponses: 2
    Dernier message: 14/08/2002, 11h44
  3. directx et java?? possible??
    Par jiraiya dans le forum DirectX
    Réponses: 3
    Dernier message: 09/07/2002, 19h55
  4. webcam : lire sur un port usb en c/c++ ou java. sous win. ?
    Par flo007 dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 24/05/2002, 23h24
  5. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo