-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathControler.c
165 lines (148 loc) · 5.16 KB
/
Controler.c
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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
#include <stdlib.h>
#include <stdio.h>
#include "bool.h"
#include "Labyrinthe.h"
#include "Controler.h"
#include "utils.h"
/**
* Retourne une postion suivant une position et une direction donnée.
* Exemple : compute_next_position( {1,3}, droite) -> {1,4}
* Note : Fait pour l'utilisation matricielle donc haut et bas sont inversés automatiquement.
* @param startpos la position initiale
* @param dir la direction
* @return position calcule
*/
pos_t compute_next_position(pos_t startpos, Direction_e dir) {
pos_t ret;
if (dir == haut) {
ret.ligne = startpos.ligne - 1;
ret.colone = startpos.colone;
} else if (dir == droite) {
ret.ligne = startpos.ligne;
ret.colone = startpos.colone + 1;
} else if (dir == bas) {
ret.ligne = startpos.ligne + 1;
ret.colone = startpos.colone;
} else if (dir == gauche) {
ret.ligne = startpos.ligne;
ret.colone = startpos.colone - 1;
}
return ret;
}
/**
* Calcul recursif de la validite d'un chemin.
* @param startpos position initiale
* @param dir direction du deplacement
* @param jp pointeur sur le jeu
* @return true si le chemin arrive a la position finale du jeu.
*/
bool calcul_du_chemin_rec(pos_t startpos, Direction_e dir, Jeu_t* jp) {
pos_t next_pos = compute_next_position(startpos, dir);
/*printf("nextpos %s\n", pos_str(next_pos, buff));*/
/*printf("dir : %s\n", direction_str(dir));*/
piece_t curr_piece;
if (estcompris(startpos.ligne, 0, JEU_HAUTEUR - 1)) {
curr_piece = Jeu_get_piece(jp, startpos);
curr_piece.higthligth = true;
Jeu_set_piece(jp, startpos, curr_piece);
}
if (position_compare(next_pos, jp->end_pos) == 0) { // Le jeu est finit
/*printf("GG\n");*/
return true;
}
if (next_pos.ligne < 0) { // on essaye de se deplacer hors du tableau
/*printf("limitpos_min\n");*/
return false;
}
if (next_pos.colone < 0) { // on essaye de se deplacer hors du tableau
/*printf("limitpos_min\n");*/
return false;
}
if (next_pos.ligne >= JEU_LARGEUR) {// on essaye de se deplacer hors du tableau
/*printf("limitpos_max\n");*/
return false;
}
if (next_pos.colone >= JEU_HAUTEUR) {// on essaye de se deplacer hors du tableau
/*printf("limitpos_max\n");*/
return false;
}
piece_t new_piece = Jeu_get_piece(jp, next_pos);
/*printf("new piece : %s\n", piece_str(new_piece, buff));*/
Direction_e next_dir;
if (piece_est_croisement(new_piece)) { //on fait a la main le cas d'une piece croisement
if (dir == haut) {
new_piece.higthligth_vertical = true;
next_dir = haut;
} else if (dir == droite) {
new_piece.higthligth_horizontal = true;
next_dir = droite;
} else if (dir == bas) {
new_piece.higthligth_vertical = true;
next_dir = bas;
} else if (dir == gauche) {
new_piece.higthligth_horizontal = true;
next_dir = gauche;
}
Jeu_set_piece(jp, next_pos, new_piece);
} else {
Direction_e reverse_dir = direction_reverse(dir);
piece_t onedir_piece = piece_remove_dir(new_piece, reverse_dir);
/*printf("onedir piece : %s\n", piece_str(onedir_piece, buff));*/
next_dir = piece_as_Dir(onedir_piece);
}
if (estcompris(startpos.ligne, 0, JEU_HAUTEUR - 1) && !pieces_compatibles(curr_piece, new_piece, dir)) {
/*printf("incompatible : estcompris : %i, pieces_compatibles : %i\n", estcompris(startpos.ligne, 0, JEU_HAUTEUR - 1), pieces_compatibles(curr_piece, new_piece, dir));*/
return false;
}
/*printf("next dir : %s \n", direction_str(next_dir));*/
/*printf("------------\n\n");*/
return calcul_du_chemin_rec(next_pos, next_dir, jp);
}
/**
* Lance le calcul recursif de la validite d'un chemin sur un jeu.
* @param jp le pointeur sur le jeu
* @return
*/
bool inline calcul_du_chemin(Jeu_t* jp) {
Jeu_reset_higthligth(jp);
return calcul_du_chemin_rec(jp->start_pos, bas, jp);
}
/**
* Lit stdin et effectue les actions necessaire.
* @param jp le pointeur sur le jeu
* @return une Direction . 0 si aucune dirrection a ete parsée.
*/
Direction_e parse_stdin(Jeu_t *jp) {
char buffer[1];
scanf("%c", buffer);
scanf("%*[^\n]s");
getchar();
switch (*buffer) {
case '8':
return haut;
case '6':
return droite;
case'2':
return bas;
case '4':
return gauche;
case '0':
printf("A bientot :)\n");
fflush(stdout); //force print avant
exit(EXIT_SUCCESS);
case '1':
Jeu_init(jp, ALL_PIECE, START_POS, END_POS);
return -1;
}
return 0;
}
/**
* Verification si deplacement possible.
* @param dir la direction
* @param jp le pointeur sur le jeu
* @return true si le deplacement est possible
*/
inline bool deplacement_possible(Direction_e dir, Jeu_t* jp) {
pos_t next_pos = compute_next_position(jp->piece_noire_pos, dir);
return estcompris(next_pos.ligne, 0, JEU_HAUTEUR - 1) && estcompris(next_pos.colone, 0, JEU_LARGEUR - 1);
}