From 0d3a30eb7e3b8cc002e7ee42a8ebfee44244f4d6 Mon Sep 17 00:00:00 2001 From: "camille.turpin-etienne" Date: Wed, 5 Jun 2024 13:38:50 +0200 Subject: [PATCH] doc Robot --- Sources/CoreLibrary/Joueurs/Robot.cs | 72 +++++++++++++++++++++++----- 1 file changed, 60 insertions(+), 12 deletions(-) diff --git a/Sources/CoreLibrary/Joueurs/Robot.cs b/Sources/CoreLibrary/Joueurs/Robot.cs index e325998..c80628d 100644 --- a/Sources/CoreLibrary/Joueurs/Robot.cs +++ b/Sources/CoreLibrary/Joueurs/Robot.cs @@ -3,22 +3,37 @@ using CoreLibrary.Evenements; namespace CoreLibrary.Joueurs { + /// + /// Représente un joueur automatique (robot). + /// public class Robot : Joueur { private static int nbRobots = 0; private List? codesPossibles; + /// + /// Initialise une nouvelle instance de la classe . + /// public Robot() : base($"Naps {++nbRobots}") { } + /// + /// Initialise une nouvelle instance de la classe avec le nom spécifié. + /// + /// Le nom du robot. public Robot(string nom) : base(nom) { } + /// + /// Méthode appelée lorsqu'un joueur doit jouer dans une partie. + /// + /// La source de l'événement. + /// Les arguments de l'événement. public override void QuandDemanderJoueurJouer(object? sender, PartieDemanderJoueurJouerEventArgs e) { if (e.Nom != Nom) @@ -32,60 +47,90 @@ namespace CoreLibrary.Joueurs SupprimerCodesImpossibles(e.Plateau); - for(int i = 0; i < e.Code.TailleMax; ++i) + for (int i = 0; i < e.Code.TailleMax; ++i) e.Code.AjouterJeton(codesPossibles.ElementAt(0).Jetons[i]); } + /// + /// Génère tous les codes possibles pour une taille de code donnée. + /// + /// La taille du code. private void GenererTousCodesPossibles(int tailleCode) { + // Obtient toutes les valeurs de l'énumération Couleur Couleur[] couleurs = Enum.GetValues(); + + // Calcule le nombre total de combinaisons possibles int nbLignes = (int)Math.Pow(couleurs.Length, tailleCode); + + // Crée une matrice pour stocker les jetons de chaque combinaison Jeton?[,] jetons = new Jeton?[nbLignes, tailleCode]; - for(int indiceColonne = 0; indiceColonne < jetons.GetLength(1); ++indiceColonne) + // Pour chaque colonne de la matrice + for (int indiceColonne = 0; indiceColonne < jetons.GetLength(1); ++indiceColonne) { + // Calcule le nombre de répétitions pour chaque couleur int repetition = nbLignes / (int)Math.Pow(couleurs.Length, (indiceColonne + 1)); + // Pour chaque ligne de la matrice for (int indiceLigne = 0; indiceLigne < jetons.GetLength(0); ++indiceLigne) { - jetons[indiceLigne, indiceColonne] = new Jeton(couleurs[(indiceLigne / repetition) % couleurs.Length]); + // Calcule l'indice de la couleur à utiliser dans cette colonne + int couleurIndex = (indiceLigne / repetition) % couleurs.Length; + + // Crée un jeton avec la couleur correspondante et l'ajoute à la matrice + jetons[indiceLigne, indiceColonne] = new Jeton(couleurs[couleurIndex]); } } + // Pour chaque combinaison de jetons générée for (int i = 0; i < jetons.GetLength(0); ++i) { + // Crée un nouveau code avec les jetons de la combinaison Code code = new Code(tailleCode); for (int j = 0; j < jetons.GetLength(1); ++j) { code.AjouterJeton(jetons[i, j]!.Value); } + + // Ajoute le code à la liste des codes possibles codesPossibles!.Add(code); } } + /// + /// Vérifie si un code est possible sur le plateau. + /// + /// Le plateau de jeu. + /// Le code à vérifier. + /// True si le code est possible, sinon False. private bool EstCodePossible(Plateau plateau, Code code) { - for(int i = 0; i < plateau.Taille; ++i) + for (int i = 0; i < plateau.Taille; ++i) { Code sonCode = new Code(code.TailleMax); - for(int j = 0; j < code.TailleMax; ++j) + for (int j = 0; j < code.TailleMax; ++j) { sonCode.AjouterJeton(plateau.Grille.Item1.ElementAt(i).ElementAt(j)); } IReadOnlyList indicateurs = sonCode.Comparer(code); - if ( - - indicateurs.Count(indicateur => indicateur == Indicateur.BonnePlace) != plateau.Grille.Item2.ElementAt(i).Count(indicateur => indicateur == Indicateur.BonnePlace) || - indicateurs.Count(indicateur => indicateur == Indicateur.BonneCouleur) != plateau.Grille.Item2.ElementAt(i).Count(indicateur => indicateur == Indicateur.BonneCouleur) - ) + // Vérifie si les indicateurs du code correspondent aux indicateurs du plateau + if (indicateurs.Count(indicateur => indicateur == Indicateur.BonnePlace) != plateau.Grille.Item2.ElementAt(i).Count(indicateur => indicateur == Indicateur.BonnePlace) || + indicateurs.Count(indicateur => indicateur == Indicateur.BonneCouleur) != plateau.Grille.Item2.ElementAt(i).Count(indicateur => indicateur == Indicateur.BonneCouleur)) + { return false; + } } return true; } + /// + /// Supprime les codes impossibles du plateau. + /// + /// Le plateau de jeu. private void SupprimerCodesImpossibles(Plateau plateau) { if (codesPossibles == null) @@ -93,12 +138,15 @@ namespace CoreLibrary.Joueurs List indicesASupprimer = new List(); - for(int i = codesPossibles.Count - 1; i >= 0; --i) + // Pour chaque code possible + for (int i = codesPossibles.Count - 1; i >= 0; --i) { - if(!EstCodePossible(plateau, codesPossibles.ElementAt(i))) + // Vérifie s'il est possible sur le plateau + if (!EstCodePossible(plateau, codesPossibles.ElementAt(i))) indicesASupprimer.Add(i); } + // Supprime les codes impossibles de la liste foreach (int indice in indicesASupprimer) codesPossibles.RemoveAt(indice); }