diff --git a/a2/snake.c b/a2/snake.c new file mode 100644 index 0000000..0a7d47a --- /dev/null +++ b/a2/snake.c @@ -0,0 +1,132 @@ +#include "snake.h" +#include +#include +#include + +#define WIDTH 20 +#define HEIGHT 10 + +void initialize_food(int foodx[], int foody[]) { + srand(time(NULL)); + for (int i = 0; i < FOOD_COUNT; i++) { + foodx[i] = rand() % WIDTH; + foody[i] = rand() % HEIGHT; + } +} + +void print_world(struct state* state) { + for (int y = 0; y < HEIGHT; y++) { + for (int x = 0; x < WIDTH; x++) { + if (is_snake(state->snake, x, y)) { + printf("x"); + } else { + int food_found = 0; + for (int i = 0; i < FOOD_COUNT; i++) { + if (state->foodx[i] == x && state->foody[i] == y) { + if (state->foodx[i] >= 0 && state->foody[i] >= 0) { + printf("*"); + } else { + printf(" "); + } + food_found = 1; + break; + } + } + if (!food_found) { + printf(" "); + } + } + } + printf("\n"); + } +} + +void move_snake(struct state* state, int dx, int dy) { + // Update snake position according to the direction + int new_x = state->snake->x + dx; + int new_y = state->snake->y + dy; + + // Check if the new position is out of bounds + if (new_x < 0 || new_x >= WIDTH || new_y < 0 || new_y >= HEIGHT) { + printf("Snake hit the wall!\n"); + exit(EXIT_SUCCESS); + } + + // Check if the new position is on the snake + if (is_snake(state->snake, new_x, new_y)) { + printf("Snake hit itself!\n"); + exit(EXIT_SUCCESS); + } + + // Check if the new position is on food + for (int i = 0; i < FOOD_COUNT; i++) { + if (state->foodx[i] == new_x && state->foody[i] == new_y) { + state->foodx[i] = -1; + state->foody[i] = -1; + // Grow the snake + struct snake* new_head = add_snake(state->snake, new_x, new_y); + if (new_head == NULL) { + printf("Memory allocation failed!\n"); + exit(EXIT_FAILURE); + } + state->snake = new_head; + return; + } + } + + // Move the snake + struct snake* new_head = add_snake(state->snake, new_x, new_y); + if (new_head == NULL) { + printf("Memory allocation failed!\n"); + exit(EXIT_FAILURE); + } + state->snake = new_head; + remove_snake(state->snake); +} + +int main() { + // Initialize game state + struct state game_state; + game_state.snake = add_snake(NULL, WIDTH / 2, HEIGHT / 2); + if (game_state.snake == NULL) { + printf("Memory allocation failed!\n"); + return EXIT_FAILURE; + } + game_state.width = WIDTH; + game_state.height = HEIGHT; + game_state.sx = 1; + game_state.sy = 0; + initialize_food(game_state.foodx, game_state.foody); + + // Main game loop + while (1) { + system("clear"); // Clear the console + print_world(&game_state); + + // Check if all food is eaten + int food_eaten = 1; + for (int i = 0; i < FOOD_COUNT; i++) { + if (game_state.foodx[i] >= 0 && game_state.foody[i] >= 0) { + food_eaten = 0; + break; + } + } + if (food_eaten) { + printf("All food eaten! You win!\n"); + break; + } + + // Move the snake according to the direction + move_snake(&game_state, game_state.sx, game_state.sy); + + // Delay for a short time to slow down the game + // Adjust this value to change the game speed + usleep(200000); // 200 milliseconds + } + + // Free memory + free_snake(game_state.snake); + + return EXIT_SUCCESS; +} +