示例#1
0
        /// <summary>
        /// Effectue un déplacement
        /// </summary>
        /// <param name="pointDepart">Coordonnée de départ</param>
        /// <param name="pointCible">Coordonnée de cible</param>
        /// <returns>Les pièce éliminées (dans un objet de transport)</returns>
        public ReponseDeplacement ResoudreDeplacement(Coordonnee pointDepart, Coordonnee pointCible)
        {
            ReponseDeplacement reponse = new ReponseDeplacement();

            CaseJeu caseDepart, caseCible;

            if (EstCoordonneeValide(pointDepart) && EstCoordonneeValide(pointCible))
            {
                caseDepart = GrilleCases[pointDepart.X][pointDepart.Y];
                caseCible  = GrilleCases[pointCible.X][pointCible.Y];

                if (caseDepart.EstOccupe() && EstDeplacementPermis(pointDepart, pointCible))
                {
                    // Faire le déplacement.
                    reponse.PiecesEliminees = caseCible.ResoudreAttaque(caseDepart.Occupant, CouleurJoueur);
                    caseDepart.Occupant     = null;

                    reponse.DeplacementFait = true;
                }
                else
                {
                    reponse.DeplacementFait = false;
                }
            }
            else
            {
                reponse.DeplacementFait = false;
            }

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