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