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/Plateau.cs

113 lines
3.0 KiB

namespace CoreLibrary
{
public class Plateau
{
private static Random random = new Random();
private readonly Code codeSecret;
private readonly Code?[] grille;
private readonly IEnumerable<Indicateur>[] indicateurs;
private readonly int tailleCode;
public int Tour { get; private set; } = 1;
public bool Victoire { get; private set; } = false;
public Plateau(int tailleCode, int tailleGrille)
{
if(tailleCode <= 0)
{
throw new PlateauTailleCodeException();
}
if (tailleGrille <= 0)
{
throw new PlateauTailleGrilleException();
}
codeSecret = new Code(tailleCode);
grille = new Code?[tailleGrille];
indicateurs = new IEnumerable<Indicateur>[tailleGrille];
this.tailleCode = tailleCode;
GenererCodeAleatoire();
}
private void GenererCodeAleatoire()
{
Couleur[] couleurs = (Couleur[])Enum.GetValues(typeof(Couleur));
for (int i = 0; i < tailleCode; ++i)
{
codeSecret.AjouterJeton(new Jeton(couleurs[random.Next(couleurs.Length)]));
}
}
public bool EstComplet()
{
return Tour - 1 == grille.Length;
}
public void AjouterCode(Code code)
{
if (code.TailleMaximale() != tailleCode)
{
throw new PlateauTailleCodeException();
}
if (!code.EstComplet())
{
throw new PlateauCodeIncompletException();
}
indicateurs[Tour - 1] = codeSecret.Comparer(code);
grille[Tour - 1] = code;
++Tour;
if (EstBonCode(code))
{
Victoire = true;
}
}
public bool EstBonCode(Code code)
{
IEnumerable<Indicateur> indicateurs = codeSecret.Comparer(code);
if (indicateurs.Count() != tailleCode)
{
return false;
}
foreach (Indicateur indicateur in indicateurs)
{
if (indicateur != Indicateur.BONNEPLACE)
{
return false;
}
}
return true;
}
public IEnumerable<IEnumerable<Jeton?>> Grille()
{
IEnumerable<Jeton?>[] grilleJetons = new IEnumerable<Jeton?>[grille.Length];
for (int i = 0; i < grille.Length; ++i)
{
grilleJetons[i] = grille[i]?.Jetons() ?? new Code(tailleCode).Jetons();
}
return grilleJetons;
}
public IEnumerable<IEnumerable<Indicateur>> Indicateurs()
{
return indicateurs;
}
}
}