using CoreLibrary.Persistance; using CoreLibrary.Joueurs; using CoreLibrary.Regles; using CoreLibrary.Statistiques; using System.Text.RegularExpressions; namespace CoreLibrary.Manageurs { /// /// Classe représentant un manager. /// public class Manageur { /// /// Attribut privé pour la persistance. /// private readonly IPersistance persistance; /// /// Liste des joueurs enregistrés. /// private readonly List joueurs; /// /// Liste des parties enregistrées. /// private readonly List parties; /// /// Obtient la liste des joueurs enregistrés. /// public IReadOnlyList Joueurs => joueurs; /// /// Obtient la liste des parties enregistrées terminés. /// public IReadOnlyList Parties => parties; /// /// Obtient la liste des parties non terminées. /// public IReadOnlyList PartiesNonTerminees => parties.Where(partie => !partie.Termine).Reverse().ToList(); /// /// Constructeur de manager avec la persistance spécifiée. /// /// Persistance permettant le chargement des joueurs et parties. public Manageur(IPersistance persistance) { this.persistance = persistance; joueurs = persistance.Charger().ToList(); parties = persistance.Charger().ToList(); } /// /// Sauvegarde les joueurs et les parties. /// private void Sauvegarder() { persistance.Enregistrer(joueurs.ToArray()); persistance.Enregistrer(parties.ToArray()); } /// /// Charge une partie avec la partie à charger spécifiée. /// /// La partie que l'on veut charger. /// Renvoie la partie. public Partie ChargerPartie(Partie partie) { parties.Remove(partie); Partie nouvellePartie = new Partie(partie); parties.Add(nouvellePartie); EcouterPartie(nouvellePartie); return nouvellePartie; } /// /// Créer une nouvelle partie avec les règles spécifiée. /// /// Regle permettant la création de la partie. /// Renvoie la nouvelle partie créée. public Partie NouvellePartie(IRegles regles) { Partie partie = new Partie(regles); parties.Add(partie); EcouterPartie(partie); return partie; } /// /// Suivre le cour d'une partie avec la partie spécifiée. /// Sauvegarde quand certains événements sont appelés dans la partie. /// /// La partie à écouter. private void EcouterPartie(Partie partie) { partie.PartieDemanderJoueur += (sender, e) => Sauvegarder(); partie.PartieDebutPartie += (sender, e) => Sauvegarder(); partie.PartieNouveauTour += (sender, e) => Sauvegarder(); partie.PartiePasserLaMain += (sender, e) => { DemanderJoueur(e.Joueur).IncrementerStatistique(partie.Regles, Statistique.CoupJoue); Sauvegarder(); }; partie.PartiePartieTerminee += (sender, e) => { if (e.Gagnants.Count == 1) { DemanderJoueur(e.Gagnants[0]).IncrementerStatistique(partie.Regles, Statistique.PartieGagnee); } else { foreach (string gagnant in e.Gagnants) DemanderJoueur(gagnant).IncrementerStatistique(partie.Regles, Statistique.PartieEgalite); } foreach (string perdant in e.Perdants) { DemanderJoueur(perdant).IncrementerStatistique(partie.Regles, Statistique.PartiePerdue); } Sauvegarder(); }; } /// /// Demande un joueur avec son nom spécifié. /// /// Nom du joueur que l'on souhaite trouver. /// Renvoie le joueur s'il a été trouvé. Sinon, crée un joueur avec le nom passé en paramètre. public Joueur DemanderJoueur(string nom) { foreach (Joueur joueur in joueurs) { if (joueur.Nom == nom) { return joueur; } } Joueur nouveauJoueur = new Joueur(nom); joueurs.Add(nouveauJoueur); return nouveauJoueur; } } }