ajout du coup moyen, de l'exception nom present et de l'exception du nom robot

master
Céleste BARBOSA 1 year ago
parent 7327403d56
commit e2e71611f8

@ -7,6 +7,11 @@ namespace CoreLibrary.Evenements
/// </summary>
public class PartiePartieTermineeEventArgs : EventArgs
{
/// <summary>
/// Nombre de tours joués
/// </summary>
public int Tour { get; private init; }
/// <summary>
/// Liste des gagnants.
/// </summary>
@ -22,8 +27,9 @@ namespace CoreLibrary.Evenements
/// </summary>
/// <param name="gagnants">Liste des gagnants.</param>
/// <param name="perdants">Liste des perdants.</param>
public PartiePartieTermineeEventArgs(IReadOnlyList<string> gagnants, IReadOnlyList<string> perdants)
public PartiePartieTermineeEventArgs(int tour, IReadOnlyList<string> gagnants, IReadOnlyList<string> perdants)
{
Tour = tour;
Gagnants = gagnants;
Perdants = perdants;
}

@ -0,0 +1,42 @@
using System.Runtime.Serialization;
namespace CoreLibrary.Exceptions
{
/// <summary>
/// Exception levée lorsqu'un joueur rejoint une partie où il se situe déjà.
/// </summary>
[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.";
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="JoueurDejaPresentException"/> avec le message par défaut.
/// </summary>
public JoueurDejaPresentException() : base(messageDefaut)
{}
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="JoueurDejaPresentException"/> avec le message spécifié.
/// </summary>
public JoueurDejaPresentException(string message) : base(message)
{}
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="JoueurDejaPresentException"/> avec le message et l'exception parent spécifiés.
/// </summary>
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);
}
}
}

@ -0,0 +1,42 @@
using System.Runtime.Serialization;
namespace CoreLibrary.Exceptions
{
/// <summary>
/// Exception levée lorsqu'un utilisateur choisi un nom interdit pour son joueur.
/// </summary>
[Serializable]
public class NomJoueurInterditException : Exception
{
// Message par défaut
private const string messageDefaut = "Le nom choisi pour votre joueur est interdit.";
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="NomJoueurInterditException"/> avec le message par défaut.
/// </summary>
public NomJoueurInterditException() : base(messageDefaut)
{}
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="NomJoueurInterditException"/> avec le message spécifié.
/// </summary>
public NomJoueurInterditException(string message) : base(message)
{}
/// <summary>
/// Initialise une nouvelle instance de la classe <see cref="NomJoueurInterditException"/> avec le message et l'exception parent spécifiés.
/// </summary>
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);
}
}
}

@ -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>();
/// <summary>
/// Obtient le nom du joueur.
@ -94,14 +94,14 @@ namespace CoreLibrary.Joueurs
/// <param name="regles">Les règles du jeu.</param>
/// <param name="statistique">Le type de statistique.</param>
/// <returns>La valeur de la statistique.</returns>
public int Statistique(IRegles regles, Statistique statistique) => statistiques.GetValueOrDefault((regles, statistique),0);
public double Statistique(IRegles regles, Statistique statistique) => statistiques.GetValueOrDefault((regles, statistique),0);
/// <summary>
/// Incrémente la valeur de la statistique spécifiée pour les règles données.
/// </summary>
/// <param name="regles">Les règles du jeu.</param>
/// <param name="statistique">Le type de statistique.</param>
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;
}
}

@ -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);

@ -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
/// </summary>
/// <param name="gagnants">Liste des noms des joueurs gagnants.</param>
/// <param name="perdants">Liste des noms des joueurs perdants.</param>
private void QuandPartiePartieTerminee(IReadOnlyList<string> gagnants, IReadOnlyList<string> perdants) => PartiePartieTerminee?.Invoke(this, new PartiePartieTermineeEventArgs(gagnants, perdants));
private void QuandPartiePartieTerminee(IReadOnlyList<string> gagnants, IReadOnlyList<string> perdants) => PartiePartieTerminee?.Invoke(this, new PartiePartieTermineeEventArgs(Tour, gagnants, perdants));
/// <summary>
/// Dictionnaire des joueurs, avec leur nom et le statut de leur joueur (humain ou robot).
@ -187,6 +188,16 @@ namespace CoreLibrary
/// <param name="e">L'instance de l'événement JoueurSeConnecterEventArgs créée par Joueur.</param>
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));

@ -5,9 +5,9 @@
/// </summary>
public enum Statistique
{
CoupMoyen,
PartieGagnee,
PartiePerdue,
PartieEgalite,
CoupJoue
PartieEgalite
}
}

@ -27,7 +27,7 @@ namespace MauiSpark.Pages
/// Obtient les statistiques du joueur dans le classement.
/// </summary>
public IEnumerable<int> Statistiques => Enum.GetValues<Statistique>()
.Select(statistique => Joueur.Statistique(classement.Regles, statistique));
.Select(statistique => (int)Joueur.Statistique(classement.Regles, statistique));
/// <summary>
/// Obtient une liste des objets de cet enfant dans le classement (Son nom et sa place).

@ -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");
}
}
/// <summary>

@ -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");
}
}

@ -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");
}
}
}
Loading…
Cancel
Save