Exemplo n.º 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);
                }
            }
        }
Exemplo n.º 2
0
        /// <summary>Gère les action nécessaire après un coup</summary>
        /// <param name="liDest">Indice de la ligne de destination</param>
        /// <param name="colDest">Indice de la colonne de destination</param>
        private void ApresCoup(byte liDest, byte colDest)
        {
            string chaine = echiquier.ToString(); // Représentation en chaine de l'échiquier

            formPartie.AfficherEchiquier(echiquier.ToString());

            actif = (Couleur)((byte)Couleur.BLANC + (byte)Couleur.NOIR - (byte)actif); // Truc de Patrick pour inverser
            formPartie.Message = "C'est à " + joueurs[actif].Nom + " de jouer";

            // Règle des 50 coups
            if (echiquier.EstPion(liDest, colDest) || posistions.Last()[liDest * 8 + colDest] != ' ')
            {
                coups = 0;
            }
            else if (++coups == 50)
            {
                FormPartie.AfficherBoiteDialogue("Partie nulle car les 50 derniers coups consécutifs ont été joués par chacun des joueurs sans le mouvement d'aucun pion et sans aucune prise de pièce. Retour au menu principal.", "Partie nulle");
                formPartie.Close();
            }

            posistions.Add(chaine);

            // Troisième répétition d'une même position
            if (posistions.GroupBy(position => position).Where(group => group.Count() == 3).Count() > 0)
            {
                FormPartie.AfficherBoiteDialogue("Partie nulle car la même position a été répétée trois fois. Retour au menu principal.", "Partie nulle");
                formPartie.Close();
            }

            // Échec et mat
            List <(byte, byte)> menaces = Menaces(echiquier.PositionRoi(actif), echiquier);

            if (menaces.Count > 0)
            {
                if (Mat(menaces))
                {
                    formPartie.Message = "Échec et mat";
                    Victoire((Couleur)((byte)Couleur.BLANC + (byte)Couleur.NOIR - (byte)actif));
                }
                else
                {
                    formPartie.Message = "Échec. " + formPartie.Message;
                }

                // Pat
            }
            else if (Pat())
            {
                formPartie.Message = "Pat. " + formPartie.Message;
                FormPartie.AfficherBoiteDialogue("Partie nulle car le joueur au trait est en situation de pat. Retour au menu principal.", "Partie nulle");
                formPartie.Close();
            }
        }
Exemplo n.º 3
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);
        }