let est_rajoutable ~piece ~i ~j ~pl =
myprint myverb ("Appel a 'est_rajoutable'. Indices : i="^(string_of_int i)^" et j="^(string_of_int j)^" !");
(** Ici les 4 couleurs de '~pi' sont donc toutes des couleurs admissibles pour le plateau courant. Et l'indice i (resp. j) est entre 0 et m-1 (resp. n-1). *) |
let (c, n, m, p) = (pl.c, pl.n, pl.m, pl.p) in
let result = ref true in
match p.(i).(j) with
| Some _ ->
(** On essaie ici de rajouter une piece '~pi' sur une case déjà remplie de notre tableau, *) |
(* raise Case_deja_occupee;*)
print_string "\tException non lancée : Case_deja_occupee";
myprint myverb "\tResultat renvoyé : false";
false;
| None ->
(** là on tente de mettre une pièce sur une case libre. Il faut vérifier que cette pièce ne contredit pas les 4 (ou moins) relations de satisfaisabilité horizontales (avec la pièce à gauche et à droite), et verticales (avec la pièce en bas et en haut. *) |
(** Il y a plusieurs cas où on a différents nombres de compatibilité à vérifier. *) |
if (i > 0) then
(** on peut comparer à gauche, *) |
result := !result && (compatible_h_option p.(i-1).(j) (Some piece));
if (j > 0) then
(** on peut comparer en bas, *) |
result := !result && (compatible_v_option p.(i).(j-1) (Some piece));
if (i < m-1) then
(** on peut comparer à droite, *) |
result := !result && (compatible_h_option (Some piece) p.(i+1).(j));
if (j < n-1) then
(** on peut comparer en haut, *) |
result := !result && (compatible_v_option (Some piece) p.(i).(j+1));
(** On fait le "ET" des quatres résultats de ces tests, avec un "true" initialement, cela permet de dire que le résultat final est vrai ssi chaque test est vrai. *) |
myprint myverb ("\tResultat renvoyé : "^(string_of_bool !result));
!result