void carreau_MouseDown(object sender, MouseEventArgs e) { // sauvegarder le carreau de départ picFrom = sender as PictureBox; imgFrom = picFrom.Image; // terminer s'il n'y a pas de pièce sur le carreau if (imgFrom == null) { return; } // informations sur la pièce contenue dans le carreau InfoPiece piece = imgFrom.Tag as InfoPiece; // terminer si la partie n'est pas active ou si la couleur de la piece selectionnée ne corresponde pas à la couleur du joueur qui joue dans ce tours if (status.etat == EtatPartie.Reset || status.etat == EtatPartie.Mat || status.couleur != piece.couleur) { return; } // calculer les indices des carreaux de départ et arrivée int idxFrom = Convert.ToInt32(picFrom.Tag); // transformer les indices lineaires en numeros de rangée et colonne int x1 = idxFrom % 8; // colonne du carreau de départ int y1 = (idxFrom - x1) / 8; // rangée du carreau de départ availableMoves = ((Partie)jeu).AvailableMoves(((Partie)jeu).echiquier.Cases[x1, y1].linkedPiece); DisplayHints(); // demarrer le Drag & Drop picFrom.DoDragDrop(imgFrom, DragDropEffects.Move); // remettre le curseur pnlEdging.Cursor = Cursors.Default; // remettre l'image sur le carreau de départ picFrom.Image = imgFrom; picFrom.BorderStyle = BorderStyle.None; // terminer s'il n'y a pas de carreau cible if (picTo == null) { ResetHintColors(); return; } // calculer les indices des carreaux de départ et arrivée int idxTo = Convert.ToInt32(picTo.Tag); // transformer les indices lineaires en numeros de rangée et colonne int x2 = idxTo % 8; // colonne du carreau d'arrivée int y2 = (idxTo - x2) / 8; // rangée du carreau d'arrivée // reset du carreau cible picTo = null; // invoquer l'operation << DeplacerPiece >> DeplacerPiece(x1, y1, x2, y2); }
public void ActualiserCase(int x, int y, InfoPiece info) { if (info == null) { carreaux[x, y].Image = null; } else if (info.couleur == CouleurCamp.Blanche) { carreaux[x, y].Image = piecesBlanches[(int)info.type]; } else { carreaux[x, y].Image = piecesNoires[(int)info.type]; } }
private bool TraiterGrandRoque(Case destination) { int y = (joueur.couleur == CouleurCamp.Blanche) ? 7 : 0; if ((destination.y == y) && ((destination.x - 2) >= 0)) { InfoPiece typeTour = (joueur.couleur == CouleurCamp.Blanche) ? InfoPiece.TourBlanche : InfoPiece.TourNoire; Piece p = position.echiquier.cases[destination.x - 2, y].piece; if (((destination.x - position.x) == -2) && (p.info == typeTour) && ((destination.x + 1) <= 7)) { position.echiquier.cases[destination.x + 1, y].Link(p); return(true); } } return(false); }
/// <summary> /// prepare the InfoPiece for different action /// </summary> protected void PrepareKeyInfoPanel(BaseAction action) { if (action is KeyAction keyAction) { if ((keyAction?.Press ?? false) == false) { return; } } else if (action is TapAction tapAction) { } else if (action is ScrollAction scrollAction) { } IInfoPiece boxContainer = new InfoPiece(); PrepareShowInfoPanel(boxContainer); }
private bool DeplacementEnPassant(Case destination, bool effectuerCapture = false) { int y = (joueur.couleur == CouleurCamp.Blanche) ? 2 : 5; if (!DeplacementDiagonal(destination) || !(destination.y == y)) { return(false); } int YPieceACapture = y + ((joueur.couleur == CouleurCamp.Blanche) ? 1 : -1); Piece pieceACapture = position.echiquier.cases[destination.x, YPieceACapture].piece; InfoPiece typePionAdverse = (joueur.couleur == CouleurCamp.Blanche) ? InfoPiece.PionNoir : InfoPiece.PionBlanc; if (pieceACapture != null) { if (pieceACapture.info != typePionAdverse) { return(false); } Pion pionCapture = (pieceACapture as Pion); if (pionCapture.enPassantPossible) { if (effectuerCapture) { pieceACapture.position.UnLink(); joueur.CapturerPiece(pieceACapture); } return(true); } } return(false); }
// methodes public Piece(Joueur joueur, TypePiece type) { this.joueur = joueur; info = InfoPiece.GetInfo(joueur.couleur, type); }
public bool isRoiEnEchec(InfoPiece infos, Case depart, Case arrivee) { return(roi.CanBeAttacked(infos, depart, arrivee)); }
public bool CanBeAttacked(InfoPiece infos, Case depart, Case arrivee) { #region Directions //row, col Tuple <int, int> hautGauche = new Tuple <int, int>(-1, -1); Tuple <int, int> haut = new Tuple <int, int>(-1, 0); Tuple <int, int> hautDroite = new Tuple <int, int>(-1, 1); Tuple <int, int> droite = new Tuple <int, int>(0, 1); Tuple <int, int> basDroite = new Tuple <int, int>(1, 1); Tuple <int, int> bas = new Tuple <int, int>(1, 0); Tuple <int, int> basGauche = new Tuple <int, int>(1, -1); Tuple <int, int> gauche = new Tuple <int, int>(0, -1); Tuple <int, int> cavalier1 = new Tuple <int, int>(1, 2); Tuple <int, int> cavalier2 = new Tuple <int, int>(1, -2); Tuple <int, int> cavalier3 = new Tuple <int, int>(2, 1); Tuple <int, int> cavalier4 = new Tuple <int, int>(2, -1); Tuple <int, int> cavalier5 = new Tuple <int, int>(-1, 2); Tuple <int, int> cavalier6 = new Tuple <int, int>(-1, -2); Tuple <int, int> cavalier7 = new Tuple <int, int>(-2, 1); Tuple <int, int> cavalier8 = new Tuple <int, int>(-2, -1); List <Tuple <int, int> > directions = new List <Tuple <int, int> >(); directions.Add(hautGauche); directions.Add(cavalier1); directions.Add(haut); directions.Add(cavalier2); directions.Add(hautDroite); directions.Add(cavalier3); directions.Add(droite); directions.Add(cavalier4); directions.Add(basDroite); directions.Add(cavalier5); directions.Add(bas); directions.Add(cavalier6); directions.Add(basGauche); directions.Add(cavalier7); directions.Add(gauche); directions.Add(cavalier8); #endregion int row = this.position.row; int col = this.position.col; //Si c'est le roi qui a bouger, prendre en compte la nouvelle pos if (infos.type == TypePiece.Roi) { row = arrivee.row; col = arrivee.col; } //Pour chaque direction foreach (Tuple <int, int> dir in directions) { //Slide int newRow = row; int newCol = col; while (true) { newRow += dir.Item1; newCol += dir.Item2; //Si hors plateau, passer à la direction suivante if (newRow < 0 || newRow > 7 || newCol < 0 || newCol > 7) { break; } //On récupère la case à tester et la piece sur cette case Case cSlide = this.joueur.partie.echiquier.cases[newRow, newCol]; Piece p = cSlide.piece; //Si vide ou ancienne pos et pas nouvelle pos, continuer a glisser, //On considére l'ancienne case comme vide et la nouvelle comme remplis if ((p == null && ((cSlide != arrivee)) || (cSlide == depart))) { if (dir.Item1 == 2 || dir.Item1 == -2 || dir.Item2 == 2 || dir.Item2 == -2) { break; //Si c'est une position de canasson, on ne glisse pas } continue; //On passe à la suivante } //Si allié ou case d'arrivée, passer à la direction suivante //On considere la nouvelle case comme occupé par un allié if ((cSlide == arrivee) || (p != null && p.info.couleur == this.joueur.couleur)) { break; } //Sinon ennemi, regarder le type pour voir s'il peut se déplacer dans cette direction else { TypePiece pieceType = p.info.type; //Si oui, return true if (dir.Item1 == 2 || dir.Item1 == -2 || dir.Item2 == 2 || dir.Item2 == -2) { // Si c'est une dir de canasson, if (pieceType == TypePiece.Cavalier) { return(true); //et un canasson, le roi peut être attaqué } //continue; //Si c'en est pas un, c'est safe } else if (pieceType == TypePiece.Dame) { return(true); //Peu importe la direction ou la distance } else if (pieceType == TypePiece.Roi) { //Si c'est un roi if (Math.Abs(newRow - row) <= 1 && //Distance horizontal <= 1 et Math.Abs(newCol - col) <= 1) //Distance vertical <= 1 { return(true); } } else if (pieceType == TypePiece.Fou) { if (dir.Item1 != 0 && dir.Item2 != 0) { return(true); } } else if (pieceType == TypePiece.Tour) //Si c'est une tour { if (dir.Item1 == 0 && dir.Item2 != 1 || //Horizontal dir.Item1 != 1 && dir.Item2 == 0) //Vertical { return(true); } } //Si c'est un pion else if (pieceType == TypePiece.Pion) { if (p.info.couleur == CouleurCamp.Blanche) //De couleur blanche { //Une case en dessous et une colonne à côté if (newRow == row + 1 && (newCol == col + 1 || newCol == col - 1)) { return(true); } } else //De couleur noir { //Une case au dessous et une colonne à côté if (newRow == row - 1 && (newCol == col + 1 || newCol == col - 1)) { return(true); } } } //Si non, passer à la direction suivante break; } } } return(false); }