using CoreLibrary.Events; using CoreLibrary.Exceptions; namespace CoreLibrary { public class Partie { private readonly IRegles regles; public delegate string? StringEventHandler(Object? sender, TEventArgs e); public delegate Jeton? JetonEventHandler(Object? sender, TEventArgs e); public event StringEventHandler? DemanderJoueur; public event JetonEventHandler? DemanderJeton; public event EventHandler? AjouterJoueur; public event EventHandler? DebutPartie; public event EventHandler? NouveauTour; public event EventHandler? AjouterJeton; public event EventHandler? SupprimerDernierJeton; public event EventHandler? AjouterCode; public event EventHandler? PasserMain; public event EventHandler? PartieTerminee; private string? QuandDemanderJoueur(int numero) => DemanderJoueur?.Invoke(this, new DemanderJoueurEventArgs(numero)); private Jeton? QuandDemanderJeton() => DemanderJeton?.Invoke(this, new DemanderJetonEventArgs()); private void QuandAjouterJoueur(Joueur joueur) => AjouterJoueur?.Invoke(this, new AjouterJoueursEventArgs(joueur)); private void QuandDebutPartie() => DebutPartie?.Invoke(this, new DebutPartieEventArgs()); private void QuandNouveauTour(Joueur joueur, int tour, IEnumerable> grille, IEnumerable> indicateurs) => NouveauTour?.Invoke(this, new NouveauTourEventArgs(joueur, tour, grille, indicateurs)); private void QuandNouveauJeton(Jeton jeton) => AjouterJeton?.Invoke(this, new AjouterJetonEventArgs(jeton)); private void QuandSupprimerDernierJeton() => SupprimerDernierJeton?.Invoke(this, new SupprimerDernierJetonEventArgs()); private void QuandNouveauCode(Code code) => AjouterCode?.Invoke(this, new AjouterCodeEventArgs(code)); private void QuandPasserMain() => PasserMain?.Invoke(this, new PasserMainEventArgs()); private void QuandPartieTerminee(IEnumerable gagnants, IEnumerable perdants) => PartieTerminee?.Invoke(this, new PartieTermineeEventArgs(gagnants, perdants)); public Partie(IRegles regles) { this.regles = regles; } public void Jouer() { while (regles.NbJoueurs != regles.NbJoueursMaximum) { string nom = QuandDemanderJoueur(regles.NbJoueurs + 1) ?? $"Joueur {regles.NbJoueurs+1}"; Joueur joueur = regles.AjouterJoueur(nom); QuandAjouterJoueur(joueur); } regles.CommencerLaPartie(); QuandDebutPartie(); while (!regles.EstTerminee()) { Joueur joueurCourant = regles.JoueurCourant(); Plateau plateauCourant = joueurCourant.Plateau; QuandNouveauTour(joueurCourant, plateauCourant.Tour, plateauCourant.Grille(), plateauCourant.Indicateurs()); Code code = regles.GenererCode(); while (!code.EstComplet()) { Jeton? jeton = QuandDemanderJeton(); if(jeton == null) { if(DemanderJeton != null) { // Si quelqu'un écoute l'événement mais ne renvoie rien, alors on supprime le dernier jeton try { code.SupprimerDernierJeton(); QuandSupprimerDernierJeton(); } catch(CodeVideException){} } else { // Si personne n'écoute l'évenment, on met un jeton aléatoire jeton = new Jeton(); } } if(jeton != null) { code.AjouterJeton(jeton.Value); QuandNouveauJeton(jeton.Value); } } plateauCourant.AjouterCode(code); QuandNouveauCode(code); regles.PasserLaMain(); QuandPasserMain(); } regles.Gagnants(); regles.Perdants(); QuandPartieTerminee(regles.Gagnants(), regles.Perdants()); } } }