From 0e133aff323068674e7660a0491d70333bba7c0e Mon Sep 17 00:00:00 2001 From: Jeroen Boxhoorn Date: Fri, 17 Oct 2025 11:15:53 +0200 Subject: [PATCH] SNAKEEEEEEEEEEEE --- deel2.tar.gz | Bin 0 -> 10418 bytes grid_game_engine.c | 2 +- grid_game_engine.h | 5 + maze_runner.c | 53 ++++---- minigame_menu.c | 2 +- rooster.c | 7 +- rooster.h | 4 +- snake.c | 303 +++++++++++++++++++++++++++++++++++++++++---- spel | Bin 120608 -> 134624 bytes spel.c | 1 - 10 files changed, 317 insertions(+), 60 deletions(-) create mode 100644 deel2.tar.gz diff --git a/deel2.tar.gz b/deel2.tar.gz new file mode 100644 index 0000000000000000000000000000000000000000..67bd8b7d78a18bc35ea0d34d0ef8c9515610d959 GIT binary patch literal 10418 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 literal 0 HcmV?d00001 diff --git a/grid_game_engine.c b/grid_game_engine.c index 8cd7267..5a63a64 100644 --- a/grid_game_engine.c +++ b/grid_game_engine.c @@ -90,7 +90,7 @@ static void display_hackerman(void) { } void graceful_exit(void) { - mvprintw(5, 5, "Press 'q' to exit."); + mvprintw(25, 5, "Press 'q' to exit."); while (1) { switch (getch()) { case 'q': diff --git a/grid_game_engine.h b/grid_game_engine.h index 030a241..25fe2b9 100644 --- a/grid_game_engine.h +++ b/grid_game_engine.h @@ -11,6 +11,11 @@ #define MINIGAME_MENU_GRID_GAME_ENGINE_H #include "rooster.h" +typedef struct { + int x; + int y; +} coordinate; + typedef enum { BLACK = 1, WHITE = 2, diff --git a/maze_runner.c b/maze_runner.c index 6727a87..201d499 100644 --- a/maze_runner.c +++ b/maze_runner.c @@ -23,7 +23,7 @@ static rooster *get_maze(void) { perror("loading maze"); exit(EXIT_FAILURE); } - rooster *rp = rooster_lees(fh); + rooster *rp = grid_from_file(fh); fclose(fh); // 3. Bepaal of het lezen van het rooster is gelukt. @@ -83,33 +83,30 @@ static void maze_runner_beweeg(rooster *rp, int dx, int dy) { * 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; - } + 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; } } diff --git a/minigame_menu.c b/minigame_menu.c index aaa1489..c886127 100644 --- a/minigame_menu.c +++ b/minigame_menu.c @@ -155,7 +155,7 @@ static rooster *initialize_menu(void) { " Snake \n" "Minesweeper\n" " Leave \n"; - rooster *rp = rooster_maak(menu); + rooster *rp = grid_from_string(menu); return rp; } diff --git a/rooster.c b/rooster.c index 609d07e..aeec8ae 100644 --- a/rooster.c +++ b/rooster.c @@ -1,5 +1,6 @@ #include "rooster.h" +#include #include #include #include @@ -14,11 +15,12 @@ typedef struct rooster_data { toestand state; } rooster; -rooster *rooster_maak(const char* input) { +rooster *grid_from_string(const char* input) { int width = 0; int height = 0; const size_t len = strlen(input) / sizeof(char); if (input == NULL || len == 0) { + printf("invalid input\n"); return NULL; } @@ -30,6 +32,7 @@ rooster *rooster_maak(const char* input) { for (int i = 0; i < height; i = i + width + 1) { if ((int)strcspn(&input[i], "\n") != width) { + printf("line %d was not %d wide\n", i, width); return NULL; } } @@ -92,7 +95,7 @@ static int get_grid_sizes(FILE *fh, rooster *rost) { return 1; } -rooster *rooster_lees(FILE *fh) { +rooster *grid_from_file(FILE *fh) { if (fh == NULL) { return NULL; } diff --git a/rooster.h b/rooster.h index 9ff94ea..565c641 100644 --- a/rooster.h +++ b/rooster.h @@ -39,7 +39,7 @@ typedef enum { NULL teruggegeven. (In dat geval blijft geen gereserveerd geheugen achter.) */ -rooster *rooster_lees(FILE *fh); +rooster *grid_from_file(FILE *fh); /* * Maak een rooster op basis van een gegeven string. @@ -54,7 +54,7 @@ rooster *rooster_lees(FILE *fh); * NULL teruggegeven. (In dat geval blijft geen gereserveerd geheugen * achter.) */ -rooster *rooster_maak(const char* input); +rooster *grid_from_string(const char* input); /* * Haal een rij uit het rooster op. diff --git a/snake.c b/snake.c index 93ad071..02f1bc8 100644 --- a/snake.c +++ b/snake.c @@ -6,9 +6,65 @@ #include #include +#include +#include #include "grid_game_engine.h" +#define CELL_EMPTY ' ' +#define CELL_FOOD '$' +#define CELL_WALL '#' +#define DIRECTION_COUNT 4 +#define OFFSET_X 6 +#define OFFSET_Y 3 + +typedef enum { + SNAKE_MOVE = 0, + SNAKE_EAT = 1, + SNAKE_DIE = 2 +} snake_action; + +typedef enum { + DIRECTION_UP = 0, + DIRECTION_RIGHT = 1, + DIRECTION_DOWN = 2, + DIRECTION_LEFT = 3 +} direction; + +static direction PREVIOUS_DIRECTION = DIRECTION_DOWN; +static direction CURRENT_DIRECTION = DIRECTION_DOWN; +static coordinate SNAKE_HEAD; +static coordinate SNAKE_TAIL; +static coordinate MESSAGE_LOCATION = {0,0}; +static int MAP_HEIGHT = 20; +static int MAP_WIDTH = 20; + +/* + * Create a snake body part. + * + * Input: + * dir: the direction the body part should point to. + * + * Output: + * a character representing that bodypart. + */ +static char get_body_part(const direction dir) { + return (char)dir + '0'; +} + +/* + * Gets the direction of a body part. + * + * Input: + * body_part: A part of the snake's body. + * + * Output: + * The direction the next body part is pointing to. + */ +static direction get_body_part_direction(const char body_part) { + return (direction)(body_part - '0'); +} + /* * Create a grid for snake with a given height and width. * @@ -19,53 +75,250 @@ * Returns: * A pointer to the grid. */ -static rooster *initialize_snake(void) { - int width = 10; - int height = 10; - const int grid_size = (width + 1) * height + 1; +static rooster *create_grid(void) { + const int grid_size = (MAP_WIDTH + 1) * MAP_HEIGHT + 1; char *map = malloc(grid_size * sizeof(char)); if (map == NULL) { return NULL; } - for (int i = 0; i < (width + 1) * height; i++) { - int top_line = i < width; - int bottom_line = i > grid_size - (width + 2); + for (int i = 1; i <= (MAP_WIDTH + 1) * MAP_HEIGHT; i++) { + // Also subtract the null terminator + int bottom_line = i > grid_size - (MAP_WIDTH + 2); + int top_line = i < MAP_WIDTH + 1; - int line_position = modulo(i, width + 1); + int line_position = modulo(i, MAP_WIDTH + 1); int line_start = line_position == 1; - int line_end = line_position == width; + int line_end = line_position == MAP_WIDTH; int newline = line_position == 0; if (newline) { - map[i] = '\n'; + map[i - 1] = '\n'; } else if (top_line || bottom_line || line_start || line_end) { - map[i] = '#'; - } - else { - map[i] = ' '; + map[i - 1] = CELL_WALL; + } else { + map[i - 1] = CELL_EMPTY; } } map[grid_size - 1] = '\0'; - printf("%s", map); - - rooster *grid = rooster_maak(map); + rooster *grid = grid_from_string(map); free(map); + rooster_plaats(grid, rooster_breedte(grid) / 2, rooster_hoogte(grid) / 2, get_body_part(CURRENT_DIRECTION)); + return grid; +} + +/* + * + */ +static void generate_food(rooster *gp) { + coordinate empty_spots[MAP_HEIGHT * MAP_WIDTH]; + + // Usable as index when initialized like this. + int available_spots = 0; + + for (int x = 0; x < MAP_WIDTH; x++) { + for (int y = 0; y < MAP_HEIGHT; y++) { + if (rooster_kijk(gp, x, y) == CELL_EMPTY) { + coordinate new_spot = {x, y}; + empty_spots[available_spots] = new_spot; + available_spots++; + } + } + } + + // Available spots will now be a counter. + + const coordinate food_location = empty_spots[modulo(rand(), available_spots)]; + + rooster_plaats(gp, food_location.x, food_location.y, CELL_FOOD); +} + +/* + * Setup the game(map) + * + * Output: + * A pointer to the game grid. + * + * Side Effects: + * Seed random with the current time. + */ +static rooster *initialize(void) { + srand(time(NULL)); + + rooster *grid = create_grid(); + + if (grid == NULL) { + return NULL; + } + + // Set snake head and snake tail. + rooster_zoek(grid, get_body_part(CURRENT_DIRECTION), &SNAKE_HEAD.x, &SNAKE_HEAD.y); + SNAKE_TAIL.x = SNAKE_HEAD.x; + SNAKE_TAIL.y = SNAKE_HEAD.y; + + generate_food(grid); + + if (SNAKE_HEAD.x == -1) { + return NULL; + } + + MESSAGE_LOCATION.y = rooster_hoogte(grid) + OFFSET_Y + 5; + MESSAGE_LOCATION.x = OFFSET_X - 5 >= 0 ? OFFSET_X - 5 : 0; + return grid; } -void snake(void) { - // erase(); - rooster* const gp = initialize_snake(); - if (gp == NULL) { - printf("Help, initializing the grid failed\n"); +/* + * Checks what happens when the snake moves over a given char. + * + * Input: + * c: The char to check. + * + * Returns: + * The snake will move forward: 0 + * The snake will eat an apple: 1 + * The snake will die: 2 + */ +static snake_action collision_check(char c) { + if (c == CELL_EMPTY) { + return SNAKE_MOVE; } - // show_grid(gp); - // graceful_exit(); - // refresh(); + + if (c == CELL_FOOD) { + return SNAKE_EAT; + } + + return SNAKE_DIE; +} + +static void update_snake(rooster *gp, coordinate new_head, snake_action action) { + if (action == SNAKE_DIE) { + rooster_zet_toestand(gp, STATE_VERLOREN); + return; + } + + if (action == SNAKE_MOVE) { + coordinate new_tail = SNAKE_TAIL; + + switch (get_body_part_direction(rooster_kijk(gp, SNAKE_TAIL.x, SNAKE_TAIL.y))) { + case DIRECTION_UP: + new_tail.y--; + break; + case DIRECTION_RIGHT: + new_tail.x++; + break; + case DIRECTION_DOWN: + new_tail.y++; + break; + case DIRECTION_LEFT: + new_tail.x--; + break; + } + + rooster_plaats(gp, SNAKE_TAIL.x, SNAKE_TAIL.y, CELL_EMPTY); + SNAKE_TAIL = new_tail; + } + + // New head placed after tail moves. It can occupy the empty space created by the tail moving. + rooster_plaats(gp, new_head.x, new_head.y, get_body_part(CURRENT_DIRECTION)); + SNAKE_HEAD = new_head; + PREVIOUS_DIRECTION = CURRENT_DIRECTION; + + if (action == SNAKE_EAT) { + generate_food(gp); + } +} + +static void snake_move(rooster *gp) { + coordinate new_head = SNAKE_HEAD; + switch (CURRENT_DIRECTION) { + case DIRECTION_UP: + new_head.y--; + break; + case DIRECTION_RIGHT: + new_head.x++; + break; + case DIRECTION_DOWN: + new_head.y++; + break; + case DIRECTION_LEFT: + new_head.x--; + break; + } + + snake_action action = collision_check(rooster_kijk(gp, new_head.x, new_head.y)); + + update_snake(gp, new_head, action); + show_grid_on_offset(gp, OFFSET_X, OFFSET_Y); +} + +static void turn_snake(rooster *gp, direction dir) { + if ((direction)modulo(dir + 2, DIRECTION_COUNT) == PREVIOUS_DIRECTION) { + return; + } + rooster_plaats(gp, SNAKE_HEAD.x, SNAKE_HEAD.y, get_body_part(dir)); + CURRENT_DIRECTION = dir; + show_grid_on_offset(gp, OFFSET_X, OFFSET_Y); +} + +static void play_snake(rooster *gp) { + timeout(500); + + switch (getch()) { + case KEY_UP: // fallthrough + case 'w': + case 'W': + turn_snake(gp, DIRECTION_UP); + break; + case KEY_DOWN: // fallthrough + case 's': + case 'S': + turn_snake(gp, DIRECTION_DOWN); + break; + case KEY_LEFT: // fallthrough + case 'a': + case 'A': + turn_snake(gp, DIRECTION_LEFT); + break; + case KEY_RIGHT: // fallthrough + case 'd': + case 'D': + turn_snake(gp, DIRECTION_RIGHT); + break; + case KEY_BACKSPACE: + rooster_zet_toestand(gp, STATE_QUIT); + break; + case ERR: + snake_move(gp); + } +} + +void snake(void) { + rooster* const gp = initialize(); + if (gp == NULL) { + return; + } + erase(); + + //todo: ?? Win condition? + + show_grid_on_offset(gp, OFFSET_X, OFFSET_Y); + + mvprintw(MESSAGE_LOCATION.y, MESSAGE_LOCATION.x, "Press SPACEBAR to start playing."); + while (getch() != ' ') {} + + rooster_zet_toestand(gp, STATE_AAN_HET_SPELEN); + while (rooster_vraag_toestand(gp) == STATE_AAN_HET_SPELEN) { + play_snake(gp); + } + + // game_exit_screen(gp); + + rooster_klaar(gp); + graceful_exit(); } diff --git a/spel b/spel index 6cc0ab9c0f85d7a0bbae4610f48957298c43d99d..0c0f4fedabe66dd38ce818e6524c1ae21a7cff74 100755 GIT binary patch delta 33797 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 YN5T3o#CHOs!4IpVChqYaKg&A(f8z`_E&u=k delta 23166 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 diff --git a/spel.c b/spel.c index 26ee84f..32031a0 100644 --- a/spel.c +++ b/spel.c @@ -13,7 +13,6 @@ #include "grid_game_engine.h" #include "minigame_menu.h" -#include "snake.h" int main(void) { init_engine();