From e2e71611f841a41ba7ae5c42999ed6b06ab6a019 Mon Sep 17 00:00:00 2001 From: "nicolas.barbosa" Date: Thu, 6 Jun 2024 19:25:47 +0200 Subject: [PATCH] ajout du coup moyen, de l'exception nom present et de l'exception du nom robot --- .../PartiePartieTermineeEventArgs.cs | 8 +++- .../Exceptions/JoueurDejaPresentException.cs | 42 +++++++++++++++++++ .../Exceptions/NomJoueurInterditException.cs | 42 +++++++++++++++++++ Sources/CoreLibrary/Joueurs/Joueur.cs | 8 ++-- Sources/CoreLibrary/Manageurs/Manageur.cs | 27 +++++++++--- Sources/CoreLibrary/Partie.cs | 13 +++++- .../CoreLibrary/Statistiques/Statistique.cs | 4 +- .../MauiSpark/Pages/ClassementPage.xaml.cs | 2 +- Sources/MauiSpark/Pages/ConnexionPage.xaml.cs | 11 ++++- Sources/MauiSpark/Pages/PlateauPage.xaml.cs | 8 ++-- Sources/MauiSpark/Vues/JetonVue.xaml.cs | 4 +- 11 files changed, 147 insertions(+), 22 deletions(-) create mode 100644 Sources/CoreLibrary/Exceptions/JoueurDejaPresentException.cs create mode 100644 Sources/CoreLibrary/Exceptions/NomJoueurInterditException.cs diff --git a/Sources/CoreLibrary/Evenements/PartiePartieTermineeEventArgs.cs b/Sources/CoreLibrary/Evenements/PartiePartieTermineeEventArgs.cs index 4996b4b..40bc609 100644 --- a/Sources/CoreLibrary/Evenements/PartiePartieTermineeEventArgs.cs +++ b/Sources/CoreLibrary/Evenements/PartiePartieTermineeEventArgs.cs @@ -7,6 +7,11 @@ namespace CoreLibrary.Evenements /// public class PartiePartieTermineeEventArgs : EventArgs { + /// + /// Nombre de tours joués + /// + public int Tour { get; private init; } + /// /// Liste des gagnants. /// @@ -22,8 +27,9 @@ namespace CoreLibrary.Evenements /// /// Liste des gagnants. /// Liste des perdants. - public PartiePartieTermineeEventArgs(IReadOnlyList gagnants, IReadOnlyList perdants) + public PartiePartieTermineeEventArgs(int tour, IReadOnlyList gagnants, IReadOnlyList perdants) { + Tour = tour; Gagnants = gagnants; Perdants = perdants; } diff --git a/Sources/CoreLibrary/Exceptions/JoueurDejaPresentException.cs b/Sources/CoreLibrary/Exceptions/JoueurDejaPresentException.cs new file mode 100644 index 0000000..89d3682 --- /dev/null +++ b/Sources/CoreLibrary/Exceptions/JoueurDejaPresentException.cs @@ -0,0 +1,42 @@ +using System.Runtime.Serialization; + +namespace CoreLibrary.Exceptions +{ + /// + /// Exception levée lorsqu'un joueur rejoint une partie où il se situe déjà. + /// + [Serializable] + public class JoueurDejaPresentException : Exception + { + // Message par défaut + private const string messageDefaut = "Le joueur que vous souhaitez ajouter est déjà dans la partie."; + + /// + /// Initialise une nouvelle instance de la classe avec le message par défaut. + /// + public JoueurDejaPresentException() : base(messageDefaut) + {} + + /// + /// Initialise une nouvelle instance de la classe avec le message spécifié. + /// + public JoueurDejaPresentException(string message) : base(message) + {} + + /// + /// Initialise une nouvelle instance de la classe avec le message et l'exception parent spécifiés. + /// + public JoueurDejaPresentException(string message, Exception exception) : base(message, exception) + {} + + [Obsolete("This method is obsolete. Use alternative methods for data retrieval.", DiagnosticId = "SYSLIB0051")] + protected JoueurDejaPresentException(SerializationInfo info, StreamingContext contexte) : base(info, contexte) + {} + + [Obsolete("This method is obsolete. Use alternative methods for data retrieval.", DiagnosticId = "SYSLIB0051")] + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + base.GetObjectData(info, context); + } + } +} diff --git a/Sources/CoreLibrary/Exceptions/NomJoueurInterditException.cs b/Sources/CoreLibrary/Exceptions/NomJoueurInterditException.cs new file mode 100644 index 0000000..177ee59 --- /dev/null +++ b/Sources/CoreLibrary/Exceptions/NomJoueurInterditException.cs @@ -0,0 +1,42 @@ +using System.Runtime.Serialization; + +namespace CoreLibrary.Exceptions +{ + /// + /// Exception levée lorsqu'un utilisateur choisi un nom interdit pour son joueur. + /// + [Serializable] + public class NomJoueurInterditException : Exception + { + // Message par défaut + private const string messageDefaut = "Le nom choisi pour votre joueur est interdit."; + + /// + /// Initialise une nouvelle instance de la classe avec le message par défaut. + /// + public NomJoueurInterditException() : base(messageDefaut) + {} + + /// + /// Initialise une nouvelle instance de la classe avec le message spécifié. + /// + public NomJoueurInterditException(string message) : base(message) + {} + + /// + /// Initialise une nouvelle instance de la classe avec le message et l'exception parent spécifiés. + /// + public NomJoueurInterditException(string message, Exception exception) : base(message, exception) + {} + + [Obsolete("This method is obsolete. Use alternative methods for data retrieval.", DiagnosticId = "SYSLIB0051")] + protected NomJoueurInterditException(SerializationInfo info, StreamingContext contexte) : base(info, contexte) + {} + + [Obsolete("This method is obsolete. Use alternative methods for data retrieval.", DiagnosticId = "SYSLIB0051")] + public override void GetObjectData(SerializationInfo info, StreamingContext context) + { + base.GetObjectData(info, context); + } + } +} diff --git a/Sources/CoreLibrary/Joueurs/Joueur.cs b/Sources/CoreLibrary/Joueurs/Joueur.cs index 08aff71..1f9c21a 100644 --- a/Sources/CoreLibrary/Joueurs/Joueur.cs +++ b/Sources/CoreLibrary/Joueurs/Joueur.cs @@ -23,7 +23,7 @@ namespace CoreLibrary.Joueurs private void QuandJoueurSeConnecter(Joueur joueur) => JoueurSeConnecter?.Invoke(this, new JoueurSeConnecterEventArgs(joueur)); [DataMember] - private Dictionary<(IRegles, Statistique), int> statistiques = new Dictionary<(IRegles, Statistique), int>(); + private Dictionary<(IRegles, Statistique), double> statistiques = new Dictionary<(IRegles, Statistique), double>(); /// /// Obtient le nom du joueur. @@ -94,14 +94,14 @@ namespace CoreLibrary.Joueurs /// Les règles du jeu. /// Le type de statistique. /// La valeur de la statistique. - public int Statistique(IRegles regles, Statistique statistique) => statistiques.GetValueOrDefault((regles, statistique),0); + 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) => - statistiques[(regles, statistique)] = Statistique(regles, statistique) + 1; + public void IncrementerStatistique(IRegles regles, Statistique statistique, double valeur = 1) => + statistiques[(regles, statistique)] = Statistique(regles, statistique) + valeur; } } diff --git a/Sources/CoreLibrary/Manageurs/Manageur.cs b/Sources/CoreLibrary/Manageurs/Manageur.cs index cdc7ec2..accc11b 100644 --- a/Sources/CoreLibrary/Manageurs/Manageur.cs +++ b/Sources/CoreLibrary/Manageurs/Manageur.cs @@ -2,6 +2,7 @@ using CoreLibrary.Persistance; using CoreLibrary.Joueurs; using CoreLibrary.Regles; using CoreLibrary.Statistiques; +using CoreLibrary.Core; namespace CoreLibrary.Manageurs { @@ -103,15 +104,29 @@ namespace CoreLibrary.Manageurs partie.PartieDemanderJoueur += (sender, e) => Sauvegarder(); partie.PartieDebutPartie += (sender, e) => Sauvegarder(); partie.PartieDemanderJoueurJouer += (sender, e) => Sauvegarder(); - - partie.PartiePasserLaMain += (sender, e) => - { - DemanderJoueurExistant(e.Joueur)?.IncrementerStatistique(partie.Regles, Statistique.CoupJoue); - 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); diff --git a/Sources/CoreLibrary/Partie.cs b/Sources/CoreLibrary/Partie.cs index 63bda93..caf426b 100644 --- a/Sources/CoreLibrary/Partie.cs +++ b/Sources/CoreLibrary/Partie.cs @@ -4,6 +4,7 @@ using CoreLibrary.Evenements; using CoreLibrary.Joueurs; using CoreLibrary.Regles; using System.Runtime.Serialization; +using CoreLibrary.Exceptions; namespace CoreLibrary { @@ -78,7 +79,7 @@ namespace CoreLibrary /// /// Liste des noms des joueurs gagnants. /// Liste des noms des joueurs perdants. - private void QuandPartiePartieTerminee(IReadOnlyList gagnants, IReadOnlyList perdants) => PartiePartieTerminee?.Invoke(this, new PartiePartieTermineeEventArgs(gagnants, perdants)); + private void QuandPartiePartieTerminee(IReadOnlyList gagnants, IReadOnlyList perdants) => PartiePartieTerminee?.Invoke(this, new PartiePartieTermineeEventArgs(Tour, gagnants, perdants)); /// /// Dictionnaire des joueurs, avec leur nom et le statut de leur joueur (humain ou robot). @@ -187,6 +188,16 @@ namespace CoreLibrary /// L'instance de l'événement JoueurSeConnecterEventArgs créée par Joueur. private void JoueurConnecte(object? sender, JoueurSeConnecterEventArgs e) { + if(Joueurs.Contains(e.Joueur.Nom)) + { + throw new JoueurDejaPresentException(); + } + + if (e.Joueur.Nom.StartsWith("Robot") && e.Joueur.GetType().Equals(typeof(Joueur))) + { + throw new NomJoueurInterditException(); + } + joueurs.Add(e.Joueur.Nom, e.Joueur.GetType().Equals(typeof(Joueur))); plateaux.Add(new Plateau(Regles.TailleCode, Regles.NbTour)); diff --git a/Sources/CoreLibrary/Statistiques/Statistique.cs b/Sources/CoreLibrary/Statistiques/Statistique.cs index 70dfcba..6c63d5b 100644 --- a/Sources/CoreLibrary/Statistiques/Statistique.cs +++ b/Sources/CoreLibrary/Statistiques/Statistique.cs @@ -5,9 +5,9 @@ /// public enum Statistique { + CoupMoyen, PartieGagnee, PartiePerdue, - PartieEgalite, - CoupJoue + PartieEgalite } } diff --git a/Sources/MauiSpark/Pages/ClassementPage.xaml.cs b/Sources/MauiSpark/Pages/ClassementPage.xaml.cs index 2e9d803..4ad5d7a 100644 --- a/Sources/MauiSpark/Pages/ClassementPage.xaml.cs +++ b/Sources/MauiSpark/Pages/ClassementPage.xaml.cs @@ -27,7 +27,7 @@ namespace MauiSpark.Pages /// Obtient les statistiques du joueur dans le classement. /// public IEnumerable Statistiques => Enum.GetValues() - .Select(statistique => Joueur.Statistique(classement.Regles, statistique)); + .Select(statistique => (int)Joueur.Statistique(classement.Regles, statistique)); /// /// Obtient une liste des objets de cet enfant dans le classement (Son nom et sa place). diff --git a/Sources/MauiSpark/Pages/ConnexionPage.xaml.cs b/Sources/MauiSpark/Pages/ConnexionPage.xaml.cs index 8e86105..cc4a04d 100644 --- a/Sources/MauiSpark/Pages/ConnexionPage.xaml.cs +++ b/Sources/MauiSpark/Pages/ConnexionPage.xaml.cs @@ -1,4 +1,5 @@ using CoreLibrary.Evenements; +using CoreLibrary.Exceptions; using CoreLibrary.Joueurs; namespace MauiSpark.Pages; @@ -65,7 +66,15 @@ public partial class ConnexionPage : ContentPage joueur = MauiProgram.Manageur.DemanderJoueur(Nom.Text); } - joueurDemande.SeConnecter(joueur); + try + { + joueurDemande.SeConnecter(joueur); + } + catch(Exception exception) + when (exception is JoueurDejaPresentException || exception is NomJoueurInterditException) + { + DisplayAlert("Attention", exception.Message, "OK"); + } } /// diff --git a/Sources/MauiSpark/Pages/PlateauPage.xaml.cs b/Sources/MauiSpark/Pages/PlateauPage.xaml.cs index 1d46afa..b7672cf 100644 --- a/Sources/MauiSpark/Pages/PlateauPage.xaml.cs +++ b/Sources/MauiSpark/Pages/PlateauPage.xaml.cs @@ -125,9 +125,9 @@ public partial class PlateauPage : ContentPage if(code != null && estJoueur.HasValue && estJoueur.Value) code.SupprimerDernierJeton(); } - catch(CodeVideException) + catch(CodeVideException exception) { - DisplayAlert("Attention", "La code est vide", "OK"); + DisplayAlert("Attention", exception.Message, "OK"); } } @@ -144,9 +144,9 @@ public partial class PlateauPage : ContentPage if (plateau != null && code != null) plateau.AjouterCode(code); } - catch (CodeIncompletException) + catch (CodeIncompletException exception) { - DisplayAlert("Attention", "La code n'est pas complet", "OK"); + DisplayAlert("Attention", exception.Message, "OK"); } } diff --git a/Sources/MauiSpark/Vues/JetonVue.xaml.cs b/Sources/MauiSpark/Vues/JetonVue.xaml.cs index bc8f6a6..2adab7a 100644 --- a/Sources/MauiSpark/Vues/JetonVue.xaml.cs +++ b/Sources/MauiSpark/Vues/JetonVue.xaml.cs @@ -92,9 +92,9 @@ public partial class JetonVue : ContentView { Code.AjouterJeton(new Jeton(couleur)); } - catch (CodeCompletException) + catch (CodeCompletException exception) { - Application.Current.MainPage.DisplayAlert("Attention", "La code est plein", "OK"); + Application.Current.MainPage.DisplayAlert("Attention", exception.Message, "OK"); } } } \ No newline at end of file