#pragma once #include "Effect.h" #include "prototypes.h" #define SNAKE_DIR_NORTH 0 #define SNAKE_DIR_EAST 1 #define SNAKE_DIR_SOUTH 2 #define SNAKE_DIR_WEST 3 class SnakeEffect : public Effect { private: Coords _pos; Coords _apple; int8_t _dir = SNAKE_DIR_NORTH; uint8_t* _map; uint16_t _pixels; uint8_t _length; unsigned long _last_apple_at; unsigned long _last_move_at; // 204.6 points, length 35, 58% stopped, 42% dead float _weights[18] = {0.8613356309729567, 0.1010670216231977, -0.03801953620401166, 0.7556556498067926, -0.9925124063206012, 0.6375227768823608, 0.7216340201735381, 0.5557451907997892, 0.03496949604344035, 0.7238725631217913, 0.9070987343528141, 0.6518810721526125, -0.17322587217593544, -0.7726195238221361, 0.8044226332955624, 0.8434782354002677, 0.8508760698750302, 0.47735675603010397}; uint16_t _xy2i(uint8_t x, uint8_t y); uint16_t _xy2i(Coords c); Coords _i2xy(uint16_t i); Coords _new_pos(uint8_t dir); uint8_t _dying = 0; bool _is_free(uint8_t dir); uint8_t _free_spaces(uint8_t dir); uint8_t _to_apple(uint8_t dir); void _place_apple(); void _init(); void _decide(); int8_t _manual_decision(); void _move(); void _draw(); public: SnakeEffect(); ~SnakeEffect(); void loop(uint16_t ms); boolean can_be_shown_with_clock(); String get_name() override { return "snake"; } };