using CoreLibrary.Persistance; using CoreLibrary.Joueurs; using CoreLibrary.Regles; using CoreLibrary.Statistiques; 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 IEnumerable PartiesNonTerminees => parties.Where(partie => !partie.Termine).Reverse(); /// /// 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.PartieDemanderJoueurJouer += (sender, e) => Sauvegarder(); partie.PartiePasserLaMain += (sender, e) => Sauvegarder(); partie.PartiePartieTerminee += (sender, e) => { foreach (string joueur in e.Gagnants.Concat(e.Perdants)) { Joueur? j = DemanderJoueurExistant(joueur); if (j == null) continue; double coupmoyen = j.Statistique(partie.Regles, Statistique.CoupMoyen); double partiesJouees = j.Statistique(partie.Regles, Statistique.PartieGagnee) + j.Statistique(partie.Regles, Statistique.PartieEgalite) + j.Statistique(partie.Regles, Statistique.PartiePerdue); double difference = (-coupmoyen + e.Tour) / (partiesJouees + 1); j.IncrementerStatistique(partie.Regles, Statistique.CoupMoyen, difference); } if (e.Gagnants.Count == 1) { DemanderJoueurExistant(e.Gagnants[0])?.IncrementerStatistique(partie.Regles, Statistique.PartieGagnee); } else { foreach (string gagnant in e.Gagnants) DemanderJoueurExistant(gagnant)?.IncrementerStatistique(partie.Regles, Statistique.PartieEgalite); } foreach (string perdant in e.Perdants) { DemanderJoueurExistant(perdant)?.IncrementerStatistique(partie.Regles, Statistique.PartiePerdue); } Sauvegarder(); }; } /// /// Recherche un joueur existant par son nom. /// /// Le nom du joueur à rechercher. /// Le joueur s'il existe, sinon null. private Joueur? DemanderJoueurExistant(string nom) { foreach (Joueur joueur in joueurs) { if (joueur.Nom == nom) { return joueur; } } return null; } /// /// Recherche un joueur par son nom ou le crée s'il n'existe pas. /// /// Le nom du joueur. /// Le joueur trouvé ou créé. public Joueur DemanderJoueur(string nom) { Joueur? joueur = DemanderJoueurExistant(nom); if (joueur == null) { joueur = new Joueur(nom); joueurs.Add(joueur); } return joueur; } } }