using CoreLibrary.Core; using CoreLibrary.Events; using CoreLibrary.Joueurs; using CoreLibrary.Regles; namespace CoreLibrary { /// /// Représente une partie de jeu. /// public class Partie { private readonly IRegles regles; /// /// Définit le délégué pour gérer les événements avec des arguments de type string. /// public delegate string? StringEventHandler(Object? sender, TEventArgs e); /// /// Définit le délégué pour gérer les événements avec des arguments de type Jeton. /// public delegate Jeton? JetonEventHandler(Object? sender, TEventArgs e); /// /// Événement déclenché lorsqu'il est nécessaire de d'ajouter un joueur. /// public event StringEventHandler? DemanderNom; /// /// Événement déclenché lorsqu'il est nécessaire d'ajouter un joueur. /// public event EventHandler? AjouterJoueur; /// /// Événement déclenché lorsqu'une partie commence. /// public event EventHandler? DebutPartie; /// /// Événement déclenché lorsqu'un nouveau tour commence. /// public event EventHandler? NouveauTour; /// /// Événement déclenché lorsqu'il est nécessaire d'ajouter un jeton. /// public event EventHandler? AjouterJeton; /// /// Événement déclenché lorsqu'un jeton est supprimé. /// public event EventHandler? SupprimerDernierJeton; /// /// Événement déclenché lorsqu'un code est ajouté. /// public event EventHandler? AjouterCode; /// /// Événement déclenché lorsque la main est passée au joueur suivant. /// public event EventHandler? PasserMain; /// /// Événement déclenché lorsque la partie est terminée. /// public event EventHandler? PartieTerminee; /// /// Méthode pour déclencher l'événement de demande d'ajout d'un joueur. /// /// Le numéro du joueur à ajouter /// Le nom du joueur demandé private string? QuandDemanderNom(int numero, JoueurBuilder joueurBuilder) => DemanderNom?.Invoke(this, new DemanderNomEventArgs(numero, joueurBuilder)); /// /// Méthode pour déclencher l'événement d'ajout d'un joueur. /// /// Le joueur à ajouter. private void QuandAjouterJoueur(Joueur joueur) => AjouterJoueur?.Invoke(this, new AjouterJoueursEventArgs(joueur)); /// /// Méthode pour déclencher l'événement du début d'un partie. /// private void QuandDebutPartie() => DebutPartie?.Invoke(this, new DebutPartieEventArgs()); /// /// Méthode pour déclencher l'événement d'un nouveau tour. /// /// Le joueur dont c'est le tour. /// Le numéro du tour. /// La grille de jeu. /// Les indicateurs de jeu. private void QuandNouveauTour(Joueur joueur, int tour, IEnumerable> grille, IEnumerable> indicateurs) => NouveauTour?.Invoke(this, new NouveauTourEventArgs(joueur, tour, grille, indicateurs)); /// /// Méthode pour déclencher l'événement d'ajout d'un nouveau jeton. /// /// Le jeton à ajouter. private void QuandNouveauJeton(Jeton jeton) => AjouterJeton?.Invoke(this, new AjouterJetonEventArgs(jeton)); /// /// Méthode pour déclencher l'événement de suppression du dernier jeton du code. /// private void QuandSupprimerDernierJeton() => SupprimerDernierJeton?.Invoke(this, new SupprimerDernierJetonEventArgs()); /// /// Méthode pour déclencher l'événement d'ajout d'un nouveau code. /// /// Le code à ajouter. private void QuandNouveauCode(Code code) => AjouterCode?.Invoke(this, new AjouterCodeEventArgs(code)); /// /// Méthode pour déclencher l'événement de passage de la main au joueur suivant. /// private void QuandPasserMain() => PasserMain?.Invoke(this, new PasserMainEventArgs()); /// /// Méthode pour déclencher l'événement de fin de partie. /// /// La liste des joueurs gagnants. /// La liste des joueurs perdants. private void QuandPartieTerminee(IEnumerable gagnants, IEnumerable perdants) => PartieTerminee?.Invoke(this, new PartieTermineeEventArgs(gagnants, perdants)); /// /// Crée une nouvelle instance de la classe Partie. /// /// Les règles de la partie. public Partie(IRegles regles) { this.regles = regles; } /// /// Lance le déroulement de la partie. /// public void Jouer() { JoueurBuilder joueurBuilder = new JoueurBuilder(); joueurBuilder.ConstruireJoueur += Joueur; QuandDemanderNom(regles.NbJoueurs + 1, joueurBuilder); } public void Joueur(Object? sender, ConstruireJoueurEventArgs e) { Joueur joueur = regles.AjouterJoueur(e.Nom); QuandAjouterJoueur(joueur); joueur.JouerCode += Tour; if (regles.NbJoueurs != regles.NbJoueursMaximum) { JoueurBuilder joueurBuilder = new JoueurBuilder(); joueurBuilder.ConstruireJoueur += Joueur; QuandDemanderNom(regles.NbJoueurs + 1, joueurBuilder); } else { Commencer(); } } public void Commencer() { regles.CommencerLaPartie(); QuandDebutPartie(); (Joueur joueurCourant, Plateau plateauCourant) = regles.JoueurCourant(); QuandNouveauTour(joueurCourant, plateauCourant.Tour, plateauCourant.Grille(), plateauCourant.Indicateurs()); } private void Tour(Object? sender, JouerCodeEventArgs e) { (Joueur joueurCourant, Plateau plateauCourant) = regles.JoueurCourant(); plateauCourant.AjouterCode(e.Code); QuandNouveauCode(e.Code); if(regles.EstTerminee()) { Terminee(); } else { regles.PasserLaMain(); QuandPasserMain(); } } private void Terminee() { QuandPartieTerminee(regles.Gagnants(), regles.Perdants()); } } }