From cfd4ccad64c4530972b4045e98b58030886f0693 Mon Sep 17 00:00:00 2001 From: Jeroen Boxhoorn Date: Thu, 16 Oct 2025 01:10:09 +0200 Subject: [PATCH] Got the minigame menu up, running and documented. Also split up the game file --- assets/{voorbeeld_doolhof.txt => maze.txt} | 0 grid_game_engine.c | 153 +++++++ grid_game_engine.h | 103 +++++ maze_runner.c | 128 ++++++ maze_runner.h | 39 ++ minesweeper.c | 16 + minesweeper.h | 30 ++ minigame_menu.c | 173 ++++++++ minigame_menu.h | 35 ++ rooster.c | 33 +- rooster.h | 12 - snake.c | 16 + snake.h | 26 ++ spel | Bin 113232 -> 119704 bytes spel.c | 452 +-------------------- 15 files changed, 737 insertions(+), 479 deletions(-) rename assets/{voorbeeld_doolhof.txt => maze.txt} (100%) create mode 100644 grid_game_engine.c create mode 100644 grid_game_engine.h create mode 100644 maze_runner.c create mode 100644 maze_runner.h create mode 100644 minesweeper.c create mode 100644 minesweeper.h create mode 100644 minigame_menu.c create mode 100644 minigame_menu.h create mode 100644 snake.c create mode 100644 snake.h diff --git a/assets/voorbeeld_doolhof.txt b/assets/maze.txt similarity index 100% rename from assets/voorbeeld_doolhof.txt rename to assets/maze.txt diff --git a/grid_game_engine.c b/grid_game_engine.c new file mode 100644 index 0000000..d524226 --- /dev/null +++ b/grid_game_engine.c @@ -0,0 +1,153 @@ +/* + * Created by snapshot112 on 10/15/25. + * + * A game engine that can run and display games in square grids. + */ + +#include "grid_game_engine.h" + +#include +#include +#include + +#include "rooster.h" + +int modulo(const int number, const int mod) { + int result = number % mod; + if (result < 0) { + result += mod; //This is not how math is supposed to work C, damnit. + } + return result; +} + +void show_grid_on_offset(const rooster *gp, const int starting_x, const int starting_y) { + const int height = rooster_hoogte(gp); + + for (int y = 0; y < height; y++) { + char *rij = rooster_vraag_rij(gp, y); + mvprintw(starting_y + y, starting_x, "%s", rij); + free(rij); + } + refresh(); +} + +void show_grid(const rooster *rp) { + show_grid_on_offset(rp, 0, 0); +} + +void update_grid(rooster *rp, char c, int x, int y) { + if (rooster_plaats(rp, x, y, c) == 1) { + mvaddch(y, x, c); + } +} + +/* + * Shows the victory screen. + * + * Side Effect: + * Clears the console and prints the victory message. + */ +static void display_victory(void) { + clear(); + mvprintw(2,5, "YOU WON!!!!!"); + refresh(); +} + +/* + * Shows the GAME OVER screen. + * + * Side Effect: + * Clears the console and prints the GAME OVER message. + */ +static void display_loss(void) { + clear(); + mvprintw(2,5, "GAME OVER"); + refresh(); +} + +/* + * Shows the quit screen + * + * Side Effect: + * Clears the console and prints the quit message. + */ +static void display_quit(void) { + clear(); + mvprintw(2,5, "You quit the game"); + refresh(); +} + +/* + * Shows the hacker man screen + * + * Side Effect: + * Clears the console and prints the hacker man message. + */ +static void display_hackerman(void) { + clear(); + mvprintw(2,5, "The hacker man strikes again..."); + refresh(); +} + +void graceful_exit(void) { + mvprintw(5, 5, "Press 'q' to exit."); + while (1) { + switch (getch()) { + case 'q': + case 'Q': + return; + } + } +} + +void game_exit_screen(rooster *gp) { + toestand current_state = rooster_vraag_toestand(gp); + switch (current_state) { + case STATE_GEWONNEN: + display_victory(); + break; + case STATE_VERLOREN: + display_loss(); + break; + case STATE_QUIT: + display_quit(); + break; + default: + display_hackerman(); + } + graceful_exit(); +} + +static void init_ncurses() { + setlocale(LC_ALL, ""); + initscr(); + cbreak(); // So you can cancel the game with ctrl + c. + keypad(stdscr, TRUE); // Enable extra keys like the arrow keys. + noecho(); // Don't write the keyboard input to the console. + curs_set(0); // Hides the cursor. + + // 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 + + start_color(); + init_pair(BLACK, COLOR_BLACK, COLOR_BLACK); + init_pair(WHITE, COLOR_BLACK, COLOR_WHITE); + init_pair(BLUE, COLOR_BLACK, COLOR_BLUE); + init_pair(GREEN, COLOR_BLACK, COLOR_GREEN); + init_pair(CYAN, COLOR_BLACK, COLOR_CYAN); + init_pair(MAGENTA, COLOR_BLACK, COLOR_MAGENTA); + init_pair(YELLOW, COLOR_BLACK, COLOR_YELLOW); + init_pair(RED, COLOR_BLACK, COLOR_RED); +} + +static void cleanup_ncurses() { + endwin(); +} + +void init_engine(void) { + init_ncurses(); +} + +void cleanup_engine(void) { + cleanup_ncurses(); +} diff --git a/grid_game_engine.h b/grid_game_engine.h new file mode 100644 index 0000000..030a241 --- /dev/null +++ b/grid_game_engine.h @@ -0,0 +1,103 @@ +/* + * Created by snapshot112 on 10/15/25. + * + * A game engine that uses the can run and display games in rectangular grids. + * The graphics are made using ncursesw. + * + * Please make sure to initialize the game engine before running any games. + */ + +#ifndef MINIGAME_MENU_GRID_GAME_ENGINE_H +#define MINIGAME_MENU_GRID_GAME_ENGINE_H +#include "rooster.h" + +typedef enum { + BLACK = 1, + WHITE = 2, + BLUE = 3, + GREEN = 4, + CYAN = 5, + MAGENTA = 6, + YELLOW = 7, + RED = 8 +} game_colors; + +typedef struct { + char name[100]; + rooster *game_map; +} game_maps; + +/* + * A proper modulo function. + * The one provided by c: '%' doesn't work according to the mathematical definition. + */ +int modulo(int number, int mod); + +/* + * Displays the given grid with the given offset using ncurses. + * + * Input: + * gp: A pointer to the grid. + * + * Side effect: + * The console is cleared and the grid is printed. + */ +void show_grid_on_offset(const rooster *gp, int starting_x, int starting_y); + +/* + * Displays the given grid with ncurses. + * + * Input: + * gp: A pointer to the grid. + * + * Side effect: + * The console is cleared and the grid is printed. + */ +void show_grid(const rooster *gp); + +/* + * Updates a single location in the grid. + * + * Input: + * gp: A pointer to the grid. + * c: The character to update the location with. + * x: The x-coordinate of the spot you want to update. + * y: The y-coordinate of the spot you want to update. + * + * Side effect: + * The update gets applied both on the grid and on the screen. + */ +void update_grid(rooster *gp, char c, int x, int y); + +/* + * Display the ending screen that matches the end state of the grid. + * + * Input: + * gp: A pointer to the grid. + * + * Side Effects: + * The end of game screen gets displayed with a graceful exit. + */ +void game_exit_screen(rooster *gp); + +/* + * Waits for you to press 'q' before exiting the game. + * + * Side effect: Prints "Press 'q' to exit." game to the console. + */ +void graceful_exit(void); + +/* + * Initialize ncurses. + * + * This enables cbreak, noecho, hides the cursor and enables the extra keys. + * This also creates the color pairs needed for game_colors, + */ +void init_engine(void); + +/* + * Cleanup ncurses. + */ +void cleanup_engine(void); + +#endif //MINIGAME_MENU_GRID_GAME_ENGINE_H diff --git a/maze_runner.c b/maze_runner.c new file mode 100644 index 0000000..6727a87 --- /dev/null +++ b/maze_runner.c @@ -0,0 +1,128 @@ +// +// Created by snapshot112 on 10/15/25. +// + +#include "maze_runner.h" + +#include +#include + +#include "grid_game_engine.h" +#include "rooster.h" + +/* + * Reads in the maze from the assets file. + */ +static rooster *get_maze(void) { + // TODO: echt opties aanbieden in plaats van hardcoded 1 maze. + // Alternatief is om random een maze te genereren. dit is miss beter. + + // 2. Open het doolhof bestand en lees het rooster. + FILE *fh = fopen("assets/maze.txt", "r"); + if (fh == NULL) { + perror("loading maze"); + exit(EXIT_FAILURE); + } + rooster *rp = rooster_lees(fh); + fclose(fh); + + // 3. Bepaal of het lezen van het rooster is gelukt. + if (rp == NULL) { + fprintf(stderr, "Kan rooster niet maken.\n"); + exit(EXIT_FAILURE); + } + + return rp; +} + +/* Voert de benodigde veranderingen in het rooster door als de speler in een + * bepaalde richting probeert te bewegen. + * Input: + * rp : een pointer naar het rooster + * dx,dy: de richting waarin de speler probeert te bewegen. De vier mogelijk- + * heden voor (dx,dy) zijn (-1,0), (1,0), (0,-1), (0,1) voor resp. + * links, rechts, omhoog en omlaag. + * + * Side effect: het rooster wordt aangepast op basis van de handeling van + * de speler. + */ +static void maze_runner_beweeg(rooster *rp, int dx, int dy) { + int playerx; + int playery; + rooster_zoek(rp, '*', &playerx, &playery); + + if (playerx == -1 || playery == -1) { + printf("Player not found!"); + exit(1); + } + + if (rooster_bevat(rp, playerx + dx, playery + dy) == 1) { + char new_location = rooster_kijk(rp, playerx + dx, playery + dy); + switch (new_location) { + case '#': + break; + case 'X': + update_grid(rp, ' ', playerx, playery); + rooster_zet_toestand(rp, STATE_VERLOREN); + break; + case ' ': + update_grid(rp, ' ', playerx, playery); + update_grid(rp, '*', playerx + dx, playery + dy); + break; + case '$': + update_grid(rp, ' ', playerx, playery); + rooster_zet_toestand(rp, STATE_GEWONNEN); + break; + } + refresh(); + } +} + +/* + * Speelt het spel met een gegeven rooster tot de toestand niet langer + * AAN_HET_SPELEN is. + */ +static void speel_maze(rooster *rp) { + while (rooster_vraag_toestand(rp) == STATE_AAN_HET_SPELEN) + { + switch (getch()) { + case KEY_UP: // fallthrough + case 'w': + case 'W': + maze_runner_beweeg(rp, 0, -1); + break; + case KEY_DOWN: // fallthrough + case 's': + case 'S': + maze_runner_beweeg(rp, 0, 1); + break; + case KEY_LEFT: // fallthrough + case 'a': + case 'A': + maze_runner_beweeg(rp, -1, 0); + break; + case KEY_RIGHT: // fallthrough + case 'd': + case 'D': + maze_runner_beweeg(rp, 1, 0); + break; + case KEY_BACKSPACE: + rooster_zet_toestand(rp, STATE_QUIT); + break; + } + } +} + +void maze_runner(void) { + // Voorbereiding. + rooster *rp = get_maze(); + show_grid(rp); + rooster_zet_toestand(rp, STATE_AAN_HET_SPELEN); + + // Game zelf. + speel_maze(rp); + + // Exit game. + game_exit_screen(rp); + rooster_klaar(rp); +} diff --git a/maze_runner.h b/maze_runner.h new file mode 100644 index 0000000..ddfbff7 --- /dev/null +++ b/maze_runner.h @@ -0,0 +1,39 @@ +/* + * Naam: Jeroen Boxhoorn + * UvAnetID: 16333969 + * Studie: BSc Informatica + * + * A game of maze runner configured to run on the grid game engine. + * + * Please make sure to include and initialize the game engine before calling maze_runner(); + * + * How to play the game: + * - You are the '*' character. + * - Use either WSAD or the arrow keys to navigate through the maze. + * - The exit of the maze is marked with a '$'. + * - Walls are '#'. + * - Traps are 'X'. These kill you. + * + * You can quit the program at any time by pressing CTRL + C. + * + * Have fun playing! + */ + +#ifndef MINIGAME_MENU_MAZE_RUNNER_H +#define MINIGAME_MENU_MAZE_RUNNER_H + +/* + * A game of maze runner configured to run on the grid game engine. + * + * Please make sure to include and initialize the game engine before calling maze_runner(); + * + * Side Effects: + * Clears the console and uses it to play a game of maze runner. + * + * Controls: + * use WSAD or arrow keys to move through the maze. + * Use BACKSPACE to exit the game early. + */ +void maze_runner(void); + +#endif //MINIGAME_MENU_MAZE_RUNNER_H diff --git a/minesweeper.c b/minesweeper.c new file mode 100644 index 0000000..60274ea --- /dev/null +++ b/minesweeper.c @@ -0,0 +1,16 @@ +// +// Created by snapshot112 on 10/15/25. +// + +#include "minesweeper.h" + +#include + +#include "grid_game_engine.h" + +void minesweeper() { + clear(); + mvprintw(0,0, "Minesweeper has not yet been created"); + graceful_exit(); + refresh(); +} diff --git a/minesweeper.h b/minesweeper.h new file mode 100644 index 0000000..6463556 --- /dev/null +++ b/minesweeper.h @@ -0,0 +1,30 @@ +/* + * Created by snapshot112 on 10/15/25. + * + * A game of minesweeper runner configured to run on the grid game engine. + * + * Please make sure to include and initialize the game engine before calling snake(); + */ + +#ifndef MINIGAME_MENU_MINESWEEPER_H +#define MINIGAME_MENU_MINESWEEPER_H + +/* + * A game of minesweeper configured to run on the grid game engine. + * + * Please make sure to include and initialize the game engine before calling snake(); + * + * Side Effects: + * Clears the console and uses it to play a game of minesweeper. + * + * Instructions: + * use WSAD or arrow keys to select a grid square. + * use SPACEBAR to open the current square. + * use 'f' to mark/unmark a square. + * use BACKSPACE to exit the game early. + * + * marked squares can't be opened. + */ +void minesweeper(void); + +#endif //MINIGAME_MENU_MINESWEEPER_H diff --git a/minigame_menu.c b/minigame_menu.c new file mode 100644 index 0000000..aaa1489 --- /dev/null +++ b/minigame_menu.c @@ -0,0 +1,173 @@ +// +// Created by snapshot112 on 10/15/25. +// + +#include "minigame_menu.h" + +#include +#include + +#include "grid_game_engine.h" +#include "maze_runner.h" +#include "minesweeper.h" +#include "rooster.h" +#include "snake.h" + +#define AMOUNT_OF_MENU_OPTIONS 4 + +static game SELECTED_GAME = GAME_MAZE_RUNNER; +static int OFFSET_Y = 5; +static int OFFSET_X = 5; + +/* + * Launch a game from the menu. + * + * Input: + * menu: A pointer to the menu grid. + * game: The game you want to launch. + */ +static void launch_game(rooster *menu, const game game) { + switch (game) { + case GAME_MAZE_RUNNER: + maze_runner(); + break; + case GAME_SNAKE: + snake(); + break; + case GAME_MINESWEEPER: + minesweeper(); + break; + } +} + +/* + * Highlight a valid menu option. + * + * Input: + * menu: A pointer to the menu grid. + * target: The menu option to highlight. + * offset_x: The x offset of the menu. + * offset_y: The y offset of the menu. + * + * Side effects: + * If a valid menu option is provided: It will be highlighted in green. + * If an invalid menu option is provided: Nothing happens + */ +static void menu_highlight(const rooster *menu) { + switch (SELECTED_GAME) { + case GAME_MAZE_RUNNER: + case GAME_SNAKE: + case GAME_MINESWEEPER: + case GAME_QUIT: + attron(COLOR_PAIR(GREEN)); + + char* row = rooster_vraag_rij(menu, SELECTED_GAME); + mvprintw(OFFSET_Y + (int)SELECTED_GAME, OFFSET_X, "%s", row); + free(row); + + attroff(COLOR_PAIR(GREEN)); + } +} + +/* + * Show the menu screen. + * + * Input: + * menu: A pointer to the menu grid. + * default_selection: The starting selection in the menu. + * offset_x: The x offset of the menu. + * offset_y: The y offset of the menu. + * + * Side Effects: + * Displays the menu + */ +static void show_menu(const rooster *menu) { + clear(); + show_grid_on_offset(menu, OFFSET_X, OFFSET_Y); + menu_highlight(menu); + refresh(); +} + +/* + * Select the game on a location determined by a given offset. + * Negative values go up and positive values go down. + * Out of bounds selections loop around. + * + * Input: + * selected_game: The currently selected game. + * offset: The amount offset the current selection by. + * + * Side effect: + * The game on the location of the given offset will be selected. + */ +static void menu_move(const int offset) { + SELECTED_GAME = modulo(SELECTED_GAME + offset, AMOUNT_OF_MENU_OPTIONS); +} + +/* + * Navigate through the menu. + * + * Input: + * menu: A pointer to the menu grid. + * + * Output: A code that reflects the current menu state. + * 0: Continue running. + * 1: Exit the menu. + * + * + * Side Effect: + * Changes the SELECTED_GAME as needed and launches selected games on select. + */ +static int navigate_menu(rooster *menu) { + switch (getch()) { + case KEY_UP: + case 'w': + case 'W': + menu_move(-1); + break; + case KEY_DOWN: + case 's': + case 'S': + menu_move(1); + break; + case KEY_ENTER: + case 'f': + case 'F': + if (SELECTED_GAME == GAME_QUIT) { + return 1; + } + launch_game(menu, SELECTED_GAME); + break; + case KEY_BACKSPACE: + return 1; + } + return 0; +} + +/* + * Create the menu grid. + * + * Output: + * A pointer to the menu grid. + */ +static rooster *initialize_menu(void) { + char menu[] = "Maze Runner\n" + " Snake \n" + "Minesweeper\n" + " Leave \n"; + rooster *rp = rooster_maak(menu); + return rp; +} + +void minigame_menu(void) { + rooster *menu = initialize_menu(); + + while (true) { + show_menu(menu); + if (navigate_menu(menu) == 1) { + break; + } + } + + rooster_klaar(menu); +} diff --git a/minigame_menu.h b/minigame_menu.h new file mode 100644 index 0000000..5c4c3cd --- /dev/null +++ b/minigame_menu.h @@ -0,0 +1,35 @@ +/* + * Created by snapshot112 on 10/15/25. + * + * A minigame menu for games configured to run on the grid game engine. + * + * Please make sure to include and initialize the game engine before calling menu(); + */ + +#ifndef MINIGAME_MENU_MINIGAME_MENU_H +#define MINIGAME_MENU_MINIGAME_MENU_H + +typedef enum { + GAME_MAZE_RUNNER = 0, + GAME_SNAKE = 1, + GAME_MINESWEEPER = 2, + GAME_QUIT = 3, +} game; + +/* + * A minigame menu for games configured to run on the grid game engine. + * + * Please make sure to include and initialize the game engine before calling menu(); + * + * Side Effects: + * Clears the console and uses it to display a minigame menu. + * + * Controls: + * 'w'/'arr_up: Next menu item. + * 's'/'arr_down': Previous menu item. + * 'f': Select current menu item. + * 'BACKSPACE': Exit the menu. + */ +void minigame_menu(void); + +#endif //MINIGAME_MENU_MINIGAME_MENU_H diff --git a/rooster.c b/rooster.c index b312092..609d07e 100644 --- a/rooster.c +++ b/rooster.c @@ -4,9 +4,6 @@ #include #include - -// TODO: End the eternal NULL checks. - /* * The rooster type this program is build around. */ @@ -17,14 +14,12 @@ typedef struct rooster_data { toestand state; } rooster; - 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); + return NULL; } for (int i = 0; input[i] != '\n'; i++) { @@ -35,14 +30,18 @@ rooster *rooster_maak(const char* input) { for (int i = 0; i < height; i = i + width + 1) { if ((int)strcspn(&input[i], "\n") != width) { - perror("rooster_maak"); - exit(1); - }; + return NULL; + } } const int grid_size = (width + 1) * height + 1; rooster *rp = malloc(sizeof(rooster)); + + if (rp == NULL) { + return NULL; + } + rp->rost = malloc(grid_size * sizeof(char)); rp->height = height; rp->width = width; @@ -68,10 +67,6 @@ rooster *rooster_maak(const char* input) { * 0 otherwise */ static int get_grid_sizes(FILE *fh, rooster *rost) { - if (fh == NULL) { - return 0; - } - while (getc(fh) != '\n') { if (feof(fh)) { return 0; @@ -242,18 +237,6 @@ int rooster_plaats(rooster *rp, int x, int y, char c) { return 0; } -char *rooster_als_string(const rooster *rp) { - if (rp != NULL && rp->rost != NULL) { - char *string = malloc(sizeof(rp->rost)); - if (string == NULL) { - return NULL; - } - memcpy(string, rp->rost, sizeof(rp->rost)); - return string; - } - return NULL; -} - char *rooster_vraag_rij(const rooster *rp, int y) { if (rp != NULL && rp->rost != NULL && rooster_bevat(rp, 0, y) == 1) { // we're going to remove the newline so this is long enough diff --git a/rooster.h b/rooster.h index 229dc87..9ff94ea 100644 --- a/rooster.h +++ b/rooster.h @@ -79,18 +79,6 @@ char *rooster_vraag_rij(const rooster *rp, int y); */ rooster *rooster_kopieer(const rooster *rp); -/* - * Haal het hele rooster op in de vorm van een string. - * - * Input: - * rp: Een pointer naar het rooster. - * - * Output: - * Een pointer naar een string met daarin het hele rooster, - * regels zijn gescheiden door '/n' karakters. - */ -char *rooster_als_string(const rooster *rp); - /* Vraag de huidige toestand van het spel op. Input: diff --git a/snake.c b/snake.c new file mode 100644 index 0000000..607e91a --- /dev/null +++ b/snake.c @@ -0,0 +1,16 @@ +// +// Created by snapshot112 on 10/15/25. +// + +#include "snake.h" + +#include + +#include "grid_game_engine.h" + +void snake(void) { + clear(); + mvprintw(0,0, "Snake has not yet been created"); + graceful_exit(); + refresh(); +} diff --git a/snake.h b/snake.h new file mode 100644 index 0000000..21cda6b --- /dev/null +++ b/snake.h @@ -0,0 +1,26 @@ +/* + * Created by snapshot112 on 10/15/25. + * + * A game of maze runner configured to run on the grid game engine. + * + * Please make sure to include and initialize the game engine before calling snake(); + */ + +#ifndef MINIGAME_MENU_SNAKE_H +#define MINIGAME_MENU_SNAKE_H + +/* + * A game of snake configured to run on the grid game engine. + * + * Please make sure to include and initialize the game engine before calling snake(); + * + * Side Effects: + * Clears the console and uses it to play a game of snake. + * + * Controls: + * Use WSAD or arrow keys to redirect the snake. + * Use BACKSPACE to exit the game early. + */ +void snake(void); + +#endif //MINIGAME_MENU_SNAKE_H diff --git a/spel b/spel index 0743e6b02f277071fc255c203ef231ad301d0a9e..3f4560f8ef209e170207a72e37cb1cb54edda048 100755 GIT binary patch literal 119704 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 T6Vg1t@;O!WtfU8$Zms_X+NX~K literal 113232 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 diff --git a/spel.c b/spel.c index 68fb267..32031a0 100644 --- a/spel.c +++ b/spel.c @@ -3,454 +3,22 @@ * UvAnetID: 16333969 * Studie: BSc Informatica * - * This program loads in a maze from a text file and then lets you play that maze. + * A minigame menu that lets you play games on the grid game engine. * - * Params when running the program: - * - The path to the text file containing the maze. - * - * How to play the game: - * - You are the '*' character. - * - Use either WSAD or the arrow keys to navigate through the maze. - * - The exit of the maze is marked with a '$'. - * - Walls are '#'. - * - Traps are 'X'. These kill you. - * - * You can quit the program at any time by pressing CTRL + C. - * - * Have fun playing! + * Currently the following games are included: + * - maze runner + * - snake + * - minesweeper */ -#include -#include -#include -#include - -#include -#include -#include -#include - -#include "rooster.h" - -typedef enum { - GAME_QUIT, - GAME_MAZE_RUNNER, - GAME_SNAKE, - GAME_MINESWEEPER -} game; - -typedef enum { - BLACK = 1, - WHITE = 2, - BLUE = 3, - GREEN = 4, - CYAN = 5, - MAGENTA = 6, - YELLOW = 7, - RED = 8//, - // LIME = 9 -} game_colors; - -typedef struct { - char name[100]; - rooster *game_map; -} game_maps; - -void toon_rooster_op_locatie(rooster *rp, int starting_x, int starting_y) { - int height = rooster_hoogte(rp); - - for (int y = 0; y < height; y++) { - char *rij = rooster_vraag_rij(rp, y); - mvprintw(starting_y + y, starting_x, "%s", rij); - free(rij); - } - refresh(); -} - -/* Toont het gegeven rooster met ncurses. - * - * Input: - * rp: een pointer naar het rooster. - * - * Side effect: - * De console wordt geleegd en het rooster wordt erin gezet. - */ -void toon_rooster(rooster *rp) { - clear(); - - toon_rooster_op_locatie(rp, 0, 0); -} - -void update_grid(rooster *rp, char c, int x, int y) { - if (rooster_plaats(rp, x, y, c) == 1) { - mvaddch(y, x, c); - } -} - -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: - * rp : een pointer naar het rooster - * dx,dy: de richting waarin de speler probeert te bewegen. De vier mogelijk- - * heden voor (dx,dy) zijn (-1,0), (1,0), (0,-1), (0,1) voor resp. - * links, rechts, omhoog en omlaag. - * - * Side effect: het rooster wordt aangepast op basis van de handeling van - * de speler. - */ -void maze_runner_beweeg(rooster *rp, int dx, int dy) { - int playerx; - int playery; - rooster_zoek(rp, '*', &playerx, &playery); - - if (playerx == -1 || playery == -1) { - printf("Player not found!"); - exit(1); - } - - if (rooster_bevat(rp, playerx + dx, playery + dy) == 1) { - char new_location = rooster_kijk(rp, playerx + dx, playery + dy); - switch (new_location) { - case '#': - break; - case 'X': - update_grid(rp, ' ', playerx, playery); - rooster_zet_toestand(rp, STATE_VERLOREN); - break; - case ' ': - update_grid(rp, ' ', playerx, playery); - update_grid(rp, '*', playerx + dx, playery + dy); - break; - case '$': - update_grid(rp, ' ', playerx, playery); - rooster_zet_toestand(rp, STATE_GEWONNEN); - break; - } - refresh(); - } -} - -/* - * Speel een dolhof spel. - * - * Input: - * rp: Een pointer naar een rooster met een valide doolhof erin. - * - * Side Effects: - * Met WSAD en arrow keys kun je door het doolhof heen bewegen. - * - */ -void maze_runner(rooster *rp) { - while (rooster_vraag_toestand(rp) == STATE_AAN_HET_SPELEN) - { - switch (getch()) { - case KEY_UP: // fallthrough - case 'w': - maze_runner_beweeg(rp, 0, -1); - break; - case KEY_DOWN: // fallthrough - case 's': - maze_runner_beweeg(rp, 0, 1); - break; - case KEY_LEFT: // fallthrough - case 'a': - maze_runner_beweeg(rp, -1, 0); - break; - case KEY_RIGHT: // fallthrough - case 'd': - maze_runner_beweeg(rp, 1, 0); - break; - case KEY_BACKSPACE: - rooster_zet_toestand(rp, STATE_QUIT); - break; - } - } -} - -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. - - // 2. Open het doolhof bestand en lees het rooster. - FILE *fh = fopen("assets/voorbeeld_doolhof.txt", "r"); - if (fh == NULL) { - perror("loading maze"); - game_error(); - } - rooster *rp = rooster_lees(fh); - fclose(fh); - - // 3. Bepaal of het lezen van het rooster is gelukt. - if (rp == NULL) { - fprintf(stderr, "Kan rooster niet maken.\n"); - 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. - attron(COLOR_PAIR(HIGHLIGHT_COLOR)); - mvaddch(y0 + y, x0 + x * 2, ' '); - addch(' '); - attroff(COLOR_PAIR(kleur)); - char* row = rooster_vraag_rij(rp, target); - mvprintw(offset_y + (int)target, offset_x, row); - free(row); - } -} - -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: - case 'p': - // 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 -} +#include "grid_game_engine.h" +#include "minigame_menu.h" 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// 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 - - start_color(); - init_pair(BLACK, COLOR_BLACK, COLOR_BLACK); - init_pair(WHITE, COLOR_BLACK, COLOR_WHITE); - init_pair(BLUE, COLOR_BLACK, COLOR_BLUE); - init_pair(GREEN, COLOR_BLACK, COLOR_GREEN); - init_pair(CYAN, COLOR_BLACK, COLOR_CYAN); - init_pair(MAGENTA, COLOR_BLACK, COLOR_MAGENTA); - init_pair(YELLOW, COLOR_BLACK, COLOR_YELLOW); - init_pair(RED, COLOR_BLACK, COLOR_RED); - // init_pair(LIME, COLOR_BLACK, COLOR_LIME); - + init_engine(); // 5. Speel het spel. - startup_sequence(); - menu(); + minigame_menu(); - // 6. Sluit af. - quit_game(NULL); + cleanup_engine(); }