#pragma once #include #include #include class Minesweeper : public Game { public: enum Difficulty { beginner, intermediate, expert }; public: Minesweeper(); ~Minesweeper() = default; bool Update(std::vector& events) override; private: void ProcessEventDuringPause(SDL_Event& event); void ProcessEventDuringResume(SDL_Event& event); void Reset(Difficulty Difficulty); void InitIsMineBitmap(int32_t mine_count); void InitAdjacentMineCounters(); void UncoverMines(); void Uncover(int32_t x, int32_t y); void ToggleFlag(int32_t x, int32_t y); bool IsCovered(int32_t x, int32_t y); bool IsFlagged(int32_t x, int32_t y); bool IsMine(int32_t x, int32_t y); V2F32 ScreenPosToViewPos(V2F32 screen_pos); private: void DrawBoard(); void DrawStartMenu(); private: static constexpr int32_t max_map_height = 32; static constexpr int32_t max_map_width = 32; private: Difficulty m_difficulty = beginner; float m_world_width = 4.0f; float m_world_height = 3.0f; int32_t m_grid_width; int32_t m_grid_height; V2F32 m_grid_pos; V2F32 m_cell_outer_size; V2F32 m_cell_inner_size; uint32_t m_is_covered_bitmap[max_map_height] {}; uint32_t m_is_flagged_bitmap[max_map_height] {}; uint32_t m_is_mine_bitmap[max_map_height] {}; int32_t m_adjacent_mine_counts[max_map_width * max_map_height] {}; Font m_font; };