using CoreLibrary.Exceptions; using CoreLibrary.Persistance; using CoreLibrary.Evenements; using CoreLibrary.Regles; using CoreLibrary.Statistiques; using System.Runtime.Serialization; namespace CoreLibrary.Joueurs { /// /// Représente un joueur. /// [DataContract] [KnownType(typeof(ReglesClassiques))] [KnownType(typeof(ReglesDifficiles))] public class Joueur : IEstPersistant { /// /// Événement déclenché lorsqu'un joueur se connecte. /// public event EventHandler? JoueurSeConnecter; private void QuandJoueurSeConnecter(Joueur joueur) => JoueurSeConnecter?.Invoke(this, new JoueurSeConnecterEventArgs(joueur)); [DataMember] private Dictionary<(IRegles, Statistique), double> statistiques = new Dictionary<(IRegles, Statistique), double>(); /// /// Obtient le nom du joueur. /// [DataMember] public string Nom { get; private set; } = ""; /// /// Indique si le joueur est connecté. /// public bool EstConnecte { get; private set; } = false; /// /// Constructeur de joueur. /// public Joueur() { } /// /// Constructeur de joueur avec le nom spécifié. /// /// Le nom du joueur. public Joueur(string nom) { Nom = nom; } /// /// Connecte le joueur. /// /// Le joueur à connecter. public void SeConnecter(Joueur joueur) { if (EstConnecte) throw new JoueurDejaConnecteException(this); EstConnecte = true; QuandJoueurSeConnecter(joueur); } /// /// Permet au joueur de jouer une partie. /// /// La partie à jouer. public void JouerPartie(Partie partie) { partie.PartieDemanderJoueurJouer += QuandDemanderJoueurJouer; } /// /// Méthode appelée lorsque la partie demande à ce joueur de jouer. /// /// La source de l'événement. /// Les arguments de l'événement. public virtual void QuandDemanderJoueurJouer(object? sender, PartieDemanderJoueurJouerEventArgs e) { } /// /// Retourne une représentation sous forme de chaîne de caractères. /// /// Renvoie une chaîne de caractères du nom du joueur. public override string ToString() => Nom; /// /// Obtient la statistique spécifiée pour les règles données. /// /// Les règles du jeu. /// Le type de statistique. /// La valeur de la statistique. public double Statistique(IRegles regles, Statistique statistique) => statistiques.GetValueOrDefault((regles, statistique),0); /// /// Incrémente la valeur de la statistique spécifiée pour les règles données. /// /// Les règles du jeu. /// Le type de statistique. public void IncrementerStatistique(IRegles regles, Statistique statistique, double valeur = 1) => statistiques[(regles, statistique)] = Statistique(regles, statistique) + valeur; } }