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.
176 lines
6.0 KiB
176 lines
6.0 KiB
using CoreLibrary.Exceptions;
|
|
using System.Runtime.Serialization;
|
|
using System.Security.Cryptography;
|
|
|
|
namespace CoreLibrary.Core
|
|
{
|
|
/// <summary>
|
|
/// Classe représentant un plateau de jeu composé de codes et leurs indicateurs ainsi que les méthodes associées.
|
|
/// </summary>
|
|
[DataContract]
|
|
public class Plateau
|
|
{
|
|
[DataMember]
|
|
private readonly Code codeSecret;
|
|
[DataMember]
|
|
private readonly Code?[] grille;
|
|
[DataMember]
|
|
private readonly IEnumerable<Indicateur>[] indicateurs;
|
|
|
|
[DataMember]
|
|
private readonly int tailleCode;
|
|
|
|
/// <summary>
|
|
/// Le numéro de tour actuel.
|
|
/// </summary>
|
|
[DataMember]
|
|
public int Tour { get; private set; } = 1;
|
|
|
|
/// <summary>
|
|
/// La victoire du joueur, True si le joueur a gagné sinon False
|
|
/// </summary>
|
|
[DataMember]
|
|
public bool Victoire { get; private set; } = false;
|
|
|
|
/// <summary>
|
|
/// Initialise une nouvelle instance de la classe <see cref="Plateau"/>.
|
|
/// </summary>
|
|
/// <param name="tailleCode">Taille des codes du plateau.</param>
|
|
/// <param name="tailleGrille">Taille du plateau de jeu.</param>
|
|
/// <exception cref="TailleCodeException">Levée lorsque la tailleCode est inférieure ou égale à 0.</exception>
|
|
/// <exception cref="TailleGrilleException">Levée lorsque la tailleGrille est inférieure ou égale à 0.</exception>
|
|
public Plateau(int tailleCode, int tailleGrille)
|
|
{
|
|
if (tailleCode <= 0)
|
|
{
|
|
throw new TailleCodeException(tailleCode);
|
|
}
|
|
|
|
if (tailleGrille <= 0)
|
|
{
|
|
throw new TailleGrilleException(tailleGrille);
|
|
}
|
|
|
|
codeSecret = new Code(tailleCode);
|
|
grille = new Code?[tailleGrille];
|
|
indicateurs = new IEnumerable<Indicateur>[tailleGrille];
|
|
|
|
this.tailleCode = tailleCode;
|
|
|
|
GenererCodeAleatoire();
|
|
}
|
|
|
|
/// <summary>
|
|
/// Génère un code secret aléatoire en utilisant des jetons de couleurs aléatoires.
|
|
/// </summary>
|
|
private void GenererCodeAleatoire()
|
|
{
|
|
Couleur[] couleurs = (Couleur[])Enum.GetValues(typeof(Couleur));
|
|
|
|
for (int i = 0; i < tailleCode; ++i)
|
|
{
|
|
codeSecret.AjouterJeton(new Jeton(couleurs[RandomNumberGenerator.GetInt32(0, couleurs.Length)]));
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Vérifie si le plateau de jeu est plein.
|
|
/// </summary>
|
|
/// <returns>True si la tableau est plein, sinon False.</returns>
|
|
public bool EstComplet()
|
|
{
|
|
return Tour - 1 == grille.Length;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Ajoute le code fourni au plateau de jeu.
|
|
/// </summary>
|
|
/// <param name="code">Le code à ajouter au plateau de jeu.</param>
|
|
/// <exception cref="CodeInvalideException">Levée lorsque le code fourni à une taille invalide.</exception>
|
|
/// <exception cref="CodeIncompletException">Levée lorsque le code fourni est incomplet.</exception>
|
|
public void AjouterCode(Code code)
|
|
{
|
|
if (code.NbJetonsMax != tailleCode)
|
|
{
|
|
throw new CodeInvalideException(code.NbJetonsMax, tailleCode);
|
|
}
|
|
|
|
if (!code.EstComplet())
|
|
{
|
|
throw new CodeIncompletException();
|
|
}
|
|
|
|
indicateurs[Tour - 1] = codeSecret.Comparer(code);
|
|
grille[Tour - 1] = code;
|
|
++Tour;
|
|
|
|
if (EstBonCode(code))
|
|
{
|
|
Victoire = true;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// Vérifie si le code fourni correspond au code secret.
|
|
/// </summary>
|
|
/// <param name="code">Le code à vérifier.</param>
|
|
/// <returns>True si le code fourni correspond au code secret, sinon False</returns>
|
|
/// <exception cref="CodeInvalideException">Levée lorsque le code fourni à une taille invalide.</exception>
|
|
/// <exception cref="CodeIncompletException">Levée lorsque le code fourni est incomplet.</exception>
|
|
public bool EstBonCode(Code code)
|
|
{
|
|
if (code.NbJetonsMax != tailleCode)
|
|
{
|
|
throw new CodeInvalideException(code.NbJetonsMax, tailleCode);
|
|
}
|
|
|
|
if (!code.EstComplet())
|
|
{
|
|
throw new CodeIncompletException();
|
|
}
|
|
|
|
IEnumerable<Indicateur> indicateursCode = codeSecret.Comparer(code);
|
|
|
|
if (indicateursCode.Count() != tailleCode)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
foreach (Indicateur indicateur in indicateursCode)
|
|
{
|
|
if (indicateur != Indicateur.BONNEPLACE)
|
|
{
|
|
return false;
|
|
}
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Récupère le plateau de jeu.
|
|
/// </summary>
|
|
/// <returns>Le plateau de jeu représenté sous forme d'un tableau de tableau de jetons.</returns>
|
|
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;
|
|
}
|
|
|
|
/// <summary>
|
|
/// Récupère les indicateurs pour chaque tour.
|
|
/// </summary>
|
|
/// <returns>Les indicateurs pour chaque tour représentés sous forme d'un tableau de tableau d'indicateurs.</returns>
|
|
public IEnumerable<IEnumerable<Indicateur>> Indicateurs()
|
|
{
|
|
return indicateurs;
|
|
}
|
|
}
|
|
}
|
|
|