From 8f406d927257e6c917188933ce12b31f897ed758 Mon Sep 17 00:00:00 2001 From: Jeroen Boxhoorn Date: Tue, 14 Oct 2025 13:58:22 +0200 Subject: [PATCH] wip menu --- deel2.tar.gz | Bin 0 -> 6846 bytes rooster.c | 60 ++++++-- rooster.h | 11 +- spel | Bin 100272 -> 113000 bytes spel.c | 381 ++++++++++++++++++++++++++++++++++++--------------- 5 files changed, 322 insertions(+), 130 deletions(-) create mode 100644 deel2.tar.gz diff --git a/deel2.tar.gz b/deel2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..5d2967417b1a3d41772e643697210181bd98bfc5 GIT binary patch literal 6846 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 literal 0 HcmV?d00001 diff --git a/rooster.c b/rooster.c index 0b25756..b312092 100644 --- a/rooster.c +++ b/rooster.c @@ -5,6 +5,8 @@ #include +// TODO: End the eternal NULL checks. + /* * The rooster type this program is build around. */ @@ -16,7 +18,40 @@ typedef struct rooster_data { } rooster; -rooster *rooster_maak(char* input); +rooster *rooster_maak(const char* input) { + int width = 0; + int height = 0; + const size_t len = strlen(input) / sizeof(char); + if (input == NULL || len == 0) { + perror("rooster_maak"); + exit(1); + } + + for (int i = 0; input[i] != '\n'; i++) { + width++; + } + + height = (int)len / (width + 1); + + for (int i = 0; i < height; i = i + width + 1) { + if ((int)strcspn(&input[i], "\n") != width) { + perror("rooster_maak"); + exit(1); + }; + } + + const int grid_size = (width + 1) * height + 1; + + rooster *rp = malloc(sizeof(rooster)); + rp->rost = malloc(grid_size * sizeof(char)); + rp->height = height; + rp->width = width; + rp->state = STATE_BEGIN; + + strcpy(rp->rost, input); + + return rp; +} /* * Sets a grids width and height @@ -71,7 +106,7 @@ rooster *rooster_lees(FILE *fh) { NULL, 0, 0, - BEGIN + STATE_BEGIN }; // Sets the width and height of the rooster. @@ -129,23 +164,26 @@ toestand rooster_vraag_toestand(const rooster *rp) { if (rp != NULL) { return rp->state; } - return VERLOREN; + return STATE_VERLOREN; } void rooster_zet_toestand(rooster *rp, toestand t) { if (rp != NULL) { switch (t) { - case BEGIN: - rp->state = BEGIN; + case STATE_BEGIN: + rp->state = STATE_BEGIN; break; - case AAN_HET_SPELEN: - rp->state = AAN_HET_SPELEN; + case STATE_AAN_HET_SPELEN: + rp->state = STATE_AAN_HET_SPELEN; break; - case GEWONNEN: - rp->state = GEWONNEN; + case STATE_GEWONNEN: + rp->state = STATE_GEWONNEN; break; - case VERLOREN: - rp->state = VERLOREN; + case STATE_VERLOREN: + rp->state = STATE_VERLOREN; + break; + case STATE_QUIT: + rp->state = STATE_QUIT; break; } } diff --git a/rooster.h b/rooster.h index 7933fd1..229dc87 100644 --- a/rooster.h +++ b/rooster.h @@ -18,10 +18,11 @@ struct rooster_data; typedef struct rooster_data rooster; typedef enum { - BEGIN, - AAN_HET_SPELEN, - GEWONNEN, - VERLOREN + STATE_BEGIN, + STATE_AAN_HET_SPELEN, + STATE_GEWONNEN, + STATE_VERLOREN, + STATE_QUIT } toestand; /* Maak een rooster op basis van de data in de gegeven stream. @@ -53,7 +54,7 @@ rooster *rooster_lees(FILE *fh); * NULL teruggegeven. (In dat geval blijft geen gereserveerd geheugen * achter.) */ -rooster *rooster_maak(char* input); +rooster *rooster_maak(const char* input); /* * Haal een rij uit het rooster op. diff --git a/spel b/spel index b1fb5bc3ca0ba37bddd011caef187e9ccbd240f3..ce67212dc608062594e4e32c1daf8fdcc9af3b82 100755 GIT binary patch delta 37122 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 delta 29396 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 q&*>=Ry&6di5I<5N<26Rx5XrcY`2Roq1D5;% diff --git a/spel.c b/spel.c index 3b58c1f..c8116ff 100644 --- a/spel.c +++ b/spel.c @@ -21,15 +21,24 @@ */ #include +#include #include #include #include #include #include +#include #include "rooster.h" +typedef enum { + GAME_QUIT, + GAME_MAZE_RUNNER, + GAME_SNAKE, + GAME_MINESWEEPER +} game; + typedef struct { char name[100]; rooster *game_map; @@ -66,6 +75,115 @@ void update_grid(rooster *rp, char c, int x, int y) { } } +void game_error(void) { + endwin(); + exit(EXIT_FAILURE); +} + +void quit_game(rooster *menu) { + if (menu != NULL) { + rooster_klaar(menu); + } + endwin(); + exit(EXIT_SUCCESS); +} + +/* + * Toont het victory screen. + * + * Side Effect: + * De victory message wordt op een schone console geprint. + */ +void display_victory(void) { + clear(); + mvprintw(2,5, "YOU WON!!!!!"); + refresh(); +} + +/* + * Toont het loss screen. + * + * Side Effect: + * De loss message wordt op een schone console geprint. + */ +void display_loss(void) { + clear(); + mvprintw(2,5, "RIP, YOU DIED..."); + refresh(); +} + +/* + * Toont het quit screen. + * + * Side Effect: + * De quit message wordt op een schone console geprint. + */ +void display_quit(void) { + clear(); + mvprintw(2,5, "You quit the game"); + refresh(); +} + +/* + * Toont het hackerman screen. + * + * Side Effect: + * De hackerman message wordt op een schone console geprint. + */ +void display_hackerman(void) { + clear(); + mvprintw(2,5, "The hacker man strikes again..."); + refresh(); +} + +/* + * Bepaalt afhankelijk van de eindtoestand van het rooster + * welk afsluitscherm er getoond moet worden en toont dan dat rooster. + * + * Input: Het rooster om de toestand uit af te lezen. + * + * Side Effects: + * Het end-of-game scherm wordt op een blanke console geprint. + */ +void game_exit_screen(rooster *rp) { + toestand current_state = rooster_vraag_toestand(rp); + switch (current_state) { + case STATE_GEWONNEN: + display_victory(); + return; + case STATE_VERLOREN: + display_loss(); + return; + case GAME_QUIT: + display_quit(); + return; + } + display_hackerman(); +} + +/* + * Waits for the user to press an exit key 'q' before continuing. + */ +void graceful_exit(void) { + mvprintw(5, 0, "Press 'q' to exit the game."); + while (1) { + switch (getch()) { + case 'q': + return; + } + } +} + +void speel_snake(void) { + mvprintw(0,0, "Snake has not yet been created"); + graceful_exit(); +} + +void speel_minesweeper() { + mvprintw(0,0, "Minesweeper has not yet been created"); + graceful_exit(); +} + /* Voert de benodigde veranderingen in het rooster door als de speler in een * bepaalde richting probeert te bewegen. * Input: @@ -77,7 +195,7 @@ void update_grid(rooster *rp, char c, int x, int y) { * Side effect: het rooster wordt aangepast op basis van de handeling van * de speler. */ -void beweeg(rooster *rp, int dx, int dy) { +void maze_runner_beweeg(rooster *rp, int dx, int dy) { int playerx; int playery; rooster_zoek(rp, '*', &playerx, &playery); @@ -94,7 +212,7 @@ void beweeg(rooster *rp, int dx, int dy) { break; case 'X': update_grid(rp, ' ', playerx, playery); - rooster_zet_toestand(rp, VERLOREN); + rooster_zet_toestand(rp, STATE_VERLOREN); break; case ' ': update_grid(rp, ' ', playerx, playery); @@ -102,7 +220,7 @@ void beweeg(rooster *rp, int dx, int dy) { break; case '$': update_grid(rp, ' ', playerx, playery); - rooster_zet_toestand(rp, GEWONNEN); + rooster_zet_toestand(rp, STATE_GEWONNEN); break; } refresh(); @@ -117,133 +235,44 @@ void beweeg(rooster *rp, int dx, int dy) { * * Side Effects: * Met WSAD en arrow keys kun je door het doolhof heen bewegen. + * */ -void run_maze(rooster *rp) { - while (rooster_vraag_toestand(rp) == AAN_HET_SPELEN) +void maze_runner(rooster *rp) { + while (rooster_vraag_toestand(rp) == STATE_AAN_HET_SPELEN) { switch (getch()) { case KEY_UP: // fallthrough case 'w': - beweeg(rp, 0, -1); + maze_runner_beweeg(rp, 0, -1); break; case KEY_DOWN: // fallthrough case 's': - beweeg(rp, 0, 1); + maze_runner_beweeg(rp, 0, 1); break; case KEY_LEFT: // fallthrough case 'a': - beweeg(rp, -1, 0); + maze_runner_beweeg(rp, -1, 0); break; case KEY_RIGHT: // fallthrough case 'd': - beweeg(rp, 1, 0); + maze_runner_beweeg(rp, 1, 0); break; - case KEY_EXIT: - rooster_zet_toestand(rp, VERLOREN); + case KEY_BACKSPACE: + rooster_zet_toestand(rp, STATE_QUIT); break; } } } -/* - * Toont het maze victory screen. - * - * Side Effect: - * De victory message wordt op een schone console geprint. - */ -void display_maze_victory() { - clear(); - mvprintw(2,5, "YOU WON!!!!!"); - refresh(); -} +rooster *choose_maze(void) { + // TODO: echt opties aanbieden in plaats van hardcoded 1 maze. + // Alternatief is om random een maze te genereren. dit is miss beter. -/* - * Toont het maze loss screen. - * - * Side Effect: - * De loss message wordt op een schone console geprint. - */ -void display_maze_loss() { - clear(); - mvprintw(2,5, "RIP, YOU DIED..."); - refresh(); -} - -/* - * Toont het maze broken screen. - * - * Side Effect: - * De hackerman message wordt op een schone console geprint. - */ -void display_hackerman() { - clear(); - mvprintw(2,5, "The hacker man strikes again..."); - refresh(); -} - -/* - * Bepaalt afhankelijk van de eindtoestand van het rooster - * welk afsluitscherm er getoond moet worden en toont dan dat rooster. - * - * Input: Het rooster om de toestand uit af te lezen. - * - * Side Effects: - * Het end-of-game scherm wordt op een blanke console geprint. - */ -void maze_exit_screen(rooster *rp) { - toestand current_state = rooster_vraag_toestand(rp); - switch (current_state) { - case GEWONNEN: - display_maze_victory(); - return; - case VERLOREN: - display_maze_loss(); - return; - } - display_hackerman(); -} - -/* - * Waits for the user to press an exit key 'q' before continuing. - */ -void graceful_exit() { - mvprintw(5, 0, "Press 'q' to exit the game."); - while (1) { - switch (getch()) { - case 'q': - return; - } - } -} - -void toon_menu(rooster *rp) { - toon_rooster(rp); - rooster_zet_toestand(rp, AAN_HET_SPELEN); - run_maze(rp); - maze_exit_screen(rp); - graceful_exit(); -} - -/* - * Speelt het spel met een gegeven rooster tot de toestand niet langer - * AAN_HET_SPELEN is. - */ -void speel(rooster *rp) { - toon_menu(rp); -} - -int main(int argc, char *argv[]) { - // 1. Controleer dat er een doolhofbestand is opgegeven op de command line. - if (argc != 2) { - fprintf(stderr, "gebruik: ./spel assets/voorbeeld_doolhof.txt\n"); - return 1; - } - - // 2. Open het doolhofbestand en lees het rooster. - FILE *fh = fopen(argv[1], "r"); + // 2. Open het doolhof bestand en lees het rooster. + FILE *fh = fopen("assets/voorbeeld_doolhof.txt", "r"); if (fh == NULL) { - perror("main"); - return 1; + perror("loading maze"); + game_error(); } rooster *rp = rooster_lees(fh); fclose(fh); @@ -251,23 +280,147 @@ int main(int argc, char *argv[]) { // 3. Bepaal of het lezen van het rooster is gelukt. if (rp == NULL) { fprintf(stderr, "Kan rooster niet maken.\n"); - return 1; + game_error(); } + return rp; +} + +/* + * Speelt het spel met een gegeven rooster tot de toestand niet langer + * AAN_HET_SPELEN is. + */ +void speel_maze(void) { + // Voorbereiding. + rooster *rp = choose_maze(); + toon_rooster(rp); + rooster_zet_toestand(rp, STATE_AAN_HET_SPELEN); + + // Game zelf. + maze_runner(rp); + + // Exit game. + game_exit_screen(rp); + rooster_klaar(rp); + graceful_exit(); +} + +void launch_game(rooster *menu, const game game) { + switch (game) { + case GAME_MAZE_RUNNER: + speel_maze(); + return; + case GAME_SNAKE: + speel_snake(); + return; + case GAME_MINESWEEPER: + speel_minesweeper(); + return; + case GAME_QUIT: + quit_game(menu); + } +} + +void menu_highlight(rooster *rp, const game target, const int offset_x, const int offset_y) { + switch (target) { + case GAME_MAZE_RUNNER: // Fallthrough + case GAME_SNAKE: // Fallthrough + case GAME_MINESWEEPER: // Fallthrough + case GAME_QUIT: // Fallthrough + // TODO: Properly highlight this shit. + mvprintw(offset_y + (int)target, offset_x, rooster_vraag_rij(rp, target)); + } +} + +game menu_try_move(const game selected_game, const int offset) { + switch (selected_game + offset) { + case GAME_MAZE_RUNNER: + return GAME_MAZE_RUNNER; + case GAME_SNAKE: + return GAME_SNAKE; + case GAME_MINESWEEPER: + return GAME_MINESWEEPER; + case GAME_QUIT: + return GAME_QUIT; + } + return selected_game; +} + +void navigate_menu(rooster *menu, const game default_game, const int offset_x, const int offset_y) { + game selected_game = default_game; + while (true) { + switch (getch()) { + case KEY_UP: // fallthrough + case 'w': + selected_game = menu_try_move(selected_game, -1); + menu_highlight(menu, selected_game, offset_x, offset_y); + break; + case KEY_DOWN: // fallthrough + case 's': + selected_game = menu_try_move(selected_game, 1); + menu_highlight(menu, selected_game, offset_x, offset_y); + break; + case KEY_ENTER: + // select current game somehow + launch_game(menu, GAME_QUIT); + menu_highlight(menu, selected_game, offset_x, offset_y); + break; + case KEY_BACKSPACE: + launch_game(menu, GAME_QUIT); + break; + } + } +} + +rooster *laad_menu(void) { + char menu[] = "Maze Runner\n" + " Snake \n" + "Minesweeper\n" + " Leave \n"; + rooster *rp = rooster_maak(menu); + return rp; +} + +void toon_menu(rooster *menu, const game default_game, const int offset_x, const int offset_y) { + toon_rooster_op_locatie(menu, offset_x, offset_y); + menu_highlight(menu, default_game, offset_x, offset_y); + refresh(); +} + +void menu(void) { + rooster *menu = laad_menu(); + const game default_game = GAME_MAZE_RUNNER; + + while (true) { + clear(); + const int offset_x = 5; + const int offset_y = 5; + toon_menu(menu, default_game, offset_x, offset_y); + navigate_menu(menu, default_game, offset_x, offset_y); + } +} + +void startup_sequence(void) { + // TODO: Nice entry screen +} + +int main(void) { // 4. Initialiseer ncurses setlocale(LC_ALL, ""); initscr(); cbreak(); // zodat je kunt onderbreken met Ctrl+C keypad(stdscr, TRUE); // luister ook naar extra toetsen zoals pijltjes noecho(); // druk niet de letters af die je intypt - curs_set(0); // hides the cursor + curs_set(0); // hides the cursor// Don't mask any mouse events + + // mousemask(ALL_MOUSE_EVENTS | REPORT_MOUSE_POSITION, NULL); // Don't mask any mouse events + // printf("\033[?1003h\n"); // Makes the terminal report mouse movement events // 5. Speel het spel. - speel(rp); + startup_sequence(); + menu(); // 6. Sluit af. - rooster_klaar(rp); - endwin(); - return 0; + quit_game(NULL); }