From 2e57c4e4ad50f8481c7c8a8ce79632ea8a8ca5c5 Mon Sep 17 00:00:00 2001 From: Matej Hajduk Date: Tue, 8 Apr 2025 13:12:25 +0200 Subject: [PATCH] du5 --- du5/Makefile | 14 ++++ du5/README.md | 16 ++++ du5/game | Bin 0 -> 37120 bytes du5/main.c | 110 ++++++++++++++++++++++++++++ du5/main.o | Bin 0 -> 9728 bytes du5/snake.c | 82 +++++++++++++++++++++ du5/snake.h | 114 +++++++++++++++++++++++++++++ du5/snake.o | Bin 0 -> 7120 bytes du5/world.c | 198 ++++++++++++++++++++++++++++++++++++++++++++++++++ du5/world.h | 122 +++++++++++++++++++++++++++++++ du5/world.o | Bin 0 -> 18992 bytes 11 files changed, 656 insertions(+) create mode 100644 du5/Makefile create mode 100644 du5/README.md create mode 100755 du5/game create mode 100644 du5/main.c create mode 100644 du5/main.o create mode 100644 du5/snake.c create mode 100644 du5/snake.h create mode 100644 du5/snake.o create mode 100644 du5/world.c create mode 100644 du5/world.h create mode 100644 du5/world.o diff --git a/du5/Makefile b/du5/Makefile new file mode 100644 index 0000000..d71d436 --- /dev/null +++ b/du5/Makefile @@ -0,0 +1,14 @@ +CFLAGS=-std=c99 -Wall -g + +all: game + +%.o: %.c + gcc $(CFLAGS) -c $< -o $@ + +clean: + rm *.o + rm game + +game: main.o world.o snake.o + gcc -rdynamic -g main.o world.o snake.o -lcurses -lm -o game + diff --git a/du5/README.md b/du5/README.md new file mode 100644 index 0000000..79a2d67 --- /dev/null +++ b/du5/README.md @@ -0,0 +1,16 @@ +# Snake Master + +Implement Snake game. + +Make the game to pass the automatic tests and make the game to be nice. + +## Files + +Please do not change file names. + +- `snake.h`: you implementation should follow this header. +- `snake.c`: implemement the game according to the documentation in header file in this file to pass automatic tests. +- `Makefile`: rules to build the game. +- `main.c`: trivial main function that runs the game, modify this file to change the appereance of the game and the initial state. +- `world.c`: world game loop and ASCII graphics library (do not change). +- `world.h`: world library interface (do not change). diff --git a/du5/game b/du5/game new file mode 100755 index 0000000000000000000000000000000000000000..d366ed45c5ab56991fdc397f1e5879c60679be63 GIT binary patch literal 37120 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 +#include +#include +#include +#include "snake.h" +// This file contains functions for drawing the the game and changing the state + +// Start is called one in the beginning +void* init_game(){ + // Allocate memory for the state + struct state* st = calloc(1,(sizeof(struct state))); + return st; +} + +// The first event +// Initialize game state +// - borders +// - snake position +// - food position +void init_snake(struct event* world, struct state* st){ + int cy = world->height/2; + int cx = world->width/2 - 5; + for (int i = 0; i < 5; i++){ + st->snake = add_snake(st->snake,cx + i ,cy); + } + + int h = world->height; + int w = world->width; + for (int i = 0; i < 5; i++){ + st->foodx[i] = rand() % w; + st->foody[i] = rand() % h; + } + // Initial game vector + st->sx = 1; + st->sy = 0; +} + +// Step is called in a loop once in interval. +// It should modify the state and draw it. +int world_event(struct event* w,void* game){ + // Get state pointer + struct state* st = game; + if (w->type == EVENT_START){ + // Called on beginning + init_snake(w,st); + } + // Called on key press + else if (w->type == EVENT_KEY){ + int key = w->key; + // Modifies vector of snake movement + if (key == KEY_RIGHT){ + st->sx = 1; + st->sy = 0; + } + else if (key == KEY_LEFT){ + st->sx = -1; + st->sy = 0; + } + else if (key == KEY_DOWN){ + st->sx = 0; + st->sy = 1; + } + else if (key == KEY_UP){ + st->sx = 0; + st->sy = -1; + } + } + // Called on esc key + else if (w->type == EVENT_ESC){ + // Non zero means finish the loop and stop the game. + return 1; + } + // Called on interval timeout + else if (w->type == EVENT_TIMEOUT){ + clear_screen(); + // Copy screen size + st->width = w->width; + st->height = w->height; + // Change game state + int r = step_state(st); + char ms[200]; + sprintf(ms,"r %d\n",r); + set_message(ms,9,9); + // Draw snake + struct snake* sn = st->snake; + while (sn != NULL){ + set_cell('x',sn->x,sn->y); + sn = sn->next; + } + // Draw food + for (int i = 0 ; i < FOOD_COUNT; i++){ + if (st->foodx[i] >= 0 && st->foody[i] >= 0){ + set_cell('*',st->foodx[i],st->foody[i]); + } + } + // Stop the game + if (r){ + char message[] = "Koniec"; + set_message(message,10,10); + } + } + return 0; +} + + +int main(int argc, char** argv){ + start_world(init_game,world_event,free); + return 0; +} diff --git a/du5/main.o b/du5/main.o new file mode 100644 index 0000000000000000000000000000000000000000..25aa2ac4df98a528ebb28bae7ecc44e11a6801ac GIT binary patch literal 9728 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 M|E1d*WZnON0aiD-EC2ui literal 0 HcmV?d00001 diff --git a/du5/snake.c b/du5/snake.c new file mode 100644 index 0000000..838bf8b --- /dev/null +++ b/du5/snake.c @@ -0,0 +1,82 @@ +#include "snake.h" +#include + +struct snake* add_snake(struct snake* snake,int x,int y){ + struct snake* bod = malloc(sizeof(struct snake)); + if (bod == NULL) return snake; + bod->x = x; + bod->y = y; + bod->next = snake; + return bod; +} + +struct snake* remove_snake(struct snake* snake){ + if (snake == NULL || snake->next == NULL){ + free(snake); + return NULL; + } + struct snake* z = snake; + while (z->next->next != NULL){ + z = z->next; + } + free(z->next); + z->next = NULL; + return snake; +} + +void free_snake(struct snake* sn){ + while (sn != NULL) { + struct snake* tmp = sn; + sn = sn->next; + free(tmp); + } +} + +int is_snake(struct snake* snake,int x,int y){ + while ( snake != NULL){ + if (snake->x == x && snake->y == y) return 1; + snake = snake->next; + } + return 0; +} + +int step_state(struct state* st){ + int nx = (st->snake->x + st->sx); + int ny = (st->snake->y + st->sy); + + if (nx < 0 || nx >= st->width || ny < 0 || ny >= st->height) { + return END_WALL; + } + + // vlastna kolizia + if (is_snake(st->snake, nx, ny)) { + return END_SNAKE; + } + + // skontroluje jedlo + for (int i = 0; i < FOOD_COUNT; ++i) { + if (st->foodx[i] == nx && st->foody[i] == ny) { + // zje + st->foodx[i] = -1; + st->foody[i] = -1; + // hlava + st->snake = add_snake(st->snake, nx, ny); + + // skontroluje ci ostalo jedlo + int food_left = 0; + for (int j = 0; j < FOOD_COUNT; ++j) { + if (st->foodx[j] >= 0 && st->foody[j] >= 0) { + food_left = 1; + break; + } + } + + return food_left ? END_CONTINUE : END_FOOD; + } + } + + // Regular move (no food) + st->snake = add_snake(st->snake, nx, ny); + st->snake = remove_snake(st->snake); + return END_CONTINUE; +} diff --git a/du5/snake.h b/du5/snake.h new file mode 100644 index 0000000..4d1ff74 --- /dev/null +++ b/du5/snake.h @@ -0,0 +1,114 @@ +#ifndef snake_h_INCLUDED +#define snake_h_INCLUDED + +// Number of food items on the plane +#define FOOD_COUNT 5 + +/** + * One part of the snake; + * + * The snake is a linked list; + */ + +struct snake { + // x position of the snake part + int x; + // y position of the snake part + int y; + // Pointer to the next snake part. + // The last part of the snake has NULL pointer to the next part. + struct snake* next; +}; + +// End game reason constants, return value of step_state +enum endgame { + // Continue the game + END_CONTINUE = 0, + // Snake hit a wall + END_WALL, + // Snake hit itself + END_SNAKE, + // No food left + END_FOOD, + // Other reason to end + END_USER +}; + +/** + * State of the game. + * + * The state consists of the snake, its speed and food on the plane. + * + * The snake is a linked list of snake parts. + * + * Speed vector is a vector added to the last head position to create a new head. + * + * Food are points on the plane. Food with negative coordinates meads food is already eaten. + */ + +struct state { + // Snake as a linked list + struct snake* snake; + // X of the food positions + int foodx[FOOD_COUNT]; + // Y of the food positions + int foody[FOOD_COUNT]; + int sx; + int sy; + int width; + int height; +}; + +/** + * Add a new snake part with given position. The new snake part becomes the new head. + * + * @param head of the snake. + * @param x coordinate of the new head; + * @param y coordinate of the new head. + * @return new head of the snake. + */ +struct snake* add_snake(struct snake* snake,int x,int y); + +/** + * Remove the last snake part. + * The last snake part should always have NULL next pointer. + * + * @param head of the snake. + * @return new head of the snake. + */ +struct snake* remove_snake(struct snake* snake); + +/** + * Finds out if given coordinates are part of the snake. + * @param snake + * @param x coordinate to search in snake + * @param y coordinate to search in snake + * @return True, if there is a snake part with coordinates x,y. False otherwise + * + */ +int is_snake(struct snake* snake,int x, int y); +/** + * Remove and free each snake part; + * @param head of the snake. + */ +void free_snake(struct snake* sn); +/** + * Change game state. + * + * The function shoud calculate new posision of the snake head + * from the current position and speed vector. + * Then it should modify snake parst or food coordinates according to the rules: + * + * - If the new position is on the snake, end the game, return END_SNAKE. + * - If the new position is on the food, mark food as eaten + * (set its coordinates to -1) and add new snake part on the position of the food. If there is no food left, return END_FOOD. else return END_CONTINUE. + * - If the new position is on the plane, add new snake part on the new position and remove the last part of the snake, return END_CONTINUE. + * + * @param current state of the game + * @return reason to end the game according to enum endgame. + */ +int step_state(struct state* state); + + +#endif // snake_h_INCLUDED + diff --git a/du5/snake.o b/du5/snake.o new file mode 100644 index 0000000000000000000000000000000000000000..477bbf19b866dee30bc6f21811da09b97a7a577c GIT binary patch literal 7120 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 literal 0 HcmV?d00001 diff --git a/du5/world.c b/du5/world.c new file mode 100644 index 0000000..a45c109 --- /dev/null +++ b/du5/world.c @@ -0,0 +1,198 @@ +#include "world.h" +#include +#include +#include +#include +#include + +int TIMEOUT; + +void abort_game(const char* message){ + endwin(); + puts(message); + exit(1); +} + +void check_bounds(const char* source,int x, int y){ + char msg[200]; + if (x < 0 || x >= COLS){ + sprintf(msg,"%s:: width %d is out of bounds (0,%d)",source,x,COLS); + abort_game(msg); + } + if (y < 0 || y >= LINES){ + sprintf(msg,"%s:: height %d is out of bounds (0,%d)",source,y,LINES); + abort_game(msg); + } +} + +void clear_screen(){ + // Clear screen + mvaddch(0,0,' '); + int screenchars = LINES*COLS; + for (int j = 1; j < screenchars;j++ ){ + addch(' '); + } +} + +void game_speed(int value){ + if (value < 0){ + abort_game("world_seed:: cannot be negative\n"); + } + TIMEOUT =value; +} + +void set_message(const char* message,int x,int y) { + int l = strlen(message); + for (int i = 0; i < l; i++){ + check_bounds("set_message",x+i,y); + set_cell(message[i],x+i,y); + } +} + +void assert_message(int event,const char* message){ + if (event == 0){ + abort_game(message); + } +} + + +void set_cell(int character,int x,int y) { + check_bounds("set_cell",x,y); + set_color_cell(character,x,y,COLOR_WHITE,COLOR_BLACK); +} + +void set_color_cell(int character,int x,int y,short front_color,short back_color){ + check_bounds("set_color_cell",x,y); + if (has_colors()){ + int pair = COLOR_COUNT * front_color + back_color; + attron(COLOR_PAIR(pair)); + mvaddch(y,x,character); + attroff(COLOR_PAIR(pair)); + } + else{ + mvaddch(y,x,character); + } +} + +int start_world(void* (*init_game)(),int (*world_event)(struct event* event,void* game),void (*destroy_game)(void*)){ + srand(time(NULL)); + int r = 1; + // Speed global variable + TIMEOUT = 100; + if (initscr() == NULL){ + // TODO Which Error? + puts("Curses Error."); + return -1; + } + noecho(); // Nevypisuj vstup na obrazovku + cbreak(); // Zabudni starý vstup + nodelay(stdscr,TRUE); // Nečakaj na stlačenie + keypad(stdscr,TRUE); // Aktivuje šípky + curs_set(FALSE); // Neviditeľný kurzor + /* Get all the mouse events */ + mousemask(ALL_MOUSE_EVENTS, NULL); + MEVENT mouse_event; + if (has_colors()){ // Zistenie či terminál podporuje farby + start_color(); + for (int i = 0; i < COLOR_COUNT;i++){ + for (int j = 0; j < COLOR_COUNT;j++){ + init_pair(i * COLOR_COUNT + j, i,j); + } + } + } + else { + puts("No colors!\n"); + } + void* game = NULL; + if (init_game != NULL){ + game = init_game(); + assert_message(game != NULL,"init_game:: should return non null pointer"); + } + timeout(TIMEOUT); + // Initial step + struct event event; + memset(&event,0,sizeof(struct event)); + event.height = LINES; + event.width = COLS; + event.type = EVENT_START; + clock_t start_time = clock(); + clock_t last_timeout = start_time; + clock_t next_timeout = last_timeout + TIMEOUT; + event.time_ms = start_time; + // Start event + r = world_event(&event,game); + refresh(); + while (!r) { + memset(&event,0,sizeof(struct event)); + event.height = LINES; + event.width = COLS; + event.key = getch(); + // No key was pressed + if (event.key == ERR){ + event.type = EVENT_TIMEOUT; + last_timeout = clock(); + next_timeout = last_timeout + TIMEOUT; + } + // Mouse event + else if (event.key == KEY_MOUSE ){ + event.type = EVENT_MOUSE; + if(getmouse(&mouse_event) == OK){ + event.mouse_x = mouse_event.x; + event.mouse_y = mouse_event.y; + if(mouse_event.bstate & BUTTON1_PRESSED){ + event.mouse_left = 1; + } + if(mouse_event.bstate & BUTTON2_PRESSED){ + event.mouse_middle = 1; + } + if(mouse_event.bstate & BUTTON3_PRESSED){ + event.mouse_right = 1; + } + } + } + else if (event.key == KEY_RESIZE) { + event.type = EVENT_RESIZE; + } + else{ + event.type = EVENT_KEY; + if (event.key == 27){ + int k = getch(); + if (k == -1){ + // Esc Was pressed + event.type = EVENT_ESC; + } + else { + // Alt was pressed + event.key = k; + event.alt_key = 1; + } + } + } + // Draw new world + event.time_ms = clock(); + r = world_event(&event,game); + refresh(); + event.time_ms = clock(); + // set new timeout + int nt = next_timeout - event.time_ms; + //printf("%d\n",nt); + if (nt > 0){ + timeout(nt); + } + else { + timeout(TIMEOUT); + next_timeout = event.time_ms + TIMEOUT; + } + } + memset(&event,0,sizeof(struct event)); + event.height = LINES; + event.width = COLS; + event.type = EVENT_END; + event.time_ms = clock(); + world_event(&event,game); + if (destroy_game != NULL){ + destroy_game(game); + } + endwin(); + return r; +}; diff --git a/du5/world.h b/du5/world.h new file mode 100644 index 0000000..e7a3fdb --- /dev/null +++ b/du5/world.h @@ -0,0 +1,122 @@ +#ifndef _WORLD_H_ +#define _WORLD_H_ + +#include + +/** + * World represented as a rectangular matrix of colorful characters. + * + * Point [0,0] is displayed the upper left corner of the screen. + * + */ + +enum event_type { + EVENT_START, + EVENT_TIMEOUT, + EVENT_KEY, + EVENT_MOUSE, + EVENT_RESIZE, + EVENT_ESC, + EVENT_END, +}; + +struct event { + /** + * Last width of the screen. + */ + int width; + /** + * Last height of the screen. + */ + int height; + /** + * Last pressed key or Curses event. + * + * Special event values: + * ERR if timeout, + * KEY_RESIZE if screen resize + * KEY_EVENT, other event, + * KEY_MOUSE, mouse clicked + * + * Key values: + * + * ' ' Space + * KEY_DOWN Arrow down + * KEY_UP Arrow up + * KEY_LEFT Arrow left + * KEY_RIGHT Arrow right + * KEY_A1 Upper left of keypad + * KEY_A3 Upper right of keypad + * KEY_B2 Center of keypad + * KEY_C1 Lower left of keypad + * KEY_C3 Lower right of keypad + * + * KEY_ENTER + * KEY_BACKSPACE + */ + int key; + int alt_key; + enum event_type type; + int mouse_x; + int mouse_y; + int mouse_left; + int mouse_right; + int mouse_middle; + long int time_ms; +}; + +/** + * Sets cell to a state. + * @param event + * @param x coordinate of cell + * @param y coordinate of cell + * @param new state of the cell + */ +void set_cell(int character,int x,int y); + +/** + * COLOR_BLACK 0 + * COLOR_RED 1 + * COLOR_GREEN 2 + * COLOR_YELLOW 3 + * COLOR_BLUE 4 + * COLOR_MAGENTA 5 + * COLOR_CYAN 6 + * COLOR_WHITE 7 + */ + +#define COLOR_COUNT 8 + +void set_color_cell(int character,int x,int y,short front_color,short back_color); + + +/** + * + * @param event + * @param number of commandline arguments + * @param init_world + * @param destroy_world + * + * void init_world(struct event* w); + * Initializes user state. + * Free user state. + * @param event + */ + +int start_world(void* (*init_game)(),int (*world_event)(struct event* event,void* game),void (*destroy_game)(void* game)); +/** + * Set timeout interval in miliseconds + */ +void game_speed(int value); + +/* + * Prints a message in screen on a position x,y + */ + +void set_message(const char* message,int x,int y); +/* + * Clears screen + */ +void clear_screen(); + +#endif diff --git a/du5/world.o b/du5/world.o new file mode 100644 index 0000000000000000000000000000000000000000..d60ebb462ac81879cee22b62865b373cc8b55777 GIT binary patch literal 18992 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 XFxDfXV7U5wma7{7rYrK@3WxY_-ch|| literal 0 HcmV?d00001