#pragma once #include #include #include #include #include #include #include using std::deque; using std::string; using std::array; using std::vector; using std::cin; using std::cout; #define FPS 15 #define SCREEN 800 #define LINE_W 2 #define IMG_COUNT 2 enum tile {empty = 0, p1 = 1, p2 = 2, tie = 3}; #define OKAY -1 #define CHANGE -2 tile act(int t); tile pas(int t); Color col(int t); struct Block { tile t = empty; int depth; Rectangle place; array sons; Block() {} Block(int _depth, Rectangle trg); Rectangle get_son_rectangle(int son); int set(tile pl); bool playable(deque v); int play(deque v, tile pl); bool check_tie(); tile update(); Rectangle getRect(deque v); void updateRect(Rectangle trg); void save(vector *r); void load_state(vector state, int pos); void undo(deque &prev); }; void update(Block* root, int time, deque &turn); void undo(Block *root, deque &prev, int time); bool valid(Block* root, Rectangle play_area, deque &turn); class Renderer { array textures; Block *root; void prepareTextures(); public: void renderImage(tile t, Rectangle dst, Color color = WHITE); void render_all(Block* root, int time, Rectangle play_area, deque highlight = {}); void render_block(Block *b); int update_board_size(int depth); void prepare_screen(Block* root, int time, Rectangle dst); };