Пример #1
0
        /// <summary>Joue le coup de la source à la destination, si possible</summary>
        /// <param name="liSrc">Indice de la ligne source</param>
        /// <param name="liDest">Indice de la ligne de destination</param>
        /// <param name="colDest">Indice de la colonne source</param>
        /// <param name="colSrc">Indice de la colonne de destination</param>
        public void JouerCoup(byte liSrc, byte liDest, byte colSrc, byte colDest)
        {
            // Coup normal
            if (CoupValide(liSrc, liDest, colSrc, colDest))
            {
                echiquier.JouerCoup(liSrc, liDest, colSrc, colDest);

                // Promotion d'un pion
                if (echiquier.EstPion(liDest, colDest) && liDest == (actif == Couleur.BLANC ? 0 : 7))
                {
                    FormPromotion promotion = new FormPromotion();
                    if (promotion.ShowDialog() == DialogResult.Yes)
                    {
                        echiquier.Promotion(liDest, colDest, promotion.Promotion);
                    }
                }

                ApresCoup(liDest, colDest);

                // Roque
            }
            else if (liSrc == liDest && liSrc == (actif == Couleur.NOIR ? 0 : 7) && (colDest == 2 && echiquier.SiRoquable(actif, true) || colDest == 6 && echiquier.SiRoquable(actif, false)))
            {
                Echiquier clone = (Echiquier)echiquier.Clone();
                clone.JouerRoque(actif, colDest == 2);

                if (Menaces(clone.PositionRoi(actif), clone).Count > 0)
                {
                    formPartie.Message = "Coup illégal. Votre roi se retrouverait en échec";
                }
                else
                {
                    echiquier.JouerRoque(actif, colDest == 2);
                    ApresCoup(liDest, colDest);
                }

                // Manger en passant
            }
            else if (liDest == (actif == Couleur.BLANC ? 2 : 5) && echiquier.EstPion(liSrc, colSrc) && echiquier.SiManger(liSrc, liDest, colSrc, colDest) && posistions[posistions.Count - 2][(actif == Couleur.BLANC ? 1 : 6) * 8 + colDest] != ' ' && echiquier.EstPion((byte)(actif == Couleur.BLANC ? 3 : 4), colDest))
            {
                Echiquier clone = (Echiquier)echiquier.Clone();
                clone.JouerEnPassant(liSrc, liDest, colSrc, colDest);

                if (Menaces(clone.PositionRoi(actif), clone).Count > 0)
                {
                    formPartie.Message = "Coup illégal. Votre roi se retrouverait en échec";
                }
                else
                {
                    echiquier.JouerEnPassant(liSrc, liDest, colSrc, colDest);
                    ApresCoup(liDest, colDest);
                }
            }
        }
Пример #2
0
        /// <summary>Évalue si il est possible de jouer le coup de la source à la destination et avise l'utilisateur des erreurs.</summary>
        /// <param name="liSrc">Indice de la ligne source</param>
        /// <param name="liDest">Indice de la ligne de destination</param>
        /// <param name="colDest">Indice de la colonne source</param>
        /// <param name="colSrc">Indice de la colonne de destination</param>
        /// <returns>Retourne true si le coup est possible</returns>
        private bool CoupValide(byte liSrc, byte liDest, byte colSrc, byte colDest)
        {
            if (echiquier.EstVide(liSrc, colSrc))
            {
                formPartie.Message = "Coup invalide. Veuillez sélectioner une pièce source";
                return(false);
            }

            if (echiquier.CouleurPiece(liSrc, colSrc) != actif)
            {
                formPartie.Message = "Coup invalide. La pièce source ne vous appartient pas";
                return(false);
            }

            if (!echiquier.EstVide(liDest, colDest))
            {
                if (echiquier.CouleurPiece(liDest, colDest) == actif)
                {
                    formPartie.Message = "Coup invalide. Impossible de manger sa propre pièce";
                    return(false);
                }
                else if (!echiquier.SiManger(liSrc, liDest, colSrc, colDest))
                {
                    formPartie.Message = "Coup invalide. Cette pièce ne peut effectuer ce déplacement";
                    return(false);
                }
            }
            else if (!echiquier.SiDeplacer(liSrc, liDest, colSrc, colDest))
            {
                formPartie.Message = "Coup invalide. Cette pièce ne peut effectuer ce déplacement";
                return(false);
            }

            if (!echiquier.EstFlottante(liSrc, colSrc) && !echiquier.CheminLibre(liSrc, liDest, colSrc, colDest))
            {
                formPartie.Message = "Coup invalide. Une pièce se trouve dans le chemin de la pièce";
                return(false);
            }

            Echiquier clone = (Echiquier)echiquier.Clone();

            clone.JouerCoup(liSrc, liDest, colSrc, colDest);

            if (Menaces(clone.PositionRoi(actif), clone).Count > 0)
            {
                formPartie.Message = "Coup illégal. Votre roi se retrouverait en échec";
                return(false);
            }

            return(true);
        }
Пример #3
0
        /// <summary>Crée une partie d'échec</summary>
        /// <param name="noir">Joueur avec les pièces noires</param>
        /// <param name="blanc">Joueur avec les pièces blanches</param>
        public Partie(Joueur noir, Joueur blanc)
        {
            joueurs = new Dictionary <Couleur, Joueur> {
                { Couleur.NOIR, noir },
                { Couleur.BLANC, blanc }
            };

            echiquier = new Echiquier();
            echiquier.InitialisationPieces();
            formPartie = new FormPartie(this);

            actif      = Couleur.NOIR;
            coups      = 0;
            posistions = new List <string>()
            {
                echiquier.ToString()
            };
        }