46cf00d92e
* **New Features** * Added Mystify screensaver demo with animated polygons and trails * Added Snake game with multiple difficulties, high-score persistence, and multi-input (touch/keyboard) support * Added CLI tool for building, packaging, and deploying apps (end-to-end build/install/run workflow) * Per-grid-size high-score persistence added to 2048 app; expanded keyboard controls (WASD and device-specific mappings) * **Documentation** * Added Snake README with gameplay, controls, and usage instructions
98 lines
2.5 KiB
C
98 lines
2.5 KiB
C
/**
|
|
* @file SnakeLogic.h
|
|
* @brief Pure game logic for the Snake game (no UI dependencies)
|
|
*/
|
|
#ifndef SNAKE_LOGIC_H
|
|
#define SNAKE_LOGIC_H
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
|
|
/*********************
|
|
* INCLUDES
|
|
*********************/
|
|
#include "SnakeHelpers.h"
|
|
|
|
/***********************
|
|
* FUNCTION PROTOTYPES
|
|
**********************/
|
|
|
|
/**
|
|
* @brief Initialize the snake body as a linked list
|
|
* @param length Initial length of the snake
|
|
* @param start_x Starting x position (grid coordinate)
|
|
* @param start_y Starting y position (grid coordinate)
|
|
* @return Pointer to the head segment, or NULL on failure
|
|
*/
|
|
snake_segment_t* snake_init_body(uint16_t length, int16_t start_x, int16_t start_y);
|
|
|
|
/**
|
|
* @brief Free all memory used by the snake body
|
|
* @param head Pointer to the head segment
|
|
*/
|
|
void snake_free_body(snake_segment_t* head);
|
|
|
|
/**
|
|
* @brief Add a new segment to the tail of the snake
|
|
* @param head Pointer to the head segment
|
|
* @return true on success, false on allocation failure
|
|
*/
|
|
bool snake_grow(snake_segment_t* head);
|
|
|
|
/**
|
|
* @brief Move the snake one step in the current direction
|
|
* @param game Game state containing snake and direction
|
|
* @return true if move was successful, false if collision occurred
|
|
*/
|
|
bool snake_move(snake_game_t* game);
|
|
|
|
/**
|
|
* @brief Set the snake's next direction (with 180° reversal prevention)
|
|
* @param game Game state
|
|
* @param dir New direction
|
|
* @return true if direction was set, false if it would cause 180° reversal
|
|
*/
|
|
bool snake_set_direction(snake_game_t* game, snake_direction_t dir);
|
|
|
|
/**
|
|
* @brief Spawn food at a random location not occupied by snake
|
|
* @param game Game state
|
|
* @return true if food was placed, false if grid is full (win condition)
|
|
*/
|
|
bool snake_spawn_food(snake_game_t* game);
|
|
|
|
/**
|
|
* @brief Check if snake head collides with walls
|
|
* @param game Game state
|
|
* @return true if collision detected
|
|
*/
|
|
bool snake_check_wall_collision(snake_game_t* game);
|
|
|
|
/**
|
|
* @brief Check if snake head collides with its own body
|
|
* @param game Game state
|
|
* @return true if collision detected
|
|
*/
|
|
bool snake_check_self_collision(snake_game_t* game);
|
|
|
|
/**
|
|
* @brief Check if snake head collides with food
|
|
* @param game Game state
|
|
* @return true if collision detected
|
|
*/
|
|
bool snake_check_food_collision(snake_game_t* game);
|
|
|
|
/**
|
|
* @brief Count the number of segments in the snake
|
|
* @param head Pointer to the head segment
|
|
* @return Number of segments
|
|
*/
|
|
uint16_t snake_count_segments(snake_segment_t* head);
|
|
|
|
#ifdef __cplusplus
|
|
} /*extern "C"*/
|
|
#endif
|
|
|
|
#endif /*SNAKE_LOGIC_H*/
|