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