sliding-puzzle/board.h

80 lines
1.8 KiB
C++

#pragma once
#include <SFML/Graphics/RenderWindow.hpp>
#include <SFML/Graphics/RectangleShape.hpp>
#include <SFML/Graphics/VertexArray.hpp>
#include <SFML/Graphics/Texture.hpp>
#include <SFML/Graphics/Sprite.hpp>
#include <array>
using pos = std::pair<int, int>;
enum class DIRECTION
{
UP,
DOWN,
RIGHT,
LEFT,
NONE
};
//////////////////////////////////
class Board
{
public:
explicit Board();
~Board();
// Set play image
bool init(const std::string& path, int splitting, const sf::RenderWindow& window);
// Output current graphical state on application window
void draw(sf::RenderWindow& window);
// Move cursor to next tile by given direction
bool moveSelection(const DIRECTION& direction);
// Go to or leave from selection mode
void onSelectionMode();
// Did player win the game
bool isWinCondition() const;
// Show or hide selection cursos
void setCursorVisibility(bool visible = false);
private:
// Game tile
struct Cell
{
std::vector<Cell*>::size_type inital_index;
std::vector<Cell*>::size_type current_index;
sf::Sprite *sprite;
static int side_length;
};
using Cells = std::vector<Cell*>;
sf::RectangleShape rect_filling;
sf::VertexArray rect_selection;
Cells::size_type selection_index;
Cells::size_type cells_on_width; // amount of cells on horizontal side of board
Cells::size_type cells_on_height; // amount of cells on vertical side of board
Cells vec_field;
Cells::size_type solved_tiles; // amount of tiles placed on initial positions
sf::Texture global_texture;
bool on_selection;
bool is_cursor_visible;
void swapCells(Cells::size_type curr_index, Cells::size_type swap_index);
// Draw selection cursor on given tile
void setSelectionVertex(Cells::size_type index);
};