#include #include #include #include "grid.h" #include "snake.h" Grid *allocate_grid(int n, int m) { Grid *g = malloc(sizeof(Grid)); int i; if (!g) { fprintf(stderr, "Error: could not allocate Grid.\n"); exit(EXIT_FAILURE); } g->nbl = n; g->nbc = m; g->grid = malloc(n * sizeof(char *)); if (!g->grid) { fprintf(stderr, "Error: could not allocate g->grid.\n"); exit(EXIT_FAILURE); } for (i = 0; i < n; i++) { g->grid[i] = calloc(m + 1, sizeof(char)); if (!g->grid[i]) { fprintf(stderr, "Error: could not allocate row.\n"); exit(EXIT_FAILURE); } } return g; } void free_grid(Grid *g) { int i; if (!g) return; for (i = 0; i < g->nbl; i++) { free(g->grid[i]); } free(g->grid); free(g); } void debug(Grid *g) { int i; for (i = 0; i < g->nbl; i++) { printf("%s\n", g->grid[i]); } } int compute_size(Grid *g, int w, int h) { int size_width = w / g->nbc; int size_height = h / g->nbl; return (size_width < size_height) ? size_width : size_height; } void draw_grid(Grid *g) { int i, j; int window_width = MLV_get_window_width(); int window_height = MLV_get_window_height(); int cell_size = compute_size(g, window_width, window_height); MLV_draw_filled_rectangle(0, 0, window_width, window_height, MLV_COLOR_BLACK); for (i = 0; i < g->nbl; i++) { for (j = 0; j < g->nbc; j++) { int x = j * cell_size; int y = i * cell_size; switch (g->grid[i][j]) { case WALL: MLV_draw_filled_rectangle(x, y, cell_size, cell_size, MLV_COLOR_BROWN); break; case EMPTY: MLV_draw_filled_rectangle(x, y, cell_size, cell_size, MLV_COLOR_WHITE); break; case FRUIT: MLV_draw_filled_rectangle(x, y, cell_size, cell_size, MLV_COLOR_RED); break; case SNAKE: MLV_draw_filled_rectangle(x, y, cell_size, cell_size, MLV_COLOR_GREEN); break; default: MLV_draw_filled_rectangle(x, y, cell_size, cell_size, MLV_COLOR_BLACK); break; } } } } void place_snake(Grid *g, struct SnakeStruct *snake) { int i; for (i = 0; i < SNAKE_SIZE; i++) { Coord part = snake->pos[i]; g->grid[part.y][part.x] = 's'; } } Element move_snake(struct SnakeStruct *snake, Grid *g) { Coord tail = snake->pos[SNAKE_SIZE - 1]; Coord head; Element element_at_head; g->grid[tail.y][tail.x] = EMPTY; crawl(snake, g); head = snake->pos[0]; element_at_head = g->grid[head.y][head.x]; g->grid[head.y][head.x] = SNAKE; return element_at_head; } int count_nb_lines(FILE *stream) { int count = 0; char buffer[256]; while (fgets(buffer, sizeof(buffer), stream)) { count++; } rewind(stream); return count; } int count_fruits(FILE *stream, Grid *g) { int i, j, nb_fruit = 0; for (i = 0; i < g->nbl; i++) { if (!fgets(g->grid[i], g->nbc + 2, stream)) { fprintf(stderr, "Error: Stream does not contain enough lines\n"); exit(EXIT_FAILURE); } g->grid[i][strcspn(g->grid[i], "\n")] = '\0'; for (j = 0; j < g->nbc; j++) { if (g->grid[i][j] == FRUIT) { nb_fruit++; } } } return nb_fruit; } void copy(const char *src, char *dst) { int i = 0; while (src[i] != '\0' && src[i] != '\n') { dst[i] = src[i]; i++; } dst[i] = '\0'; }