diff --git a/a2/snake.c b/a2/snake.c index 0da9cca..0665fe7 100644 --- a/a2/snake.c +++ b/a2/snake.c @@ -1,3 +1,26 @@ +#include +#include +#include + +#define WIDTH 20 +#define HEIGHT 20 +#define FOOD_COUNT 3 + +enum EndGame { END_WALL, END_SNAKE, END_FOOD, END_CONTINUE }; + +struct snake { + int x, y; + struct snake* next; +}; + +struct state { + int width, height; + int sx, sy; + struct snake* snake; + int foodx[FOOD_COUNT]; + int foody[FOOD_COUNT]; +}; + struct snake* add_snake(struct snake* old_head, int x, int y) { struct snake* new_head = (struct snake*) malloc(sizeof(struct snake)); new_head->x = x; @@ -55,3 +78,92 @@ int step_state(struct state* state) { return END_CONTINUE; } + +void initialize(struct state* state) { + state->width = WIDTH; + state->height = HEIGHT; + state->sx = 1; + state->sy = 0; + state->snake = add_snake(NULL, 5, 5); + + for (int i = 0; i < FOOD_COUNT; i++) { + state->foodx[i] = rand() % state->width; + state->foody[i] = rand() % state->height; + } +} + +void render(struct state* state) { + system("cls"); + + for (int y = 0; y < state->height; y++) { + for (int x = 0; x < state->width; x++) { + if (is_snake(state->snake, x, y)) { + printf("* "); + } else { + int food = 0; + for (int i = 0; i < FOOD_COUNT; i++) { + if (state->foodx[i] == x && state->foody[i] == y) { + printf("o "); + food = 1; + break; + } + } + if (!food) printf(". "); + } + } + printf("\n"); + } +} + +void handle_input(struct state* state) { + if (_kbhit()) { + char key = _getch(); + switch (key) { + case 'w': + state->sx = 0; state->sy = -1; + break; + case 's': + state->sx = 0; state->sy = 1; + break; + case 'a': + state->sx = -1; state->sy = 0; + break; + case 'd': + state->sx = 1; state->sy = 0; + break; + case 'q': + exit(0); + break; + default: + break; + } + } +} + +void game_loop(struct state* state) { + while (1) { + render(state); + handle_input(state); + int result = step_state(state); + if (result == END_WALL || result == END_SNAKE) { + printf("Game Over!\n"); + break; + } else if (result == END_FOOD) { + printf("You ate all the food! You win!\n"); + break; + } + + } +} + +void cleanup(struct state* state) { + free_snake(state->snake); +} + +int main() { + struct state game_state; + initialize(&game_state); + game_loop(&game_state); + cleanup(&game_state); + return 0; +}