/// <summary>
        /// Construction du contrôleur
        /// </summary>
        /// <param name="parametres">Paramètres en provenance du contrôleur précédent</param>
        public void Construire(Dictionary <string, ParametresConstruction> parametres)
        {
            CouleurJoueurs = (ParametresCouleurJoueurs)parametres["Couleur joueurs"];

            grdPartie.IsEnabled = true;

            EstPartieTerminee = false;
            EstDebutPartie    = true;

            GrillePartie = new GrilleJeu(CouleurJoueurs.CouleurJoueur, this);

            ConteneurPiecesCapturees = new ConteneurPiecesCapturees(stpPiecesCapturees);

            // Initialise la liste d'observateurs.
            observers = new List <IObserver <JeuStrategoControl> >();

            // Initialiser l'IA.
            IA = new IA_Stratego(this, CouleurJoueurs.CouleurIA);

            DiviserGrilleJeu();
            ColorerGrilleJeu();
            DefinirZoneSelectionGrille();
            InitialiserSelectionActive();

            if (!PositionnerPieces(((ParametresPiecesJoueur)parametres["Pieces"]).Pieces))
            {
                MessageBox.Show("Nombre de pièces ou couleurs invalide(s).", "Erreur", MessageBoxButton.OK, MessageBoxImage.Error);
                GestionnaireEcransJeu.ChangerEcran("Accueil");
            }
            InitialiserAffichagePieces();

            #region Tests

            // Code des tests initiaux.

            /*
             * ReponseDeplacement deplacement;
             *
             * deplacement = GrillePartie.ResoudreDeplacement(new Point(0, 6), new Point(0, 5)); // Deplacement
             *
             * deplacement = GrillePartie.ResoudreDeplacement(new Point(0, 5), new Point(-1, 5)); // Coord invalide
             * deplacement = GrillePartie.ResoudreDeplacement(new Point(2, 6), new Point(2, 5)); // Lac
             *
             * deplacement = GrillePartie.ResoudreDeplacement(new Point(2, 6), new Point(3, 6)); // Piece vs sa propre couleur
             *
             * deplacement = GrillePartie.ResoudreDeplacement(new Point(1, 6), new Point(1, 5));
             * deplacement = GrillePartie.ResoudreDeplacement(new Point(1, 5), new Point(1, 4));
             * deplacement = GrillePartie.ResoudreDeplacement(new Point(1, 4), new Point(1, 3)); // Prise par attaquant
             *
             * deplacement = GrillePartie.ResoudreDeplacement(new Point(1, 3), new Point(1, 2));
             * deplacement = GrillePartie.ResoudreDeplacement(new Point(1, 2), new Point(1, 1));
             * // deplacement = GrillePartie.ResoudreDeplacement(new Point(1, 1), new Point(1, 0)); // 2 pièces éliminées
             * deplacement = GrillePartie.ResoudreDeplacement(new Point(1, 1), new Point(2, 1));
             * deplacement = GrillePartie.ResoudreDeplacement(new Point(2, 1), new Point(2, 0)); // Attaquant éliminé
             */

            #endregion

            TourJeu = Couleur.Rouge;

            if (!GrillePartie.VerifierDeplacementsBombes(CouleurJoueurs.CouleurJoueur))
            {
                TerminerPartie();
                MessageBox.Show("Vous avez perdu (aucun mouvement possible)...", "Échec");
            }

            if (!GrillePartie.VerifierDeplacementsBombes(CouleurJoueurs.CouleurIA))
            {
                TerminerPartie();
                MessageBox.Show("Vous avez gagné (aucun mouvement possible)!", "Victoire");
            }

            // Lancer l'IA
            if (CouleurJoueurs.CouleurIA == Couleur.Rouge)
            {
                new Thread(LancerIA).Start();
            }
        }
 /// <summary>
 /// Destruction du contrôleur: retire les pièces de l'interface (de la grille et de la liste de pièces capturées)
 /// </summary>
 public void Detruire()
 {
     ConteneurPiecesCapturees.Vider();
     grdPartie.Children.Clear();
 }
        /// <summary>
        /// Exécuter un coup
        /// </summary>
        /// <param name="caseDepart">Case de départ</param>
        /// <param name="caseCible">Case de cible</param>
        /// <returns></returns>
        public ReponseDeplacement ExecuterCoup(Coordonnee caseDepart, Coordonnee caseCible)
        {
            if (EstPartieTerminee)
            {
                return(new ReponseDeplacement());
            }

            Thread executionIA = new Thread(LancerIA);

            ReponseDeplacement reponse = new ReponseDeplacement();

            Piece     attaquant;
            Rectangle affichageAttaquant;

            Piece     cible;
            Rectangle affichageCible;

            if (caseCible != caseDepart)
            {
                // Prendre les informations avant de faire le coup.
                attaquant          = GrillePartie.ObtenirPiece(caseDepart);
                affichageAttaquant = GrillePieces[caseDepart.X][caseDepart.Y];

                cible          = GrillePartie.ObtenirPiece(caseCible);
                affichageCible = GrillePieces[caseCible.X][caseCible.Y];

                if (GrillePartie.EstDeplacementPermis(caseDepart, caseCible) && cible != null && attaquant != null && !attaquant.EstVisible)
                {
                    affichageAttaquant.Fill = new ImageBrush(
                        new BitmapImage(
                            new Uri(
                                "sprites/" + (attaquant.EstDeCouleur(Couleur.Rouge) ? "Rouge/" : "Bleu/") + attaquant.Nom + ".png",
                                UriKind.Relative
                                )
                            )
                        );
                    attaquant.EstVisible = true;
                }
                if (GrillePartie.EstDeplacementPermis(caseDepart, caseCible) && cible != null && !cible.EstVisible)
                {
                    affichageCible.Fill = new ImageBrush(
                        new BitmapImage(
                            new Uri(
                                "sprites/" + (cible.EstDeCouleur(Couleur.Rouge) ? "Rouge/" : "Bleu/") + cible.Nom + ".png",
                                UriKind.Relative
                                )
                            )
                        );
                    cible.EstVisible = true;
                }

                reponse = GrillePartie.ResoudreDeplacement(caseDepart, caseCible);

                foreach (Piece piece in reponse.PiecesEliminees)
                {
                    if (piece.EstDeCouleur(CouleurJoueurs.CouleurIA))
                    {
                        ConteneurPiecesCapturees.AjouterPiece(piece);
                    }
                }

                if (reponse.DeplacementFait)
                {
                    // Retrait de la pièce attaquante de sa position d'origine.
                    grdPartie.Children.Remove(affichageAttaquant);
                    GrillePieces[caseDepart.X][caseDepart.Y] = null;

                    if (reponse.PiecesEliminees.Count == 2)
                    {
                        // Retrait de la pièce attaquée.
                        grdPartie.Children.Remove(GrillePieces[caseCible.X][caseCible.Y]);
                        GrillePieces[caseCible.X][caseCible.Y] = null;
                    }
                    else if (reponse.PiecesEliminees.Count == 1 && reponse.PiecesEliminees[0] != attaquant ||
                             reponse.PiecesEliminees.Count == 0)
                    {
                        // Remplacement de la pièce attaquée par la pièce attaquante.
                        grdPartie.Children.Remove(GrillePieces[caseCible.X][caseCible.Y]);
                        GrillePieces[caseCible.X][caseCible.Y] = null;

                        GrillePieces[caseCible.X][caseCible.Y] = affichageAttaquant;

                        Grid.SetColumn(affichageAttaquant, caseCible.X);
                        Grid.SetRow(affichageAttaquant, caseCible.Y);
                        grdPartie.Children.Add(affichageAttaquant);
                    }

                    if (EstDebutPartie)
                    {
                        EstDebutPartie = false;
                    }

                    // Permet de faire jouer l'IA.
                    if (TourJeu == CouleurJoueurs.CouleurJoueur)
                    {
                        executionIA.Start();
                    }
                    ChangerTourJeu();
                }
            }
            else
            {
                reponse.DeplacementFait = false;
            }

            // Si le joueur ne peut plus jouer, l'IA gagne.
            if (!JoueurACoupsPermis())
            {
                ((JeuStrategoControl)GestionnaireEcransJeu.GetEcranPresent()).TerminerPartie();
                MessageBox.Show("Vous avez perdu (plus de mouvements possibles)...", "Échec");
            }

            return(reponse);
        }