Esempio n. 1
0
        public override bool Deplacer(Case destination)
        {
            // Positive is up, Negative is down
            int horizontal_distance = this.position.Rangee - destination.Rangee;
            // Positive is left, Negative is right
            int vertical_distance = this.position.Colonne - destination.Colonne;

            int starting_row_white = 6;
            int starting_row_black = 1;

            int colorMultiplier = joueur.couleur == CouleurCamp.Blanche ? 1 : -1;

            bool destinationOccupied = destination.piece != null;

            // Déplacement normal
            if (horizontal_distance == 1 * colorMultiplier && vertical_distance == 0 &&
                !destinationOccupied)
            {
                destination.Link(this);
                this.position = destination;
                enPassant     = false;
                return(true);
            }

            // Déplacemenent sur la position de départ
            if (((joueur.couleur == CouleurCamp.Blanche && position.Rangee == starting_row_white) ||
                 (joueur.couleur == CouleurCamp.Noire && position.Rangee == starting_row_black)) &&
                !destinationOccupied && !pieceSurLeChemin(destination))
            {
                if (horizontal_distance == 2 * colorMultiplier && vertical_distance == 0)
                {
                    destination.Link(this);
                    this.position = destination;
                    enPassant     = true;
                    return(true);
                }
            }

            // Capture
            if (destinationOccupied && destination.piece.joueur.couleur != joueur.couleur &&
                horizontal_distance == 1 * colorMultiplier && Math.Abs(vertical_distance) == 1)
            {
                destination.Link(this);
                this.position = destination;
                enPassant     = false;
                return(true);
            }

            // Prise en passant

            return(false);
        }
Esempio n. 2
0
        public override bool Deplacer(Case destination)
        {
            var sauvePremierDeplacement = premierDeplacement;

            if (!DeplacementValide(destination) ||
                CaseBloquee(destination) ||
                !position.CheminLibre(destination))
            {
                premierDeplacement = sauvePremierDeplacement;
                return(false);
            }

            premierDeplacement = false;

            if (DeplacementEnPassant(destination, true))
            {
                destination.Link(this);
            }
            else if (!DeplacementDiagonal(destination))
            {
                if (destination.piece != null)
                {
                    return(false);
                }
                else
                {
                    destination.Link(this);
                }
            }
            else if (DeplacementDiagonal(destination) && destination.piece != null)
            {
                destination.Link(this);
            }
            else
            {
                return(false);
            }

            // Promotion
            if (DetecterPromotion(destination))
            {
                Dame d = new Dame(joueur);
                d.position        = destination;
                destination.piece = d;
                position.echiquier.partie.vue
                .ActualiserCase(destination.x, destination.y, d.info);
            }

            return(true);
        }
Esempio n. 3
0
        public override bool Deplacer(Case destination)
        {
            // Positive is up, Negative is down
            int horizontal_distance = this.position.Rangee - destination.Rangee;
            // Positive is left, Negative is right
            int vertical_distance = this.position.Colonne - destination.Colonne;

            bool destinationOccupiedBySameColor = false;

            if (destination.piece != null)
            {
                destinationOccupiedBySameColor = destination.piece.joueur.couleur == joueur.couleur;
            }

            bool movedOnlyOneTile = Math.Abs(vertical_distance) * Math.Abs(horizontal_distance) < 2;

            if (movedOnlyOneTile && destination != position && !destinationOccupiedBySameColor)
            {
                destination.Link(this);
                this.position = destination;
                return(true);
            }

            return(false);
        }
Esempio n. 4
0
        public override bool Deplacer(Case destination)
        {
            // Positive is up, Negative is down
            int horizontal_distance = this.position.Rangee - destination.Rangee;
            // Positive is left, Negative is right
            int vertical_distance = this.position.Colonne - destination.Colonne;

            bool destinationOccupiedBySameColor = false;

            if (destination.piece != null)
            {
                destinationOccupiedBySameColor = destination.piece.joueur.couleur == joueur.couleur;
            }

            bool movingInDiagonal         = Math.Abs(horizontal_distance) == Math.Abs(vertical_distance);
            bool movingInOnlyOneDirection = horizontal_distance * vertical_distance == 0;

            Console.WriteLine("Diag : " + movingInDiagonal.ToString() + ", same tile : " + (destination != position) + ", sameColor : " + destinationOccupiedBySameColor);

            if ((movingInDiagonal || movingInOnlyOneDirection) && destination != position && !destinationOccupiedBySameColor && !pieceSurLeChemin(destination))
            {
                destination.Link(this);
                this.position = destination;
                return(true);
            }

            return(false);
        }
Esempio n. 5
0
        public override bool Deplacer(Case destination)
        {
            // Positive is up, Negative is down
            int horizontal_distance = this.position.Rangee - destination.Rangee;
            // Positive is left, Negative is right
            int vertical_distance = this.position.Colonne - destination.Colonne;

            bool destinationOccupiedBySameColor = false;

            if (destination.piece != null)
            {
                destinationOccupiedBySameColor = destination.piece.joueur.couleur == joueur.couleur;
            }

            bool movingInOnlyOneDirection = horizontal_distance * vertical_distance == 0;

            if (movingInOnlyOneDirection && destination != position && !destinationOccupiedBySameColor && !pieceSurLeChemin(destination))
            {
                destination.Link(this);
                this.position = destination;
                return(true);
            }

            return(false);
        }
Esempio n. 6
0
 public override bool Deplacer(Case destination)
 {
     if (IsMoveLegal(destination))
     {
         joueur.partie.canEp = false;
         destination.Link(this);
         return(true);
     }
     return(false);
 }
Esempio n. 7
0
 public override bool Deplacer(Case destination)
 {
     if (IsMoveLegal(destination))
     {
         canCastle = false;
         joueur.partie.canEp = false;
         destination.Link(this);
         return true;
     }
     return false;
 }
Esempio n. 8
0
        public override bool Deplacer(Case destination)
        {
            if (CaseBloquee(destination) || !position.CheminLibre(destination))
            {
                return(false);
            }

            destination.Link(this);

            return(true);
        }
Esempio n. 9
0
        public override bool Deplacer(Case destination)
        {
            if (CaseBloquee(destination) ||
                !DeplacementValide(destination))
            {
                return(false);
            }

            destination.Link(this);

            return(true);
        }
Esempio n. 10
0
 public override bool Deplacer(Case destination)
 {
     if (IsMoveLegal(destination))
     {
         destination.Link(this);
         isFirstMove = false;
         if (destination.row == 0 || destination.row == 7)
         {
             Promote();
         }
         return(true);
     }
     return(false);
 }
Esempio n. 11
0
        public override bool Deplacer(Case destination)
        {
            if (CaseBloquee(destination) ||
                !position.CheminLibre(destination))
            {
                return(false);
            }

            if (!TraiterPetitRoque(destination) &&
                !TraiterGrandRoque(destination))
            {
                if (!DeplacementValide(destination))
                {
                    return(false);
                }
            }

            destination.Link(this);

            return(true);
        }
Esempio n. 12
0
        public override bool Deplacer(Case destination)
        {
            destination.Link(this);

            return(true);
        }
Esempio n. 13
0
        public void DeplacerPiece(int x_depart, int y_depart, int x_arrivee, int y_arrivee)
        {
            // case de départ
            Case depart = echiquier.cases[x_depart, y_depart];

            // case d'arrivée
            Case destination = echiquier.cases[x_arrivee, y_arrivee];

            // deplacer
            bool ok = depart.piece.Deplacer(destination);



            /* TEST */
            //vue.ActualiserCase(x_depart, y_depart, null);
            //vue.ActualiserCase(x_arrivee, y_arrivee, InfoPiece.RoiBlanc);
            /* FIN TEST */

            // changer d'état
            if (ok)
            {
                // Roque
                if (depart.piece.GetType() == typeof(Roi) && Math.Abs(depart.row - destination.row) == 2 && depart.col - destination.col == 0)
                {
                    destination.Link(depart.piece);
                    destination.piece.position = destination;
                    depart.Unlink();

                    vue.ActualiserCase(destination.row, destination.col, destination.piece.info);
                    vue.ActualiserCase(depart.row, depart.col, null);

                    // Deplacement de la tour
                    Case tourDepart;
                    int  oldRowTour;
                    int  oldColTour = destination.col;

                    Case tourDestination;
                    int  newRowTour;
                    int  newColTour = destination.col;

                    if (destination.row - depart.row == 2)
                    {
                        oldRowTour = 7;
                        newRowTour = 5;
                    }
                    else
                    {
                        oldRowTour = 0;
                        newRowTour = 3;
                    }
                    tourDepart      = echiquier.cases[oldRowTour, oldColTour];
                    tourDestination = echiquier.cases[newRowTour, newColTour];

                    tourDestination.Link(tourDepart.piece);
                    tourDestination.piece.position = tourDestination;
                    tourDepart.Unlink();

                    vue.ActualiserCase(tourDestination.row, tourDestination.col, tourDestination.piece.info);
                    vue.ActualiserCase(tourDepart.row, tourDepart.col, null);
                }

                // La prise en passant
                if (depart.piece.GetType() == typeof(Pion) &&
                    Math.Abs(depart.row - destination.row) == 1 &&
                    Math.Abs(depart.col - destination.col) == 1)
                {
                    Console.WriteLine("depart.row - destination.row = " + (depart.row - destination.row));
                    Console.WriteLine("depart.col - destination.col = " + (depart.col - destination.col));

                    if (depart.row - destination.row == -1)
                    {
                        piecesCapturees.Add(echiquier.cases[depart.row + 1, depart.col].piece.info);
                        vue.ActualiserCase(depart.row + 1, depart.col, null);
                    }


                    if (depart.row - destination.row == 1)
                    {
                        piecesCapturees.Add(echiquier.cases[depart.row - 1, depart.col].piece.info);
                        vue.ActualiserCase(depart.row - 1, depart.col, null);
                    }



                    destination.Link(depart.piece);
                    destination.piece.position = destination;
                    depart.Unlink();



                    vue.ActualiserCase(destination.row, destination.col, destination.piece.info);
                    vue.ActualiserCase(depart.row, depart.col, null);
                }

                else
                {
                    // Actualiser Captures
                    if (destination.piece != null)
                    {
                        piecesCapturees.Add(destination.piece.info);
                    }

                    destination.Unlink();
                    destination.Link(depart.piece);
                    destination.piece.position = destination;
                    depart.Unlink();

                    vue.ActualiserCase(destination.row, destination.col, destination.piece.info);
                    vue.ActualiserCase(depart.row, depart.col, null);
                }
                vue.ActualiserCaptures(piecesCapturees);
                ChangerEtat();
            }
        }