From 8cbfdfe783bfe3396dcf9d8cb3685557d43dc53d Mon Sep 17 00:00:00 2001 From: Vladyslav Korzun Date: Fri, 21 Apr 2023 08:13:53 +0000 Subject: [PATCH] =?UTF-8?q?=D0=97=D0=B0=D0=B3=D1=80=D1=83=D0=B7=D0=B8?= =?UTF-8?q?=D0=BB(=D0=B0)=20=D1=84=D0=B0=D0=B9=D0=BB=D1=8B=20=D0=B2=20'a2'?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- a2/Makefile | 14 ++++ a2/README.md | 16 +++++ a2/game | Bin 0 -> 37120 bytes a2/main.c | 110 ++++++++++++++++++++++++++++ a2/main.o | Bin 0 -> 9248 bytes a2/snake.c | 75 +++++++++++++++++++ a2/snake.h | 114 +++++++++++++++++++++++++++++ a2/snake.o | Bin 0 -> 7032 bytes a2/world.c | 198 +++++++++++++++++++++++++++++++++++++++++++++++++++ a2/world.h | 122 +++++++++++++++++++++++++++++++ a2/world.o | Bin 0 -> 18512 bytes 11 files changed, 649 insertions(+) create mode 100644 a2/Makefile create mode 100644 a2/README.md create mode 100644 a2/game create mode 100644 a2/main.c create mode 100644 a2/main.o create mode 100644 a2/snake.c create mode 100644 a2/snake.h create mode 100644 a2/snake.o create mode 100644 a2/world.c create mode 100644 a2/world.h create mode 100644 a2/world.o diff --git a/a2/Makefile b/a2/Makefile new file mode 100644 index 0000000..d71d436 --- /dev/null +++ b/a2/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/a2/README.md b/a2/README.md new file mode 100644 index 0000000..79a2d67 --- /dev/null +++ b/a2/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/a2/game b/a2/game new file mode 100644 index 0000000000000000000000000000000000000000..c7f33a0e68aaf477fe3225d1e08d392095805e24 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/a2/main.o b/a2/main.o new file mode 100644 index 0000000000000000000000000000000000000000..9d8698bcf0e29de9afca86b43444384374d32b90 GIT binary patch literal 9248 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 J? +#include +struct snake* add_snake(struct snake* snake, int x, int y) { + struct snake* head = calloc(1, sizeof(struct snake)); + head->x = x; + head->y = y; + head->next = snake; + return head; +} + +struct snake* remove_snake(struct snake* snake) { + if (snake == NULL || snake->next == NULL) { + free(snake); + return NULL; + } + struct snake* current = snake; + struct snake* prev = NULL; + while (current->next != NULL) { + prev = current; + current = current->next; + } + free(current); + current = NULL; + prev->next = NULL; + return snake; +} + + +void free_snake(struct snake* sn) { + while (sn != NULL) { + struct snake* next = sn->next; + free(sn); + sn = next; + } +} + +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); + int count = 0; + if (nx < 0 || nx >= st->width || ny < 0 || ny >= st->height) { + return END_WALL; + } + if (is_snake(st->snake->next, nx, ny)) { + return END_SNAKE; + } + for (int i = 0; i < FOOD_COUNT; i++) { + if (nx == st->foodx[i] && ny == st->foody[i]) { + count++; + st->snake = add_snake(st->snake, nx, ny); + st->foodx[i] = -1; + st->foody[i] = -1; + if (count == FOOD_COUNT) { + return END_FOOD; + } + } + } + st->snake = add_snake(st->snake, nx, ny); + st->snake = remove_snake(st->snake); + return END_CONTINUE; +} + + + + diff --git a/a2/snake.h b/a2/snake.h new file mode 100644 index 0000000..4d1ff74 --- /dev/null +++ b/a2/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/a2/snake.o b/a2/snake.o new file mode 100644 index 0000000000000000000000000000000000000000..c3bc42fe3d50c06cc86081226a339b9847328d59 GIT binary patch literal 7032 zcmbtZZ){W76~FJC35tTu4zm*jqPVknnW4vS+yjGg&1ZlSqmGA7C(&^ z9tNVtnfYSwUUBH|Fa2Qt6>`j@U$humjFuvcrJ;L8za!i&o^YcSEe*{_izf_}-+Q-` zDO#ABXLdap=A)&s5qJA(8kGCw%wKtOaSvLKKaq=JkKV#G+wE?NHKI5;d2 zwuoVXEky5x4U*@pYk3d=yHkck1~pT>lWbm8oBQPIRSGQ5EEaQ*ibD$zwqm*x>y11T z^)Hsf?%v2kuJ$G_&x6&X7+GauW|8H7Cua7w>ctT0SqWEfz7+1#eqW3{a%y5Fv66u9 zKy=|wA3{gVb^lcgDh(}0;~$g`UNvxnmS7i9v~b%Euovfgst|dsQ3{pb*#P=d z;2q%l9NH3sRDgOBEzCUTuy!s;|KM;TvZ%q5xqWZEL;=wf`wt1gDrZG$#Ztfb?q=ZQ zOcPJP0jQZ5yUKPOSAg0I9R2mDp|8m^AC9bMnl+-}7JeE_HQ7$vNj8?LrK4O z+OYDhOO&r)OBmKP>n3GXl(3Do$$E!@u^*6Nq*!kQCeg1Y8S~77)QTppqbhY2F=*Os z7?!FI#g2A-nh@s7vyM#;MZz`BI)aWo%2uPBwoa@CioMuD(`K&#i7RWdb?Y6D)8)DX z!UOjmv_LDRpsnZip)T7M613TmWli3##3#ZV#h!o)h1NvcC~Lz&&0R%yq)a9z=iWp_ zFgf=&XF|`zmJ2d2uI%hG(9*A z{BFpw-{XO~?eXA@Ft$|`yH@ZAO;y!R{%yHj6?#)4+x(VdELoWam=}JIN-~)Mx&qYp(B559nj|~O-dwT=j-NEg_u0ZFM zowLk+6Q*TmQgKjYnRs$vzGqkGt{s8Si9l!8PV9?=f9H5CJ8i|2nY5M8Wjk}$`IMFD zv}0qFW|qa%IjCwpolfLMKP^%pI)3~hJDV}jv5YyDK4($|mYJvJ4aQk0nVvF3XJV77 z&_OeM#!jCNoz3nJY>ubTP6xWT{C9gUn+Z*(#zGVEcnHcK*|no{GG*oRofB3r)ZHCQ zS@FqS!ek+Il!|z`kiB|L!d^%u%<-TQfD{CFxW9i-VDmw9EETh8(K>f-AxXTXEux3F z`oc-3<^9@PZ>@o^e>>p#gH3!T4m9{*)BEdd^ayx3wm!$q#3!k2f4yvfk?i6NDDAc| z3+{_#kK!opdVe{7mh9pNAnmSk&0!#;GT@oxW}khoz(RE`` z#XW2p{0mn_%3J=>mt*jI+f-4H{1U@Q!?_)nJsn{U`Aa`}4cPPqe?0P$|05^7d<)r4 zI9|E1iM59@3_s|9ig0=BD(|wT!-U??s@FmsB-qhwQgJ|)&kxAJ*i)j%XXIR{9^*wG zTBZVrFD8@t%_rcCPr(07^&>y7y5#AlPY~j;earawpMbwpf#cJbJQ#}&G31g>K4HZ1 z>c^>$CUQW$ayQ9epCvAN@i}9|a4JFQTSf2Wt^C%8Dsar(N%~O*f1TnLDGu~K1q4MsoTm?{T;i1bGzxG=c4w=<$x@ z&jukpK<;RL9h|5=4t&EE~a%gsOFLl(yF z(q#qbkM{?4{$Bx14E%2F)AvZMpj4Ukakhc&s05 zSL;s!rgCB+C&zCoMnz=_@Leu{7v=vL$)I6=JVVs{Ilz!p)(N6$Z;C&xF?K~sC{;OL z0`KMGH{xX&+6`wY_cBh7SHZGe{BJ0JeL2z*WSkt|quAQ{l$9J+!%7hi#=mWDj0vi!dNvPACvNm c0Rp+`{1_D4Qm4+p5lqX)U!wZe`K$5&1~Gn@RsaA1 literal 0 HcmV?d00001 diff --git a/a2/world.c b/a2/world.c new file mode 100644 index 0000000..a45c109 --- /dev/null +++ b/a2/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/a2/world.h b/a2/world.h new file mode 100644 index 0000000..e7a3fdb --- /dev/null +++ b/a2/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/a2/world.o b/a2/world.o new file mode 100644 index 0000000000000000000000000000000000000000..91f8be6807f0734749c4c3d081bb2d65f1dd29a1 GIT binary patch literal 18512 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 VizSYJWhTa!0%Ue*vOa5-k7# literal 0 HcmV?d00001