private void EstValidePionMange(Cases A, Cases B) { Vector3 déplacement = (B.Centre - A.Centre); if (!PièceA.EstValidePion(déplacement)) { ResetPièces(PièceA, PièceB); } }
private void GérerDéplacement() { if (GestionInput.EstNouveauClicGauche()) { foreach (Cases o in ListeDesCases) { //ON PROJETE LES VECTOR3 POUR OBTERNIR DES COORDONNÉES ÉCRAN Vector3 HG = Game.GraphicsDevice.Viewport.Project(o.HG, CaméraJeu.Projection, this.CaméraJeu.Vue, Matrix.Identity); Vector3 HD = Game.GraphicsDevice.Viewport.Project(o.HD, this.CaméraJeu.Projection, this.CaméraJeu.Vue, Matrix.Identity); Vector3 BG = Game.GraphicsDevice.Viewport.Project(o.BG, this.CaméraJeu.Projection, this.CaméraJeu.Vue, Matrix.Identity); Vector3 BD = Game.GraphicsDevice.Viewport.Project(o.BD, this.CaméraJeu.Projection, this.CaméraJeu.Vue, Matrix.Identity); //ON CRÉE LES RECTANGLES DE COLLISIONS DES CASES int height = 0; int width = 0; Rectangle zone = new Rectangle(0, 0, 0, 0); if (Couleur == BLACK) { height = (int)(HD.Y - HG.Y); width = (int)(BG.X - HG.X); zone = new Rectangle((int)HG.X, (int)HG.Y, width, height); } else { height = (int)(HG.Y - HD.Y); width = (int)(HG.X - BG.X); zone = new Rectangle((int)BG.X, (int)HD.Y, width, height); } Point PosSouris = GestionInput.GetPositionSouris(); float k = Compteur; if (zone.Contains(PosSouris)) { //COLLISION ENTRE SOURIS ET CASE if (CaseA != CaseB) { VérifierChangementCouleur(o); } if (CaseA == null) { CaseA = o; VérifierChangementCouleur(o); } else { //LES DEUX CASES NE SONT PAS NULLES CaseB = o; foreach (Pieces a in ListeDesPièces.ToList()) { if (CaseA != null && CaseB != null) { //ON ENREGISTRE LA POSITION INITIALE DES PIÈCES SetÉtat(); foreach (Pieces b in ListeDesPièces) { if (EstPropriétaire(b.Position, CaseB.Centre)) { //ON TROUVE LA PIÈCE SE TROUVANT SUR caseB PièceB = b; } } if (EstPropriétaire(a.Position, CaseA.Centre)) { //ON TROUVE LA PIÈCE SUR LA caseA ET ON VÉRIFIE SI ELLE RESPECTE LOGIQUE ET NESAUTEPAS if (a.Couleur == Couleur) { if (a.LogiqueDéplacement(new Vector2((CaseB.Centre.Z - CaseA.Centre.Z), (CaseB.Centre.X - CaseA.Centre.X))) && NeSautePas(CaseA.Centre, CaseB.Centre)) { Compteur++; PièceA = a; if (PièceB == null) { //ON PASSE ICI SI IL N'Y A PAS DE pièceB (DÉPLACEMENT SANS MANGER) ResetCouleur(); PièceA.Deplacer(CaseB.Centre); if (PièceA.Nom == "/pawn") { //ON VÉRIFIE LE CAS DU DÉPLACEMENT DU PION SANS MANGER if (EstValidePionSeul(CaseA, CaseB)) { PièceA.Deplacer(CaseA.Centre); Compteur--; ResetCouleur(); } else { //ON VÉRIFIE SI LE PION EST AUX BORNES (PROMOTION) if (EstAuBorne(PièceA.Couleur, CaseB)) { NouvelleReine(PièceA); } } } if (PièceA.Nom == "/king") { //ON VÉRIFIE SI LE JOUEUR ESSAIE DE ROQUER if (Math.Abs(CaseB.Centre.Z - CaseA.Centre.Z) > Partie.LONGUEUR_CASE && (!EstEnEchec(PièceA.Couleur))) { GèrerRook(); } } if (!EstPropriétaire(PièceA.Position, CaseA.Centre)) { // SI pièceA A BOUGÉ, ON VÉRIFIE SI LE JOUEUR SE MET LUI-MÊME EN ÉCHEC if (EstEnEchec(Couleur)) { //ON REMET LA PIÈCE À SA POSITION INITIALE CAR LE MOUVEMENT EST INVALIDE (SE MET EN ÉCHEC) PièceA.Deplacer(CaseA.Centre); Compteur--; ResetCouleur(); } } } else { if (PièceA.Couleur != PièceB.Couleur) { //ON PASSE ICI SI LA pièceA VEUT MANGER LA pièceB PièceB.Sortir(NbSortiesBlanc, NbSortiesNoir); PièceA.Deplacer(CaseB.Centre); ResetCouleur(); if (PièceA.Nom == "/pawn") { //ON VÉRIFIE LE CAS UNIQUE DU PION QUI MANGE UNE PIÈCE Vector3 déplacement = (CaseB.Centre - CaseA.Centre); if (!PièceA.EstValidePion(déplacement)) { //ON RESET LES PIÈCES SI LE DÉPLACEMENT DU PION EST INVALIDE ResetPièces(PièceA, PièceB); } else { if (EstAuBorne(PièceA.Couleur, CaseB)) { //ON PROMOTE LE PION SI IL EST AUX BORNES NouvelleReine(PièceA); } } } if (PièceA.Nom == "/king") { //IMPOSSIBLE DE ROQUER LORSQU'ON MANGE UNE PIÈCE, ON VÉRIFIE QUE LE JOUEUR N'ESSAIE PAS DE ROQUER if (Math.Abs(CaseB.Centre.Z - CaseA.Centre.Z) > Partie.LONGUEUR_CASE) { ResetPièces(PièceA, PièceB); } } if (EstEnEchec(Couleur)) { //ON RESET LES PIÈCES SI LE JOUEUR S'EST MIS EN ÉCHEC ResetPièces(PièceA, PièceB); } else { //ON MODIFIE LA POSITION DE SORTIE PUISQU'UNE PIÈCE EST SORTIE SI ON PASSE ICI if (PièceB.Couleur == "White") { NbSortiesBlanc += 1; } else { NbSortiesNoir += 1; } } } else { //ON RESET LA PIÈCE CAR LE JOEUEUR A TENTÉ DE MANGER UNE PIÈCE DE LA MAUVAISE COULEUR Compteur--; ResetCouleur(); } } } else { ResetCouleur(); } } else { //ON UTILISE LA pièceB comme pièceA CAR LE JOUEUR A CLICKÉ SUR DEUX PIÈCES DE SA COULEUR ResetCouleur(); VérifierChangementCouleur(CaseB); PièceA = PièceB; PièceB = null; CaseA = CaseB; CaseB = null; } } if (a == ListeDesPièces[NbPiece - 1]) { //LE JOUEUR A PRIS UNE CASE VIDE COMME caseA, ON MET DONC LA caseB COMME ÉTANT caseA ResetCouleur(); if (CaseB != null) { VérifierChangementCouleur(CaseB); } PièceA = PièceB; PièceB = null; CaseA = CaseB; CaseB = null; } foreach (Pieces g in ListeDesPièces.FindAll(x => x.Nom == "/rook" || x.Nom == "/king" || x.Nom == "/pawn")) { //POUR LES PIÈCES QUI DOIVENT SAVOIR SI ELLES SONT À LEUR PREMIER DÉPLACEMENT, ON VÉRIFIE SI ELLES ONT BOUGÉ if (g.Position != g.PosIni) { g.EstPremierMove = false; } } } } float p = Compteur; if (k != p) { //ON VÉRIFIE À L'AIDE DU COMPTEUR SI LE COUP A ÉTÉ JOUÉ, ON FAIT TOURNER LA CAMÉRA ET ON JOUE LE SON DE DÉPLACEMENT CaméraJeu.Compteur = 0; Chess_Hit_Sound.Play(); } //ON VÉRIFIE SI IL FAUT JOUER LES SONS ÉCHEC/ÉCHEC ET MAT JouerSons(); } } } } }