open Graphics
let pas = 60
let rayon = pas/2 - 2
let () =
open_graph " 900x600";
set_window_title "Caml Same";
set_color black;
fill_rect 0 0 900 600
type couleur = Rouge | Bleu | Jaune | Rien
let couleur_aleatoire () = match Random.int 3 with
| 0 -> Rouge
| 1 -> Bleu
| 2 -> Jaune
| _ -> assert false
let grille =
Array.init 15 (fun _ -> Array.init 10 (fun _ -> couleur_aleatoire ()))
let couleur i j =
if i >= 0 && i < 15 && j >= 0 && j < 10 then grille.(i).(j) else Rien
let dessine () =
for i = 0 to 14 do
for j = 0 to 9 do
set_color
(match grille.(i).(j) with
| Rouge -> red
| Bleu -> blue
| Jaune -> yellow
| Rien -> black);
fill_circle (pas * i + pas/2) (pas * j + pas/2) rayon
done
done
let tasse_tableau garde t =
let n = Array.length t in
let swap i j = let tmp = t.(i) in t.(i) <- t.(j); t.(j) <- tmp in
let d = ref 0 in (* première place disponible *)
for i = 0 to n - 1 do
if garde t.(i) then begin swap i !d; incr d end
done
let tasse () =
for i = 0 to 14 do
tasse_tableau (fun c -> c <> Rien) grille.(i)
done;
tasse_tableau (fun c -> c.(0) <> Rien) grille
let score = ref 0
let supprime_region c i j =
let s = ref 0 in
let rec enleve i j =
if couleur i j = c then begin
incr s;
grille.(i).(j) <- Rien;
enleve (i+1) j;
enleve (i-1) j;
enleve i (j+1);
enleve i (j-1)
end
in
enleve i j;
score := !score + (!s - 2) * (!s - 2);
dessine ();
tasse ();
dessine ()
let click i j =
let c = couleur i j in
if c <> Rien && (couleur (i-1) j = c || couleur (i+1) j = c ||
couleur i (j-1) = c || couleur i (j+1) = c)
then
supprime_region c i j
let plus_de_region () =
try
for i = 0 to 13 do
for j = 0 to 8 do
let c = grille.(i).(j) in
if c <> Rien && (c = grille.(i+1).(j) || c = grille.(i).(j+1)) then
raise Exit
done
done;
true
with Exit ->
false
let fini () =
if grille.(0).(0) = Rien then begin
score := !score + 1000; true
end else
plus_de_region ()
let () =
dessine ();
while true do
let st = wait_next_event [Key_pressed; Button_down] in
if st.keypressed then exit 0;
if st.button then begin
let st = wait_next_event [Button_up] in
let dx = st.mouse_x mod pas - pas/2 in
let dy = st.mouse_y mod pas - pas/2 in
if dx * dx + dy * dy <= rayon * rayon then begin
let i = st.mouse_x / pas in
let j = st.mouse_y / pas in
click i j;
if fini () then begin
Printf.printf "score = %d\n" !score; flush stdout;
ignore (read_key ());
exit 0
end
end
end
done