using CoreLibrary.Exceptions; using CoreLibrary.Evenements; using System.Runtime.Serialization; using System.Security.Cryptography; namespace CoreLibrary.Core { [DataContract] public class Plateau { public event EventHandler? PlateauAjouterCode; private void QuandPlateauAjouterCode() => PlateauAjouterCode?.Invoke(this, new PlateauAjouterCodeEventArgs(this)); [DataMember] private readonly Code codeSecret; [DataMember] private readonly List codes = new List(); [DataMember] private readonly List> indicateurs = new List>(); public int Taille => codes.Count; [DataMember] public int TailleMax { get; private init; } [DataMember] public int TailleMaxCode { get; private init; } public bool Complet => Taille == TailleMax; [DataMember] public bool Victoire { get; private set; } = false; public (IEnumerable>, IEnumerable>) Grille => ( codes.Select(code => code.Jetons), indicateurs ); public Plateau(int tailleCode, int taillePlateau) { if (tailleCode < 0) throw new TailleCodeException(tailleCode); if (taillePlateau < 0) throw new TailleGrilleException(taillePlateau); TailleMax = taillePlateau; TailleMaxCode = tailleCode; codeSecret = GenererCodeSecret(); } private Code GenererCodeSecret() { Code code = new Code(TailleMaxCode); Couleur[] couleurs = Enum.GetValues(); while (!code.Complet) { code.AjouterJeton( new Jeton(couleurs[RandomNumberGenerator.GetInt32(0, couleurs.Length)]) ); } return code; } public void AjouterCode(Code code) { if (!code.Complet) throw new CodeIncompletException(); if (Complet) throw new GrilleCompleteException(); codes.Add(code); IReadOnlyList indicateursCode = codeSecret.Comparer(code); indicateurs.Add(indicateursCode.ToList()); if (!Victoire && indicateursCode.Count(indicateur => indicateur == Indicateur.BonnePlace) == TailleMaxCode) Victoire = true; QuandPlateauAjouterCode(); } } }