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(int taille, IEnumerable ligne) where T : Enum { Console.Write(" "); foreach (Enum pion in ligne) DessinerPion(pion); // Ajoute des espaces s'il y a moins de taille pions à dessiner Console.Write("".PadLeft((taille - ligne.Count()) * 3 + 1)); } /// /// Dessine un plateau de jeu dans la console, affichant les codes et leurs indicateurs. /// /// Le plateau de jeu. public static void DessinerPlateau(Plateau plateau) { (IReadOnlyList> codes, IReadOnlyList> indicateurs) = plateau.Grille; int tailleGrille = 2 + plateau.TailleMaxCode * 3; Console.WriteLine($"─{new string('─', tailleGrille)}─ ─{new string('─', tailleGrille)}─"); Console.WriteLine($"│{new string(' ', tailleGrille)}│ │{new string(' ', tailleGrille)}│"); for (int i = 0; i < plateau.TailleMax; ++i) { if(i >= codes.Count) { Console.WriteLine($"│{new string(' ', tailleGrille)}│ │{new string(' ', tailleGrille)}│"); continue; } IReadOnlyList ligneCodes = codes.ElementAt(i); IReadOnlyList ligneIndicateurs = indicateurs.ElementAt(i); Console.Write("│"); DessinerLigne(plateau.TailleMaxCode, ligneCodes.Select(jeton => jeton.Couleur)); Console.Write("│ │"); DessinerLigne(plateau.TailleMaxCode, ligneIndicateurs); Console.WriteLine("│"); } Console.WriteLine($"│{new string(' ', tailleGrille)}│ │{new string(' ', tailleGrille)}│"); Console.WriteLine($"─{new string('─', tailleGrille)}─ ─{new string('─', tailleGrille)}─"); } /// /// 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"); } } }