Added boosts system which change the snake speed
This commit is contained in:
51
game.c
51
game.c
@@ -7,7 +7,7 @@
|
|||||||
#include "grid.h"
|
#include "grid.h"
|
||||||
#include "snake.h"
|
#include "snake.h"
|
||||||
|
|
||||||
#define DIFFICULTY 6
|
#define BASE_SPEED 6
|
||||||
|
|
||||||
void print_help()
|
void print_help()
|
||||||
{
|
{
|
||||||
@@ -35,6 +35,12 @@ int main(int argc, char *argv[])
|
|||||||
int current_level = 1;
|
int current_level = 1;
|
||||||
int global_score = 0;
|
int global_score = 0;
|
||||||
int previous_score = 0;
|
int previous_score = 0;
|
||||||
|
int speed = BASE_SPEED;
|
||||||
|
int boosts = 0;
|
||||||
|
int boost_spawn_timer = 0;
|
||||||
|
int boost_spawn_interval = 0;
|
||||||
|
int boost_duration = 0;
|
||||||
|
const int boost_duration_frames = 5 * 24;
|
||||||
|
|
||||||
Grid *g;
|
Grid *g;
|
||||||
|
|
||||||
@@ -152,9 +158,27 @@ int main(int argc, char *argv[])
|
|||||||
char stats[256];
|
char stats[256];
|
||||||
MLV_clear_window(MLV_COLOR_BLACK);
|
MLV_clear_window(MLV_COLOR_BLACK);
|
||||||
|
|
||||||
loop_count = (loop_count + 1) % DIFFICULTY;
|
loop_count = (loop_count + 1) % speed;
|
||||||
if (loop_count == 0)
|
if (loop_count == 0)
|
||||||
{
|
{
|
||||||
|
if (boost_spawn_timer >= boost_spawn_interval)
|
||||||
|
{
|
||||||
|
int x, y;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
x = rand() % g->nbc;
|
||||||
|
y = rand() % g->nbl;
|
||||||
|
} while (g->grid[y][x] != EMPTY);
|
||||||
|
|
||||||
|
g->grid[y][x] = BOOST;
|
||||||
|
boost_spawn_timer = 0;
|
||||||
|
boost_spawn_interval = 50 + rand() % BASE_SPEED;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
boost_spawn_timer++;
|
||||||
|
}
|
||||||
|
|
||||||
result = move_snake(snake, g);
|
result = move_snake(snake, g);
|
||||||
|
|
||||||
if (result == WALL || result == SNAKE)
|
if (result == WALL || result == SNAKE)
|
||||||
@@ -173,6 +197,14 @@ int main(int argc, char *argv[])
|
|||||||
global_score = previous_score;
|
global_score = previous_score;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
else if (result == BOOST)
|
||||||
|
{
|
||||||
|
boosts++;
|
||||||
|
boost_duration = boost_duration_frames;
|
||||||
|
speed = BASE_SPEED - boosts;
|
||||||
|
speed = (BASE_SPEED - boosts) > 1 ? (BASE_SPEED - boosts) : 1;
|
||||||
|
printf("Boost collected! Speed increased. Boost duration: %d frames\n", boost_duration);
|
||||||
|
}
|
||||||
else if (result == FRUIT)
|
else if (result == FRUIT)
|
||||||
{
|
{
|
||||||
Position *tail = snake->segments_list;
|
Position *tail = snake->segments_list;
|
||||||
@@ -203,11 +235,22 @@ int main(int argc, char *argv[])
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (boost_duration > 0)
|
||||||
|
{
|
||||||
|
boost_duration--;
|
||||||
|
if (boost_duration == 0)
|
||||||
|
{
|
||||||
|
boosts--;
|
||||||
|
speed = (BASE_SPEED - boosts) > 1 ? (BASE_SPEED - boosts) : 1;
|
||||||
|
printf("Boost expired. Speed reset. Active boosts: %d\n", boosts);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
draw_grid(g);
|
draw_grid(g);
|
||||||
|
|
||||||
snprintf(stats, sizeof(stats),
|
snprintf(stats, sizeof(stats),
|
||||||
"Level: %d | Fruits Left: %d/%d | Score: %d | Snake Size: %d",
|
"Level: %d | Fruits Left: %d/%d | Score: %d | Snake Size: %d | Boosts: %d",
|
||||||
current_level, nb_fruit, total_fruits, global_score, snake->size);
|
current_level, nb_fruit, total_fruits, global_score, snake->size, boosts);
|
||||||
MLV_draw_text(10, height - 20, stats, MLV_COLOR_WHITE);
|
MLV_draw_text(10, height - 20, stats, MLV_COLOR_WHITE);
|
||||||
|
|
||||||
MLV_actualise_window();
|
MLV_actualise_window();
|
||||||
|
|||||||
17
grid.c
17
grid.c
@@ -69,11 +69,12 @@ void draw_grid(Grid *g)
|
|||||||
int window_width = MLV_get_window_width();
|
int window_width = MLV_get_window_width();
|
||||||
int window_height = MLV_get_window_height();
|
int window_height = MLV_get_window_height();
|
||||||
int cell_size = compute_size(g, window_width, window_height);
|
int cell_size = compute_size(g, window_width, window_height);
|
||||||
MLV_Image *image_wall, *image_fruit, *image_snake, *image_empty;
|
MLV_Image *image_wall, *image_fruit, *image_snake, *image_snake_head, *image_boost, *image_empty;
|
||||||
image_wall = MLV_load_image("./assets/wall.png");
|
image_wall = MLV_load_image("./assets/wall.png");
|
||||||
image_fruit = MLV_load_image("./assets/fruit.png");
|
image_fruit = MLV_load_image("./assets/fruit.png");
|
||||||
image_snake = MLV_load_image("./assets/snake.png");
|
image_snake = MLV_load_image("./assets/snake.png");
|
||||||
image_snake_head = MLV_load_image("./assets/snake_head.png");
|
image_snake_head = MLV_load_image("./assets/snake_head.png");
|
||||||
|
image_boost = MLV_load_image("./assets/boost.png");
|
||||||
image_empty = MLV_load_image("./assets/grass.png");
|
image_empty = MLV_load_image("./assets/grass.png");
|
||||||
if (image_wall != NULL)
|
if (image_wall != NULL)
|
||||||
{
|
{
|
||||||
@@ -91,6 +92,10 @@ void draw_grid(Grid *g)
|
|||||||
{
|
{
|
||||||
MLV_resize_image_with_proportions(image_snake_head, cell_size, cell_size);
|
MLV_resize_image_with_proportions(image_snake_head, cell_size, cell_size);
|
||||||
}
|
}
|
||||||
|
if (image_boost != NULL)
|
||||||
|
{
|
||||||
|
MLV_resize_image_with_proportions(image_boost, cell_size, cell_size);
|
||||||
|
}
|
||||||
if (image_empty != NULL)
|
if (image_empty != NULL)
|
||||||
{
|
{
|
||||||
MLV_resize_image_with_proportions(image_empty, cell_size, cell_size);
|
MLV_resize_image_with_proportions(image_empty, cell_size, cell_size);
|
||||||
@@ -158,6 +163,16 @@ void draw_grid(Grid *g)
|
|||||||
MLV_draw_image(image_snake_head, x, y);
|
MLV_draw_image(image_snake_head, x, y);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case BOOST:
|
||||||
|
if (image_boost == NULL)
|
||||||
|
{
|
||||||
|
MLV_draw_filled_rectangle(x, y, cell_size, cell_size, MLV_COLOR_YELLOW);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
MLV_draw_image(image_boost, x, y);
|
||||||
|
}
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
MLV_draw_filled_rectangle(x, y, cell_size, cell_size, MLV_COLOR_BLACK);
|
MLV_draw_filled_rectangle(x, y, cell_size, cell_size, MLV_COLOR_BLACK);
|
||||||
break;
|
break;
|
||||||
|
|||||||
Reference in New Issue
Block a user