Idées
Edit
Conteurs
Edit
Ajouter des conteur ?
- La distance parcourue
- Les pirates rencontrés
- Les missions menées
- ...
Fonctions
Edit
Brouillon : PrintStatus
Edit
Une fonction pour montrer l'état (montant d'argent, etc) sur l'écran à tout temps.
Version 1 (2018-08-06)
Edit
static void PrintStatus(int montant) { int StatusX = 0; // On met la ligne de status au debut du ligne... int StatusY = 0; // sur la première ligne de la console (en haut) string fillerPlace = "{0}"; // On remplacera ça avec le separateur plus tard char statusFiller = '='; // On construira le separateur avec ce symbole char moneyChar = '$'; // Le symbole de l'argent // Ici on construit notre bar de status string statusLine = "[Argent " + moneyChar.ToString() + montant.ToString() + "]" + fillerPlace + "[F1 Aide]"; // Et on calcule la longueur de separateurs (fillers) string fillerString = new string(statusFiller, (Console.WindowWidth - StatusX - statusLine.Length + fillerPlace.Length) ); // On position le cursor Console.CursorLeft = StatusX; Console.CursorTop = StatusY; // Et finalement on fait sortir la ligne de status Console.WriteLine(statusLine, fillerString); }
Version 2 (2018-08-06)
Edit
Avec plusieurs paramètres (attaque, bouclier, etc)
static void PrintStatus(int money, int attack, int shield, int reactor) { int StatusX = 0; // On met la ligne de status au debut du ligne... int StatusY = 0; // sur la première ligne de la console (en haut) string fillerPlace = "{0}"; // On remplacera ça avec le separateur plus tard char statusFiller = '='; // On construira le separateur avec ce symbole char moneyChar = '$'; // Le symbole de l'argent char attackChar = '⚔'; char shieldChar = '⛉'; char reactorChar = '☢'; char fuelChar = '⚗'; // Ici on construit notre bar de status string statusLine = "[Argent " + moneyChar.ToString() + money.ToString() + " " + attackChar.ToString() + attack.ToString() + " " + shieldChar.ToString() + shield.ToString() + " " + reactorChar.ToString() + reactor.ToString() + "]" + fillerPlace + "[F1 Aide]"; // Et on calcule la longueur de separateurs (fillers) string fillerString = new string(statusFiller, (Console.WindowWidth - StatusX - statusLine.Length + fillerPlace.Length) ); // On position le cursor Console.CursorLeft = StatusX; Console.CursorTop = StatusY; // Et finalement on fait sortir la ligne de status Console.Write(statusLine, fillerString); }
Version 3 (2018-08-06)
Edit
Sans les symboles Unicode qu'on ne obtiens pas dans la console Windows
static void PrintStatus(int money, int attack, int shield, int reactor) { int StatusX = 0; // On met la ligne de status au debut du ligne... int StatusY = 0; // sur la première ligne de la console (en haut) string fillerPlace = "{0}"; // On remplacera ça avec le separateur plus tard char statusFiller = '='; // On construira le separateur avec ce symbole string moneySymbol = "$"; string attackSymbol = "A:"; string shieldSymbol = "S:"; string reactorSymbol = "R:"; string fuelSymbol = "F:"; // Ici on construit notre bar de status string statusLine = "[Argent " + moneySymbol + money.ToString() + " " + attackSymbol + attack.ToString() + " " + shieldSymbol + shield.ToString() + " " + reactorSymbol + reactor.ToString() + "]" + fillerPlace + "[F1 Aide]"; // Et on calcule la longueur de separateurs (fillers) string fillerString = new string(statusFiller, (Console.WindowWidth - StatusX - statusLine.Length + fillerPlace.Length) ); // On position le cursor Console.CursorLeft = StatusX; Console.CursorTop = StatusY; // Et finalement on fait sortir la ligne de status System.Console.OutputEncoding = System.Text.Encoding.UTF8; Console.Write(statusLine, fillerString); }
Version 4 (2018-08-07)
Edit
Plus d'info dans le bar de status : laser (attack), armure (armor), bouclier (shield), réacteur (reactor), agent de propulsion (fuel) et cargo (utilisé/totale). Aussi le nom du vaisseau, just for fun =)
static void PrintStatus(string shipName, int money, int attack, int armor, int shield, int reactor, int fuel, int cargoLoaded, int cargoTotal) { int StatusX = 0; // On met la ligne de status au debut du ligne... int StatusY = 0; // sur la première ligne de la console (en haut) string fillerPlace = "{0}"; // On remplacera ça avec le separateur plus tard char statusFiller = '='; // On construira le separateur avec ce symbole string moneySymbol = "$"; string attackSymbol = "L:"; // Parce que Laser string armorSymbol = "A:"; string shieldSymbol = "S:"; string reactorSymbol = "R:"; string fuelSymbol = "F:"; string cargoSymbol = "C:"; // Ici on construit notre bar de status string statusLine = "[" + shipName + " " + moneySymbol + money.ToString() + " " + attackSymbol + attack.ToString() + " " + shieldSymbol + shield.ToString() + " " + reactorSymbol + reactor.ToString() + " " + fuelSymbol + fuel.ToString() + " " + cargoSymbol + cargoLoaded + "/" + cargoTotal + "]" + fillerPlace + "[F1 Aide]"; // Et on calcule la longueur de separateurs (fillers) string fillerString = new string(statusFiller, (Console.WindowWidth - StatusX - statusLine.Length + fillerPlace.Length) ); // On position le cursor Console.CursorLeft = StatusX; Console.CursorTop = StatusY; // Et finalement on fait sortir la ligne de status System.Console.OutputEncoding = System.Text.Encoding.UTF8; Console.Write(statusLine, fillerString); }
Brouillon : fonction PrintMenu
Edit
Une fonction pour montrer un menu et obtenir le numéro d'une ligne choisie.
Version 1 (2018-08-06)
Edit
Pas de sélection direct (en tapant les numéro ou lettres)
static int PrintMenu (string[] menu) { // On sauvegarde la position du curseur sur l'écran int CursorX = Console.CursorLeft; int CursorY = Console.CursorTop; // La ligne sélectionnée de menu int selection = 1; int last = 1; // La ligne sélectionnée avant // La fonction soutienne deux façons de selection : // on peut bouger la selecteur (>) par les touches de courseur (up/down); // ou on peut taper la sélection (selectorKeys) directement sur le clavier string selector = "> "; string selectorKeys = "123456789ABCDEFGHIJKLMNOPRSTUVXYZ"; // On utilise ça pour lire l'entrée sur clavier ConsoleKeyInfo key; // Vérifier si on a assez des lignes sur l'écran pour le menu : // on a (Console.WindowHeight - Console.CursorTop) lignes sur l'écran, // et menu.Length lignes dans le menu... // Vérifier aussi s'il y a plus de lignes dans le menu que de selectorKeys ! if ( (Console.WindowHeight - Console.CursorTop) < menu.Length || menu.Length > selectorKeys.Length) { // Pas assez de lignes sur l'écran // ou trop de lignes de menu : // la fonction retourne 0 au lieux de selection et sort tout de suite return 0; } // Afficher le menu for (int i = 1; i <= menu.Length; i++) { Console.CursorLeft = CursorX; Console.CursorTop = CursorY + i - 1; Console.Write(selectorKeys[i-1] + (i == selection ? selector : new string(' ', selector.Length) ) + menu[i - 1]); } // Choisir la ligne do { // Effacer le selecteur sur la ligne précédente... Console.CursorLeft = CursorX + 1; Console.CursorTop = CursorY + last - 1; Console.Write(new String(' ', selector.Length)); // Et imprimer le selecteur sur la ligne sélectionnée Console.CursorLeft = CursorX + 1; Console.CursorTop = CursorY + selection - 1; Console.Write(selector); // Répositionner le curseur sur le selecteur Console.CursorLeft = CursorX; key = Console.ReadKey(true); // On lit l'entrée if (key.Key == ConsoleKey.DownArrow && selection < menu.Length) { last = selection++; } else if (key.Key == ConsoleKey.UpArrow && selection > 1) { last = selection--; } } while (key.Key != ConsoleKey.Enter); // On a la selection, // il faut re-positionner le curseur et retourner le numéro Console.CursorLeft = CursorX; Console.CursorTop = CursorY + menu.Length; return selection; }
Version 2 (2018-08-06)
Edit
Cette version devrait accepter les deux façons de sélection : par les touches curseur et en direct.
static int PrintMenu (string[] menu) { // On sauvegarde la position du curseur sur l'écran int CursorX = Console.CursorLeft; int CursorY = Console.CursorTop; // La ligne sélectionnée de menu int selection = 1; int last = 1; // La ligne sélectionnée avant bool selectionDone = false; // La fonction soutienne deux façons de selection : // on peut bouger la selecteur (>) par les touches de courseur (up/down); // ou on peut taper la sélection (selectorKeys) directement sur le clavier string selector = "> "; string selectorKeys = "123456789ABCDEFGHIJKLMNOPRSTUVXYZ"; // On utilise ça pour lire l'entrée sur clavier ConsoleKeyInfo key; // Vérifier si on a assez des lignes sur l'écran pour le menu : // on a (Console.WindowHeight - Console.CursorTop) lignes sur l'écran, // et menu.Length lignes dans le menu... // Vérifier aussi s'il y a plus de lignes dans le menu que de selectorKeys ! if ( (Console.WindowHeight - Console.CursorTop) < menu.Length || menu.Length > selectorKeys.Length) { // Pas assez de lignes sur l'écran // ou trop de lignes de menu : // la fonction retourne 0 au lieux de selection et sort tout de suite return 0; } // Afficher le menu for (int i = 1; i <= menu.Length; i++) { Console.CursorLeft = CursorX; Console.CursorTop = CursorY + i - 1; Console.Write(selectorKeys[i-1] + (i == selection ? selector : new string(' ', selector.Length) ) + menu[i - 1]); } // Choisir la ligne do { // Effacer le selecteur sur la ligne précédente... Console.CursorLeft = CursorX + 1; Console.CursorTop = CursorY + last - 1; Console.Write(new String(' ', selector.Length)); // Et imprimer le selecteur sur la ligne sélectionnée Console.CursorLeft = CursorX + 1; Console.CursorTop = CursorY + selection - 1; Console.Write(selector); // Répositionner le curseur sur le selecteur Console.CursorLeft = CursorX; key = Console.ReadKey(true); // On lit l'entrée if (key.Key == ConsoleKey.DownArrow && selection < menu.Length) { last = selection++; } else if (key.Key == ConsoleKey.UpArrow && selection > 1) { last = selection--; } else { // Vérifie pour la selection directe for (int i = 1; i <= selectorKeys.Length; i++) { if (Char.ToUpper(key.KeyChar) == selectorKeys[i-1]) { selection = i; selectionDone = true; } } } } while (key.Key != ConsoleKey.Enter && !selectionDone); // On a la selection, // il faut re-positionner le curseur et retourner le numéro Console.CursorLeft = CursorX; Console.CursorTop = CursorY + menu.Length; return selection; }