using CoreLibrary.Exceptions; namespace CoreLibrary { /// /// Représente un code composé de jetons. /// public class Code { private readonly Jeton?[] lesJetons; /// /// Obtenir le nombre de jetons dans le code. /// public int NbJetons { get; private set; } = 0; /// /// Initialise une nouvelle instance de la classe avec la longueur de code spécifiée. /// /// La longueur du code. /// Levée lorsque la longueur du code spécifiée est inférieure ou égale à zéro. public Code(int tailleCode) { if(tailleCode <= 0) { throw new TailleCodeException(tailleCode); } lesJetons = new Jeton?[tailleCode]; } /// /// Initialise une nouvelle instance de la class avec les jetons spécifiés. /// /// Les jetons pour initaliser le code. /// Levée lorsque la collection de jetons spécifiée est vide. public Code(IEnumerable jetons) { if (jetons.Count() == 0) { throw new TailleCodeException(jetons.Count()); } lesJetons = new Jeton?[jetons.Count()]; foreach(Jeton jeton in jetons) { AjouterJeton(jeton); } } /// /// Ajoute un jeton au code. /// /// Le jeton à ajouter /// Levée lorsque le code est plein. public void AjouterJeton(Jeton jeton) { if (NbJetons == TailleMaximale()) { throw new CodeCompletException(); } lesJetons[NbJetons++] = jeton; } /// /// Supprime le dernier jeton ajouté au code. /// /// Levée lorsque le code est vide. public void SupprimerDernierJeton() { if(NbJetons == 0) { throw new CodeVideException(); } lesJetons[--NbJetons] = null; } /// /// Récupère le jeton à l'indice spécifié dans le code. /// /// L'indice du jeton a récupéré. /// Le jeton situé à l'indice spécifié. /// Levée lorsque l'indice est supérieur à la taille maximale du code, inférieur à 0 ou qu'il n'y a pas de jeton à l'indice spécifié public Jeton RecupererJeton(int indice) { if(indice < 0 || indice > TailleMaximale()) throw new IndiceCodeException(indice, NbJetons-1); Jeton? jeton = lesJetons[indice]; if (!jeton.HasValue) throw new IndiceCodeException(indice, NbJetons-1); return jeton.Value; } /// /// Récupère une énumération des jetons dans le code. /// /// Enumération des jetons du code public IEnumerable Jetons() { return lesJetons; } /// /// Vérifie si le code est complet. /// /// True si le code est complet, sinon False. public bool EstComplet() { return NbJetons == lesJetons.Length; } /// /// Recupère la taille maximal du code. /// /// Taille maximal du code. public int TailleMaximale() { return lesJetons.Length; } /// /// Compare le code avec un autre code et génère des indcateurs de correspondance. /// /// Le code à comparer avec le code actuel /// Enumération d'indicateurs de correspondance entre les deux codes. public IEnumerable Comparer(Code autreCode) { // Mon code est le code correct, l'autre code est celui qui teste Indicateur[] indicateurs = []; /// Vérifie si les deux codes sont complets if (!EstComplet() || !autreCode.EstComplet()) return indicateurs; /// Convertie les jetons des codes en tableaux. Jeton?[] mesJetons = Jetons().ToArray(); Jeton?[] sesJetons = autreCode.Jetons().ToArray(); /// Compare les jetons pour détecter les ceux à la bonnes places /// S'ils sont à la bonne place alors ils sont enlever du tableau et un indicateur BONNEPLACE est ajouter au tableau des indicateurs. for (int i = 0; i < mesJetons.Length; ++i) { Jeton? monJeton = mesJetons[i]; Jeton? sonJeton = sesJetons[i]; if (monJeton.HasValue && sonJeton.HasValue && monJeton.Value.Couleur.Equals(sonJeton.Value.Couleur)) { indicateurs = indicateurs.Append(Indicateur.BONNEPLACE).ToArray(); mesJetons[i] = null; sesJetons[i] = null; } } /// Compare les jetons pour détecter ceux qui ont la bonne couleur. /// S'ils ont la bonne couleur alors ils sont enlever du tableau et un indicateur BONNECOULEUR est ajouter au tableau des indicateurs. for (int i = 0; i < sesJetons.Length; ++i) { Jeton? sonJeton = sesJetons[i]; if (sonJeton.HasValue) { for (int j = 0; j < mesJetons.Length; ++j) { Jeton? monJeton = mesJetons[j]; if (monJeton.HasValue && sonJeton.Value.Couleur.Equals(monJeton.Value.Couleur)) { indicateurs = indicateurs.Append(Indicateur.BONNECOULEUR).ToArray(); mesJetons[j] = null; sesJetons[i] = null; break; } } } } return indicateurs; } } }