Small snake game in C
Commit 86b7b847c237
tarball1 file changed+122-48
@@ -32,6 +32,8 @@
3232
3333
typedef enum { NEW_GAME, SETTINGS, EXIT, MAIN_MENU } main_menu;3434
35
+typedef enum {HEIGHT_S, WIDTH_S, SPEED_S, BACK_S, SETTINGS_MENU} settings;36
+3537
typedef enum {3638
NO_DIRECTION = -1,3739
UP = 0,@@ -132,71 +134,139 @@ int main(int argc, char *args[]) {
132134
/* Menu */133135
134136
bool menu = true;137
+ bool setting = false;138
+ bool change_menu = true;135139
136140
main_menu selected_menu = NEW_GAME;137
-138
- too_small = draw_menu(selected_menu, init_size);141
+ settings selected_setting = HEIGHT_S;139142
140143
while (menu) {141144
142145
bool pressed_enter = false;143146
bool changed_selected = false;144147
145
- char string[1000] = {};146
- ssize_t length_string = read(STDIN_FILENO, string, sizeof(string) - 1);147
-148148
direction arrow = NO_DIRECTION;149149
150
+ char string[1000] = {};151
+ ssize_t length_string = read(STDIN_FILENO, string, sizeof(string) - 1);150152
151
- if (true) {152153
153
- ioctl(STDOUT_FILENO, TIOCGWINSZ, ¤t_size);154
+ ioctl(STDOUT_FILENO, TIOCGWINSZ, ¤t_size);154155
155
- if (current_size.ws_col != init_size.ws_col ||156
- current_size.ws_row != init_size.ws_row) {157
- init_size = current_size;158
- changed_selected = true;159
- }156
+ if (current_size.ws_col != init_size.ws_col ||157
+ current_size.ws_row != init_size.ws_row) {158
+ init_size = current_size;159
+ changed_selected = true;160160
}161161
162
- if (length_string > 0 && !too_small) {162
+163
+ if (length_string > 0) {163164
string[length_string] = '\0';164165
165166
arrow = read_direction(string, false);166167
168
+ if (string[0] == '\n')169
+ pressed_enter = true;170
+ 171
+ if (toupper(string[0]) == 'Q')172
+ goto end_of_program;173
+ }174
+175
+ if (!setting) {176
+ 177
+ if (!too_small) {178
+ switch (arrow) {179
+ case UP:180
+ selected_menu = (selected_menu + (MAIN_MENU - 1)) % MAIN_MENU;181
+ changed_selected = true;182
+ break;183
+ case DOWN:184
+ selected_menu = (selected_menu + 1) % MAIN_MENU;185
+ changed_selected = true;186
+ break;187
+ default:188
+ break;189
+ }190
+ }191
+192
+ if (changed_selected || change_menu) {193
+ too_small = draw_menu(selected_menu, init_size);194
+ change_menu = false;195
+ }196
+197
+ if (pressed_enter && !too_small) {198
+ switch (selected_menu) {199
+ case NEW_GAME:200
+ menu = false;201
+ break;202
+ case SETTINGS:203
+ setting = true;204
+ change_menu = true;205
+ break;206
+ default:207
+ goto end_of_program;208
+ break;209
+ }210
+ }211
+ } else {212
+213
+ char *setting_string[] = {214
+ "HEIGHT",215
+ "WIDTH",216
+ "SPEED",217
+ "BACK"218
+ };219
+220
+167221
switch (arrow) {168
- case UP:169
- selected_menu = (selected_menu + (MAIN_MENU - 1)) % MAIN_MENU;170
- changed_selected = true;171
- break;172
- case DOWN:173
- selected_menu = (selected_menu + 1) % MAIN_MENU;174
- changed_selected = true;175
- break;176
- default:177
- break;222
+ case UP:223
+ selected_setting = (selected_setting + (SETTINGS_MENU - 1)) % SETTINGS_MENU;224
+ changed_selected = true;225
+ break;226
+ case DOWN:227
+ selected_setting = (selected_setting + 1) % SETTINGS_MENU;228
+ changed_selected = true;229
+ break;230
+ default:231
+ break;178232
}179233
180
- if (toupper(string[0]) == 'Q')181
- goto end_of_program;234
+ if (changed_selected || change_menu) {235
+ 236
+ uint8_t i;182237
183
- if (string[0] == '\n')184
- pressed_enter = true;185
- }238
+ printf("\033[2J\033[H");239
+ 240
+ for (i = 0; i < SETTINGS_MENU; i++) {241
+ 242
+ if (i == selected_setting)243
+ printf("\033[32m");186244
187
- if (changed_selected)188
- too_small = draw_menu(selected_menu, init_size);245
+ printf("%s\033[0m", setting_string[i]);189246
190
- if (pressed_enter) {191
- switch (selected_menu) {192
- case NEW_GAME:193
- menu = false;194
- break;195
- default:196
- goto end_of_program;197
- break;247
+ if (i < SETTINGS_MENU - 1)248
+ printf("\n\n");249
+ }250
+ fflush(stdout);251
+252
+ change_menu = false;198253
}254
+255
+ 256
+ if (pressed_enter) {257
+ switch (selected_setting) {258
+ case BACK_S:259
+ setting = false;260
+ change_menu = true;261
+ break;262
+ default:263
+ break;264
+ }265
+ pressed_enter = false;266
+ }267
+199268
}269
+200270
nanosleep(&mili100, NULL);201271
}202272
@@ -243,26 +313,28 @@ int main(int argc, char *args[]) {
243313
244314
/* input handling */245315
246
- if (!too_small) {316
+ 247317
char string[1000] = {};248318
ssize_t length_string = read(STDIN_FILENO, string, sizeof(string) - 1);249319
250320
if (length_string > 0) {251321
string[length_string] = '\0';252322
253
- if (!paused)254
- tmp_direction = read_direction(string, true);323
+ if (!too_small) {324
+ if (toupper(string[0]) == 'P' || string[0] == '\n') {325
+ paused = !paused;326
+ if (paused)327
+ draw_board(board, current_size, true, paused);328
+ }329
+330
+ if (!paused)331
+ tmp_direction = read_direction(string, true);332
+ }255333
256334
if (toupper(string[0]) == 'Q')257335
run = false;258
-259
- if (toupper(string[0]) == 'P' || string[0] == '\n') {260
- paused = !paused;261
- if (paused)262
- draw_board(board, current_size, true, paused);263
- }264336
}265
- }337
+ 266338
267339
/* game logic */268340
@@ -327,6 +399,8 @@ end_of_program:
327399
tcsetattr(STDIN_FILENO, TCSANOW, &old);328400
printf("\033[?25h\n\n");329401
402
+403
+ printf("\033[32m");330404
return 0;331405
}