/// <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); } } }
/// <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); }
/// <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() }; }