Created
February 27, 2014 17:23
-
-
Save squareiguana/9254736 to your computer and use it in GitHub Desktop.
Example (Menu System) Using Functions - Using Coding 101 - Episode 05
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
using System; | |
namespace SquareIguana.Coding101.Example.E05 | |
{ | |
/* Example on what was learned on Coding 101 - Episode 05 - Functions | |
* I made the example trying not to use "advanced" concepts, and only what the episode was trying to teach. | |
* | |
* When I think of a Menu, I think of a GUI that you can select with your keyboard or mouse, not a series of | |
* commands, so I decided to make a Real Menu. I didn't have the time or energy to create something more complete, | |
* but I did create a page for each Menu Item, even if just a simple message. | |
* | |
* The most useful thing in the example, I think is the whole Menu system, even if it is a hackish way to do the | |
* whole selection background thing, at least it works, and that is the important thing, there is probably a more | |
* elegant solution to this particular problem, but I could think of something better. | |
* | |
* This was built with the knowledge learned from Episode 01-05 and my last Example: https://gist.github.com/squareiguana/9254716 | |
* | |
* I'm going out of my way to use only the simple concepts, this definitely needs a refactor once they go into | |
* more "advanced" topics like classes, also the functions are to big, It is better to have a function that does only | |
* one thing. Maybe I'll do a refactor or several, after some of those topics or when I have some free time to show a | |
* more cleaner code. | |
* | |
* Definition of Refactor: To rewrite existing source code in order to improve its readability, reusability or | |
* structure without affecting its meaning or behaviour. | |
*/ | |
class Program | |
{ | |
static int width = 80; | |
static int height = 25; | |
static string BorderCharacter = "◄►"; | |
static int border = BorderCharacter.Length; | |
static ConsoleColor white = ConsoleColor.White; | |
static ConsoleColor black = ConsoleColor.Black; | |
static ConsoleColor gray = ConsoleColor.Gray; | |
static ConsoleColor cyan = ConsoleColor.DarkCyan; | |
static ConsoleColor green = ConsoleColor.DarkGreen; | |
static ConsoleColor red = ConsoleColor.DarkRed; | |
static ConsoleColor blue = ConsoleColor.DarkBlue; | |
static ConsoleColor yellow = ConsoleColor.DarkYellow; | |
static int headerWidth = 0; | |
static int headerHeight = 0; | |
static int padding = 0; | |
static bool IsStartGameItemSelected = true; | |
static bool IsLoadGameItemSelected = false; | |
static bool IsSettingsItemSelected = false; | |
static bool IsAboutItemSelected = false; | |
static bool IsExitItemSelected = false; | |
static void Main(string[] args) | |
{ | |
MainPage(); | |
} | |
static void MainPage() | |
{ | |
Console.Title = "Coding 101 - C# E05 - Functions and a Menu"; | |
Console.CursorVisible = false; | |
Console.SetWindowSize(width, height); | |
Console.BufferWidth = width; | |
Console.BufferHeight = height; | |
Console.BackgroundColor = gray; | |
Console.ForegroundColor = black; | |
Console.Clear(); | |
DrawMenu(); | |
} | |
#region Pages | |
static void StartGamePage() | |
{ | |
Console.BackgroundColor = gray; | |
Console.Clear(); | |
if (border != 0) | |
DrawBorder(); | |
DrawHeader(); | |
SetHeaderText(" Start Game Page is Not Coded Yet "); | |
WaitUntilEscape(); | |
} | |
static void LoadGamePage() | |
{ | |
Console.BackgroundColor = gray; | |
Console.Clear(); | |
if (border != 0) | |
DrawBorder(); | |
DrawHeader(); | |
SetHeaderText(" Load Game Page is Not Coded Yet "); | |
WaitUntilEscape(); | |
} | |
static void SettingsPage() | |
{ | |
Console.BackgroundColor = gray; | |
Console.Clear(); | |
if (border != 0) | |
DrawBorder(); | |
DrawHeader(); | |
SetHeaderText(" Settings Page is Not Coded Yet "); | |
WaitUntilEscape(); | |
} | |
static void AboutPage() | |
{ | |
Console.BackgroundColor = gray; | |
Console.Clear(); | |
DrawInfoBox(); | |
if (border != 0) | |
DrawBorder(); | |
InfoBoxText(); | |
} | |
#endregion | |
#region Helpers | |
static void WaitUntilEscape() | |
{ | |
Console.ReadKey(); | |
MainPage(); | |
} | |
static void SetHeaderText(string text) | |
{ | |
Console.BackgroundColor = red; | |
Console.ForegroundColor = white; | |
Console.SetCursorPosition(padding + 2, border + 2); | |
Console.MoveBufferArea(padding + 3, border + 1, headerWidth - (3 * 2), 1, padding + 3, border + 2, '▒', white, black); | |
Console.SetCursorPosition((headerWidth / 2) - (text.Length / 2) + padding, border + 2); | |
Console.Write(text); | |
} | |
#endregion | |
#region Border | |
static void DrawBorder() | |
{ | |
Console.BackgroundColor = gray; | |
Console.ForegroundColor = red; | |
int tmpCursor = 0; | |
for (int cursor = 0; cursor < width - border; cursor++) | |
{ | |
if (cursor < height - 1) | |
{ | |
Console.SetCursorPosition(0, cursor); | |
Console.Write(BorderCharacter); | |
Console.SetCursorPosition(width - border, cursor); | |
Console.Write(BorderCharacter); | |
} | |
if (tmpCursor >= width - border) | |
continue; | |
Console.SetCursorPosition(tmpCursor, 0); | |
Console.Write(BorderCharacter); | |
Console.SetCursorPosition(tmpCursor, height - border); | |
Console.Write(BorderCharacter); | |
if (border >= 2) | |
{ | |
for (int borderLine = 1; borderLine < border; borderLine++) | |
{ | |
Console.SetCursorPosition(tmpCursor, borderLine); | |
Console.Write(BorderCharacter); | |
Console.SetCursorPosition(tmpCursor, height - borderLine); | |
Console.Write(BorderCharacter); | |
} | |
} | |
tmpCursor += border; | |
} | |
// This is to write the right lower corner without going to the next line and loosing the first line | |
Console.BufferWidth = Console.BufferWidth + 1; // Enlarge buffer width in order to prevent it from going to the next line | |
Console.SetCursorPosition(width - border, height - 1); | |
Console.Write(BorderCharacter); | |
Console.BufferWidth = Console.BufferWidth - 1; // Restore buffer to the original size | |
} | |
#endregion | |
#region Menu | |
static void DrawMenu() | |
{ | |
string menuTop = " ╔════════════════════════════╗ "; | |
string menuFill = " ║ ║ "; | |
string menuBottom = " ╚════════════════════════════╝ "; | |
string line = " ╟────────────────────────────╢ "; | |
int menuWidth = menuTop.Length; | |
padding = ((width - (menuWidth + (border * 2))) / 2) + border; | |
// Add Drop Shadow | |
Console.MoveBufferArea(padding + 1, border + 8, menuWidth, height - border - 8, padding + 1, height - border - 2, '░', black, gray); | |
if (border != 0) | |
DrawBorder(); | |
DrawMenuAscii(); | |
Console.BackgroundColor = white; | |
Console.ForegroundColor = black; | |
Console.SetCursorPosition(padding, height - border - 14); | |
Console.Write(menuTop); | |
for (int i = 13; i >= 5; i--) | |
{ | |
Console.SetCursorPosition(padding, height - border - i); | |
Console.Write(menuFill); | |
i--; | |
Console.SetCursorPosition(padding, height - border - i); | |
Console.Write(line); | |
} | |
MenuItems(); | |
Console.SetCursorPosition(padding, height - border - 4); | |
Console.Write(menuBottom); | |
MenuLogic(); | |
} | |
static void MenuLogic() | |
{ | |
int position = border + 8; | |
Console.SetCursorPosition(padding + 2, position); | |
ConsoleKeyInfo keyInfo; | |
while ((keyInfo = Console.ReadKey(true)).Key != ConsoleKey.Enter) | |
{ | |
if (keyInfo.Key == ConsoleKey.UpArrow) | |
{ | |
if (position > border + 8) | |
position -= 2; | |
} | |
else if (keyInfo.Key == ConsoleKey.DownArrow) | |
{ | |
if (position < border + 16) | |
position += 2; | |
} | |
SelectedMenuItem((position - 8) / 2); | |
} | |
ActivateMenuItem((position - 8) / 2); | |
} | |
static void SelectedMenuItemColor() | |
{ | |
Console.BackgroundColor = blue; | |
Console.ForegroundColor = white; | |
} | |
static void UnselectedMenuItemColor() | |
{ | |
Console.BackgroundColor = white; | |
Console.ForegroundColor = black; | |
} | |
static void MenuItems() | |
{ | |
if (IsStartGameItemSelected) | |
SelectedMenuItemColor(); | |
else | |
UnselectedMenuItemColor(); | |
Console.SetCursorPosition(padding + 2, height - border - 13); | |
Console.Write(" [Start Game]".PadRight(28)); | |
if (IsLoadGameItemSelected) | |
SelectedMenuItemColor(); | |
else | |
UnselectedMenuItemColor(); | |
Console.SetCursorPosition(padding + 2, height - border - 11); | |
Console.Write(" [Load Game]".PadRight(28)); | |
if (IsSettingsItemSelected) | |
SelectedMenuItemColor(); | |
else | |
UnselectedMenuItemColor(); | |
Console.SetCursorPosition(padding + 2, height - border - 9); | |
Console.Write(" [Settings]".PadRight(28)); | |
if (IsAboutItemSelected) | |
SelectedMenuItemColor(); | |
else | |
UnselectedMenuItemColor(); | |
Console.SetCursorPosition(padding + 2, height - border - 7); | |
Console.Write(" [About]".PadRight(28)); | |
if (IsExitItemSelected) | |
SelectedMenuItemColor(); | |
else | |
UnselectedMenuItemColor(); | |
Console.SetCursorPosition(padding + 2, height - border - 5); | |
Console.Write(" [Exit]".PadRight(28)); | |
} | |
static void SelectedMenuItem(int menuOption) | |
{ | |
if (menuOption == 1) | |
{ | |
IsStartGameItemSelected = true; | |
IsLoadGameItemSelected = false; | |
IsSettingsItemSelected = false; | |
IsAboutItemSelected = false; | |
IsExitItemSelected = false; | |
} | |
else if (menuOption == 2) | |
{ | |
IsStartGameItemSelected = false; | |
IsLoadGameItemSelected = true; | |
IsSettingsItemSelected = false; | |
IsAboutItemSelected = false; | |
IsExitItemSelected = false; | |
} | |
else if (menuOption == 3) | |
{ | |
IsStartGameItemSelected = false; | |
IsLoadGameItemSelected = false; | |
IsSettingsItemSelected = true; | |
IsAboutItemSelected = false; | |
IsExitItemSelected = false; | |
} | |
else if (menuOption == 4) | |
{ | |
IsStartGameItemSelected = false; | |
IsLoadGameItemSelected = false; | |
IsSettingsItemSelected = false; | |
IsAboutItemSelected = true; | |
IsExitItemSelected = false; | |
} | |
else if (menuOption == 5) | |
{ | |
IsStartGameItemSelected = false; | |
IsLoadGameItemSelected = false; | |
IsSettingsItemSelected = false; | |
IsAboutItemSelected = false; | |
IsExitItemSelected = true; | |
} | |
MenuItems(); | |
} | |
static void ClearSelectedItem() | |
{ | |
IsStartGameItemSelected = true; | |
IsLoadGameItemSelected = false; | |
IsSettingsItemSelected = false; | |
IsAboutItemSelected = false; | |
IsExitItemSelected = false; | |
} | |
static void ActivateMenuItem(int menuOption) | |
{ | |
if (menuOption == 1) | |
{ | |
ClearSelectedItem(); | |
StartGamePage(); | |
} | |
else if (menuOption == 2) | |
{ | |
ClearSelectedItem(); | |
LoadGamePage(); | |
} | |
else if (menuOption == 3) | |
{ | |
ClearSelectedItem(); | |
SettingsPage(); | |
} | |
else if (menuOption == 4) | |
{ | |
ClearSelectedItem(); | |
AboutPage(); | |
} | |
else if (menuOption == 5) | |
{ | |
ClearSelectedItem(); | |
EndScreen(); | |
} | |
} | |
static void DrawMenuAscii() | |
{ | |
Console.BackgroundColor = gray; | |
Console.ForegroundColor = red; | |
Console.SetCursorPosition(padding - 3, border + 1); | |
Console.Write("███╗ ███╗███████╗███╗ ██╗██╗ ██╗"); | |
Console.SetCursorPosition(padding - 3, border + 2); | |
Console.Write("████╗ ████║██╔════╝████╗ ██║██║ ██║"); | |
Console.SetCursorPosition(padding - 3, border + 3); | |
Console.Write("██╔████╔██║█████╗ ██╔██╗ ██║██║ ██║"); | |
Console.SetCursorPosition(padding - 3, border + 4); | |
Console.Write("██║╚██╔╝██║██╔══╝ ██║╚██╗██║██║ ██║"); | |
Console.SetCursorPosition(padding - 3, border + 5); | |
Console.Write("██║ ╚═╝ ██║███████╗██║ ╚████║╚██████╔╝"); | |
Console.SetCursorPosition(padding - 3, border + 6); | |
Console.Write("╚═╝ ╚═╝╚══════╝╚═╝ ╚═══╝ ╚═════╝ "); | |
} | |
#endregion | |
#region InfoBox | |
static void DrawInfoBox() | |
{ | |
string headerTop = " ╔══════════════════════════════════════════════════════════╗ "; | |
string headerFill = " ║ ║ "; | |
string headerBottom = " ╚══════════════════════════════════════════════════════════╝ "; | |
headerWidth = headerTop.Length; | |
padding = ((width - (headerWidth + (border * 2))) / 2) + border; | |
// Add Drop Shadow | |
Console.MoveBufferArea(padding + 1, border + 3, headerWidth, height - border - 3, padding + 1, height - border - 2, '▒', black, white); | |
Console.BackgroundColor = cyan; | |
Console.ForegroundColor = white; | |
Console.SetCursorPosition(padding, border + 2); | |
Console.Write(headerTop); | |
for (int i = 3; i < height - border - 6; i++) | |
{ | |
Console.SetCursorPosition(padding, border + i); | |
Console.Write(headerFill); | |
} | |
Console.SetCursorPosition(padding, height - border - 4); | |
Console.Write(headerBottom); | |
} | |
static void InfoBoxText() | |
{ | |
Console.BackgroundColor = cyan; | |
Console.ForegroundColor = white; | |
string headerText = " CODING 101 - Example Using E05 "; // Empty spaces before and after text to make it look better | |
int positionOfText = padding + (headerWidth / 2) - (headerText.Length / 2); | |
Console.SetCursorPosition(positionOfText, border + 2); | |
Console.Write(headerText); | |
Console.SetCursorPosition(padding + 4, border + 4); | |
Console.Write("This is an Example of a Menu System, you can use the"); | |
Console.SetCursorPosition(padding + 4, border + 5); | |
Console.Write("arrow keys on your keyboard to select an item on the"); | |
Console.SetCursorPosition(padding + 4, border + 6); | |
Console.Write("menu by pressing <ENTER>"); | |
Console.SetCursorPosition(padding + 4, border + 8); | |
Console.Write("In this stage of the Application, the Menu Options for"); | |
Console.SetCursorPosition(padding + 4, border + 9); | |
Console.Write("[Start Game], [Load Game], [Settings] are not available"); | |
Console.SetCursorPosition(padding + 4, border + 10); | |
Console.Write("and are here only to make the menu look more complete."); | |
Console.SetCursorPosition(padding + 4, border + 12); | |
Console.Write("In the future this code could be use as a basis for the"); | |
Console.SetCursorPosition(padding + 4, border + 13); | |
Console.Write("Menu of a more complete Application or a Game."); | |
Console.BackgroundColor = black; | |
Console.ForegroundColor = white; | |
Console.SetCursorPosition(headerWidth - 27, border + 16); | |
Console.Write("<Press ESC to Return to the Menu>"); | |
AnimateInfoBoxText(headerText, positionOfText); | |
} | |
static void AnimateInfoBoxText(string text, int position) | |
{ | |
Console.BackgroundColor = cyan; | |
Console.ForegroundColor = red; | |
ConsoleKeyInfo cki = new ConsoleKeyInfo(); | |
while (cki.Key != ConsoleKey.Escape) | |
{ | |
for (int i = 0; Console.KeyAvailable == false; i++) | |
{ | |
if (i >= text.Length) | |
i = 0; | |
Console.ForegroundColor = red; | |
Console.SetCursorPosition(position + i, border + 2); | |
Console.Write(text[i]); | |
System.Threading.Thread.Sleep(200); | |
Console.ForegroundColor = white; | |
Console.SetCursorPosition(position + i, border + 2); | |
Console.Write(text[i]); | |
} | |
cki = Console.ReadKey(true); | |
} | |
MainPage(); | |
} | |
#endregion | |
#region End Screen | |
static void EndScreen() | |
{ | |
Console.Title = "End of Example"; | |
Console.BackgroundColor = white; | |
Console.ForegroundColor = black; | |
Console.Clear(); | |
DrawBorder(); | |
DrawHeader(); | |
Console.BackgroundColor = red; | |
Console.ForegroundColor = white; | |
Console.SetCursorPosition(padding + 2, border + 2); | |
string over = " EXAMPLE IS NOW OVER "; | |
Console.MoveBufferArea(padding + 3, border + 1, headerWidth - (3 * 2), 1, padding + 3, border + 2, '▒', white, black); | |
Console.SetCursorPosition((headerWidth / 2) - (over.Length / 2) + padding, border + 2); | |
Console.Write(over); | |
AsciiArt(); | |
Console.ReadKey(); // Pause until a key is entered | |
} | |
static void DrawHeader() | |
{ | |
string headerTop = " ╔══════════════════════════════════════════════════════════╗ "; | |
string headerFill = " ║ ▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒ ║ "; | |
string headerBottom = " ╚══════════════════════════════════════════════════════════╝ "; | |
headerWidth = headerTop.Length; | |
headerHeight = 5; | |
padding = ((width - (headerWidth + (border * 2))) / 2) + border; | |
Console.BackgroundColor = black; | |
Console.ForegroundColor = white; | |
Console.SetCursorPosition(padding, border); | |
Console.Write(headerTop); | |
Console.SetCursorPosition(padding, border + 1); | |
Console.Write(headerFill); | |
Console.SetCursorPosition(padding, border + 2); | |
Console.Write(headerFill); | |
Console.SetCursorPosition(padding, border + 3); | |
Console.Write(headerFill); | |
Console.SetCursorPosition(padding, border + 4); | |
Console.Write(headerBottom); | |
} | |
static void AsciiArt() | |
{ | |
Console.BackgroundColor = white; | |
Console.ForegroundColor = green; | |
padding = ((width - (68 + (border * 2))) / 2) + border; | |
Console.SetCursorPosition(padding, border + headerHeight + 1); | |
Console.Write(" ██████╗ ██████╗ ██████╗ ██╗███╗ ██╗ ██████╗ ██╗ ██████╗ ██╗"); | |
Console.SetCursorPosition(padding, border + headerHeight + 2); | |
Console.Write("██╔════╝██╔═══██╗██╔══██╗██║████╗ ██║██╔════╝ ███║██╔═████╗███║"); | |
Console.SetCursorPosition(padding, border + headerHeight + 3); | |
Console.Write("██║ ██║ ██║██║ ██║██║██╔██╗ ██║██║ ███╗ ╚██║██║██╔██║╚██║"); | |
Console.SetCursorPosition(padding, border + headerHeight + 4); | |
Console.Write("██║ ██║ ██║██║ ██║██║██║╚██╗██║██║ ██║ ██║████╔╝██║ ██║"); | |
Console.SetCursorPosition(padding, border + headerHeight + 5); | |
Console.Write("╚██████╗╚██████╔╝██████╔╝██║██║ ╚████║╚██████╔╝ ██║╚██████╔╝ ██║"); | |
Console.SetCursorPosition(padding, border + headerHeight + 6); | |
Console.Write(" ╚═════╝ ╚═════╝ ╚═════╝ ╚═╝╚═╝ ╚═══╝ ╚═════╝ ╚═╝ ╚═════╝ ╚═╝"); | |
Console.ForegroundColor = black; | |
padding = ((width - (65 + (border * 2))) / 2) + border; | |
Console.SetCursorPosition(padding, border + headerHeight + 8); | |
Console.Write("╦ ╦┬┌┬┐┬ ┬ ╔═╗┬─┐ ╦═╗┌─┐┌┐ ┌─┐┬─┐┌┬┐ ╔╗ ┌─┐┬ ┬ ┌─┐┌─┐┌─┐┬─┐"); | |
Console.SetCursorPosition(padding, border + headerHeight + 9); | |
Console.Write("║║║│ │ ├─┤ ╠╣ ├┬┘ ╠╦╝│ │├┴┐├┤ ├┬┘ │ ╠╩╗├─┤│ │ ├┤ │ ├┤ ├┬┘"); | |
Console.SetCursorPosition(padding, border + headerHeight + 10); | |
Console.Write("╚╩╝┴ ┴ ┴ ┴ ╚ ┴└─o ╩╚═└─┘└─┘└─┘┴└─ ┴ ╚═╝┴ ┴┴─┘┴─┘└─┘└─┘└─┘┴└─"); | |
padding = ((width - (49 + (border * 2))) / 2) + border; | |
Console.SetCursorPosition(padding, border + headerHeight + 11); | |
Console.Write("┌─┐┌┐┌┌┬┐ ╔═╗┬ ┬┌─┐┌┐┌┌┐┌┌─┐┌┐┌ ╔╦╗┌─┐┬─┐┌─┐┌─┐"); | |
Console.SetCursorPosition(padding, border + headerHeight + 12); | |
Console.Write("├─┤│││ ││ ╚═╗├─┤├─┤│││││││ ││││ ║║║│ │├┬┘└─┐├┤ "); | |
Console.SetCursorPosition(padding, border + headerHeight + 13); | |
Console.Write("┴ ┴┘└┘─┴┘ ╚═╝┴ ┴┴ ┴┘└┘┘└┘└─┘┘└┘ ╩ ╩└─┘┴└─└─┘└─┘"); | |
Console.BackgroundColor = black; | |
Console.ForegroundColor = green; | |
padding = ((width - (61 + (border * 2))) / 2) + border; | |
Console.SetCursorPosition(padding, border + headerHeight + 15); | |
Console.Write(" /') _/_ ( /_ _ _ ' _ -- / /|/| _ _ _ _ _ _ "); | |
Console.SetCursorPosition(padding, border + headerHeight + 16); | |
Console.Write(" (__()(/(- |/|/(// / /()/ -- (__()(/ / |(// (-_) ( (/ "); | |
} | |
#endregion | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment