diff --git a/Sources/CoreLibrary/Code.cs b/Sources/CoreLibrary/Code.cs index 0c6dc64..137fd3f 100644 --- a/Sources/CoreLibrary/Code.cs +++ b/Sources/CoreLibrary/Code.cs @@ -1,186 +1,178 @@ -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.Any()) - { - 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 = []; - - if (!autreCode.EstComplet()) +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.Any()) + { + 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 = []; + + if (!autreCode.EstComplet()) return indicateurs; - Jeton?[] mesJetons = Jetons().ToArray(); - Jeton?[] sesJetons = autreCode.Jetons().ToArray(); - - 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; - } - } - - - 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; - } - } -} - - + List mesJetons = new List(Jetons()); + List sesJetons = new List(autreCode.Jetons()); + + for (int i = 0; i < mesJetons.Count; ++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; + } + } + + + for (int i = 0; i < sesJetons.Count; ++i) + { + Jeton? sonJeton = sesJetons[i]; + + + + if (sonJeton.HasValue && mesJetons.Contains(sonJeton.Value)) + { + indicateurs = indicateurs.Append(Indicateur.BONNECOULEUR).ToArray(); + mesJetons[mesJetons.IndexOf(sonJeton)] = null; + sesJetons[i] = null; + } + } + + return indicateurs; + } + } +} + +