-
Notifications
You must be signed in to change notification settings - Fork 0
/
Menu.cs
155 lines (149 loc) · 5.34 KB
/
Menu.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
using Enlashceoc.Game;
namespace Enlashceoc
{
// Main game menu
internal class Menu
{
static void ActionNewGame()
{
_ = new NewGame();
}
static void ActionScoreboard()
{
_ = new Scoreboard();
}
static void ActionExit()
{
Environment.Exit(0);
}
static void MenuController()
{
Console.Clear(); //remove traces of previous UI,
//for example Scoreboard
List<string> menuActions = new List<string>
{
//new game
"\t\t\t\t\t\t " +
"> NEW GAME\n\n" +
"\t\t\t\t\t\t " +
"SCOREBOARD\n\n" +
"\t\t\t\t\t\t " +
"EXIT\n\n",
//scoreboard
"\t\t\t\t\t\t " +
"NEW GAME\n\n" +
"\t\t\t\t\t\t " +
"> SCOREBOARD\n\n" +
"\t\t\t\t\t\t " +
"EXIT\n\n",
//exit
"\t\t\t\t\t\t " +
"NEW GAME\n\n" +
"\t\t\t\t\t\t " +
"SCOREBOARD\n\n" +
"\t\t\t\t\t\t " +
"> EXIT\n\n"
//could also use search && replace
//but not in this project
};
byte selection = 0;
bool loopComplete = false;
while (true)
{
//cycle between menu options
//each iteration has KeyPress check event:
//if ArrowDown or ArrowUp key pressed:
//cycle between menu activities
//if Spacebar key pressed:
//switch to selected activity, break the loop
//else:
//continue the loop, clear console
//from previous output (menu)
GenerateMenuUI(menuActions[selection]);
//default option: new game
var consoleKey = Console.ReadKey(true).Key;
switch (consoleKey)
{
case ConsoleKey.Spacebar:
loopComplete = true;
break;
case ConsoleKey.UpArrow:
if (selection - 1 < 0)
//using '--' or
//'++' will result in
//'array index out
//of bounds' exception
//(in both cases: prefix and postfix!)
selection = 2;
else
selection--;
break;
case ConsoleKey.DownArrow:
if (selection + 1 > 2)
selection = 0;
else
selection++;
break;
default:
break;
}
if (loopComplete)
{
switch (selection)
{
case 0:
ActionNewGame();
break;
case 1:
ActionScoreboard();
break;
case 2:
ActionExit();
break;
}
break; //quit loop
}
else
Console.Clear();
}
}
static private void GenerateMenuUI(string menuActions)
{
string borderLine =
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" +
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@" +
"@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@";
string gameTitle =
borderLine +
"\n" +
"\t\t\t\t ______ _ _\n" +
"\t\t\t\t | ____| | | | |\n" +
"\t\t\t\t | |__ _ __ | | __ _ ___| |__ ___ ___ ___ ___\n" +
"\t\t\t\t | __| | '_ \\| |/ _` / __| '_ \\ / __/ _ \\/ _ \\ / __|\n" +
"\t\t\t\t | |____| | | | | (_| \\__ \\ | | | (_| __/ (_) | (__\n" +
"\t\t\t\t |______|_| |_|_|\\__,_|___/_| |_|\\___\\___|\\___/ \\___|\n\n" +
borderLine +
"\n\n\n";
//-----------------------------------------------//
Console.Write($"{gameTitle}\n" +
$"{menuActions}\n" +
$"\n\n\n\n\n\n\n" +
$"version: 1.0 - " +
$"https://github.com/HardcoreMagazine/Enlashceoc\n" +
$"{borderLine.Remove(119)}");
//'Remove(119)' explanation:
//default window size is 120 characters;
//on Windows systems last line character
//is always "_" (user input)
//if we use default 120-char line
//"_" symbol will be placed on
//next (new) line, which will
//result in partial UI loss
}
// Self-initialization
public Menu()
{
MenuController();
}
}
}