-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathgrille.hpp
123 lines (98 loc) · 2.93 KB
/
grille.hpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
#include <iostream>
#include <set>
#include <map>
#include <stack>
#include <vector>
#include <queue>
#include <iterator>
#include <algorithm>
#include "permutation.cpp"
#include "raylib.h"
#define DEFAULT_HEIGHT_GRID 8
#define DEFAULT_WIDTH_GRID 6
#define MAX_HEIGHT 1000
#define MAX_WIDTH 1000
#define COORD(x,y, height) ((x)*(height)+(y))
enum couleur {
COLOR_RED,
COLOR_YELLOW,
COLOR_PINK,
COLOR_BLUE,
COLOR_GREEN,
COLOR_ORANGE,
NUMBER_COLOR
};
enum direction {
DIR_UP,
DIR_LEFT,
DIR_DOWN,
DIR_RIGHT
};
/*
-------------------> x
|
|
|
|
|
v
y
*/
typedef std::pair<unsigned short, unsigned short> coord;
/* cc pour "composante connexe" */
struct cc {
int size;
enum couleur couleur;
std::set<coord> elements;
};
class Grille
{
private:
struct cc **m_grid;
unsigned short m_height, m_width;
std::set<struct cc*> m_list_cc;
void addElement(struct cc *c, unsigned short x, unsigned short y);
void remElement(struct cc *c, unsigned short x, unsigned short y);
struct cc *newCc(enum couleur couleur);
void swap_cells(coord p1, coord p2);
std::queue<coord> *remplissage_file(struct cc *c, enum direction dir);
public:
Grille();
Grille(unsigned short width, unsigned short height);
Grille(const Grille &grille);
bool isInCc(struct cc *c, unsigned short x, unsigned short y); //test whether a cell is in a particular cc
struct cc *getCc(unsigned short x, unsigned short y);
struct cc *doUnion(struct cc *c1, struct cc *c2);
bool decoupeConnex(struct cc *c); //renvoie si la cc était connexe au départ au non
void newCc(unsigned short x, unsigned short y, enum couleur couleur);
std::pair<coord, coord> min_max_cc(struct cc *c);
bool is_in_grid(coord const &coord);
//(m_width, m_height)
coord getDimGrid();
/*
Fait le déplacement d'un bloc.
Renvoie une structure contenant:
- un code de retour
-> RET_OK : le bloc est bougé
-> RET_NOTHING : aucun candidat potentiel
-> RET_SPLITTING : on coupe forcément un bloc trop gros
- En cas de RET_OK, un pointeur vers la nouvelle grille (on devra libérer l'une des grilles)
- En cas de RET_OK, une grille allouée contenant des coordonnées contenant les nouvelles coord de chaque point par rapport à la première grille
-> devrait être libéré après
*/
struct retMoveBlock moveBlock(unsigned short x, unsigned short y, enum direction direction); //gros wrapper pour bouger un bloc.
unsigned short get_score();
~Grille();
};
struct retMoveBlock {
enum retType {
RET_OK,
RET_NOTHING,
RET_SPLITTING
} rettype;
Grille *new_grille;
//permet d'avoir la trace des déplacements effectués
std::map<coord,coord> *deplacements;
};
std::pair<short, short> dir_to_delta(enum direction dir);
void printGrid(Grille &grille);