diff --git a/a2/snake.c b/a2/snake.c index b1843df..9e5ec9a 100644 --- a/a2/snake.c +++ b/a2/snake.c @@ -1,58 +1,110 @@ -#include "snake.h" +#include "world.h" #include +#include +#include +#include +#include "snake.h" +// This file contains functions for drawing the the game and changing the state -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; +// 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; } -struct snake* remove_snake(struct snake* snake) { - if (snake == NULL) { - return NULL; +// 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); } - if (snake->next == NULL) { - free(snake); - return NULL; + 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; } - - struct snake* current = snake; - while (current->next->next != NULL) { - current = current->next; - } - - free(current->next); - current->next = NULL; - - return snake; + // Initial game vector + st->sx = 1; + st->sy = 0; } -void free_snake(struct snake* sn) { - struct snake* current = sn; - struct snake* next; - - while (current!= NULL) { - next = current->next; - free(current); - current = next; +// 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); } -} - -int is_snake(struct snake* snake,int x,int y){ - while (snake != NULL) { - if (snake->x == x && snake->y == y) { - return 1; + // 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); } - 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); - return END_CONTINUE; + +int main(int argc, char** argv){ + start_world(init_game,world_event,free); + return 0; }