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];
     }
 }
Beispiel #3
0
        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);
        }
Beispiel #5
0
        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);
        }
Beispiel #6
0
 // methodes
 public Piece(Joueur joueur, TypePiece type)
 {
     this.joueur = joueur;
     info        = InfoPiece.GetInfo(joueur.couleur, type);
 }
Beispiel #7
0
 public bool isRoiEnEchec(InfoPiece infos, Case depart, Case arrivee)
 {
     return(roi.CanBeAttacked(infos, depart, arrivee));
 }
Beispiel #8
0
        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);
        }