You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
mastermind/Sources/CoreLibrary/Core/Plateau.cs

83 lines
2.6 KiB

using CoreLibrary.Exceptions;
using CoreLibrary.Evenements;
using System.Runtime.Serialization;
using System.Security.Cryptography;
namespace CoreLibrary.Core
{
[DataContract]
public class Plateau
{
public event EventHandler<PlateauAjouterCodeEventArgs>? PlateauAjouterCode;
private void QuandPlateauAjouterCode() => PlateauAjouterCode?.Invoke(this, new PlateauAjouterCodeEventArgs(this));
[DataMember]
private readonly Code codeSecret;
[DataMember]
private readonly List<Code> codes = new List<Code>();
[DataMember]
private readonly List<List<Indicateur>> indicateurs = new List<List<Indicateur>>();
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<Jeton>>, IEnumerable<IEnumerable<Indicateur>>) 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<Couleur>();
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<Indicateur> indicateursCode = codeSecret.Comparer(code);
indicateurs.Add(indicateursCode.ToList());
if (!Victoire && indicateursCode.Count(indicateur => indicateur == Indicateur.BonnePlace) == TailleMaxCode)
Victoire = true;
QuandPlateauAjouterCode();
}
}
}