using CoreLibrary.Core; using System.Diagnostics.CodeAnalysis; namespace ConsoleApp { /// /// Classe utilitaire contenant des méthodes pour dessiner des éléments dans la console. /// [ExcludeFromCodeCoverage] public static class Utils { // Dictionnaires associant les valeurs des énumérations avec les couleurs de la console private readonly static Dictionary couleursTerminal = new Dictionary() { {Couleur.NOIR, ConsoleColor.Black }, {Couleur.BLANC, ConsoleColor.White }, {Couleur.ROUGE, ConsoleColor.Red }, {Couleur.VERT, ConsoleColor.Green }, {Couleur.BLEU, ConsoleColor.Blue }, {Couleur.JAUNE, ConsoleColor.DarkYellow } }; private readonly static Dictionary indicateursTerminal = new Dictionary() { {Indicateur.BONNEPLACE, ConsoleColor.Black }, {Indicateur.BONNECOULEUR, ConsoleColor.White } }; /// /// Dessine le titre du jeu dans la console. /// public static void DessinerTitre() { Console.WriteLine(@" __ __ _ _ _ | \/ | __ _ ___| |_ ___ _ _ _ __ (_) _ _ __| | | |\/| |/ _` |(_-<| _|/ -_)| '_|| ' \ | || ' \ / _` | |_| |_|\__,_|/__/ \__|\___||_| |_|_|_||_||_||_|\__,_| "); DessinerSeparateur(); } /// /// Dessine un séparateur dans la console. /// public static void DessinerSeparateur() { Console.WriteLine(@" ─────────────────────────────────────────────────────── "); } /// /// Dessine un pion dans la console. /// /// Le pion à dessiner (une couleur ou un indicateur). public static void DessinerPion(Enum pion) { Console.Write(" "); // Sélectionne la couleur appropriée en fonction du type de pion (une couleur ou un indicateur) // Si Couleur.ROUGE alors le fond sera ConsoleColor.Red // Si Indicateur.BONNEPLACE alors le fond sera ConsoleColor.Black Console.ForegroundColor = pion.GetType().Equals(typeof(Couleur)) ? couleursTerminal.GetValueOrDefault((Couleur)pion) : indicateursTerminal.GetValueOrDefault((Indicateur)pion); // Si la couleur du pion est noir, alors le fond devient blanc, sinon il reste noir Console.BackgroundColor = Console.ForegroundColor.Equals(ConsoleColor.Black) ? ConsoleColor.White : ConsoleColor.Black; Console.OutputEncoding = System.Text.Encoding.UTF8; Console.Write("O"); Console.ResetColor(); Console.Write(" "); } /// /// Dessine une ligne de pions sur la console. /// /// Un tableau d'énumérations représentant les pions à dessiner. private static void DessinerLigne(Enum[] ligne) { foreach(Enum pion in ligne) DessinerPion(pion); // Ajoute des espaces s'il y a moins de 4 pions à dessiner Console.Write("".PadLeft((4 - ligne.Length) * 3)); } /// /// Dessine un plateau de jeu dans la console, affichant les codes et leurs indicateurs. /// /// La grille de jeu. /// Les indicateurs associés à chaque ligne. public static void DessinerPlateau(IEnumerable> grille, IEnumerable> indicateurs) { IEnumerable[] grilleTableau = grille.ToArray(); IEnumerable[] indicateursTableau = indicateurs.ToArray(); Console.WriteLine(" Codes Indicateurs "); Console.WriteLine("──────────────── ────────────────"); Console.WriteLine("│ │ │ │"); for (int i = 0; i < grille.Count(); ++i) { Console.Write("│ "); DessinerLigne( grilleTableau[i] .Where(jeton => jeton.HasValue) .Select(jeton => (Enum)jeton!.Value.Couleur) .ToArray() ); Console.Write(" │ │ "); if (indicateursTableau[i] == null) { indicateursTableau[i] = []; } DessinerLigne( indicateursTableau[i] .Select(indicateur => (Enum)indicateur) .ToArray() ); Console.WriteLine(" │"); } Console.WriteLine("│ │ │ │"); Console.WriteLine("──────────────── ────────────────"); } /// /// Permet à l'utilisateur de choisir un jeton /// L'indice du jeton à ajouter dans le code. /// Le jeton choisi par le joueur. /// public static Jeton? SaisirJeton(int indiceCode) { Console.TreatControlCAsInput = true; Console.CursorVisible = false; bool aChoisi = false; int indice = 0; Couleur[] couleurs = (Couleur[])Enum.GetValues(typeof(Couleur)); while (!aChoisi) { DessinerPion(couleurs[indice]); Console.Write("\b\b\b"); switch (Console.ReadKey(true).Key) { case ConsoleKey.Enter: aChoisi = true; break; case ConsoleKey.LeftArrow: --indice; break; case ConsoleKey.RightArrow: ++indice; break; case ConsoleKey.Escape: if (indiceCode != 0) { aChoisi = true; indice = -2; } break; default: break; } if (indice == -1) indice = couleurs.Length - 1; else if (indice == couleurs.Length) indice = 0; } Console.TreatControlCAsInput = false; Console.CursorVisible = true; return indice != -2 ? new Jeton(couleurs[indice]) : null; } /// /// Permet de supprimer le dernier jeton saisi /// public static void SupprimerDernierJeton() { Console.Write("\b\b\b \b\b\b\b\b\b"); } } }