Salut à tous, j'ai beaucoup travaillé depuis la dernière réponse postée, j'ai introduit une matrice et un environnement graphique 575*450 pour afficher un bonhomme qui se déplace, mais mon programme ne marche pas et je ne comprends pas pourquoi...
voici le code, il est un peu long, et on se place dans une matrice 24x18 et un terrain avec des murs :
[CODE début]
let direction = ref 0;;
(* on pose maintenant direction = 1 : vers le nord
direction = 2 : vers l'est
direction = 3 : vers le sud
direction = 4 : vers l'ouest *)
let mur_devant x y =
if (!direction = 0) & (m.(x).(y+1) = 0) then false
else if (!direction = 1) & (m.(x+1).(y) = 0) then false
else if (!direction = 2) & (m.(x).(y-1) = 0) then false
else if (!direction = 3) & (m.(x-1).(y) = 0) then false
else true
;;
(* un convertisseur de coordonnées cartésiennes -> graphiques*)
let conv x = 12 + 25*x;;
let compteur = ref 0;;
let pivote_a_gauche =
compteur := !compteur - 1;
if !direction = 0 then direction := 3 else direction := !direction - 1;
;;
let pivote_a_droite =
direction := (!direction + 1) mod 4;
compteur := !compteur + 1
;;
let tour_pledge (x,y) =
set_color red;
if !direction = 0 then
(fill_circle (conv(x)) (conv(y+1)) 3; if (!compteur <> 0) & (not mur_devant (x-1) (y-1)) then pivote_a_gauche)
else if !direction = 1 then
(fill_circle (conv(x+1)) (conv(y)) 3; if (!compteur <> 0) & (not mur_devant (x-1) (y+1)) then pivote_a_gauche)
else if !direction = 2 then
(fill_circle (conv(x)) (conv(y-1)) 3; if (!compteur <> 0) & (not mur_devant (x+1) (y+1)) then pivote_a_gauche)
else (fill_circle (conv(x-1)) (conv(y)) 3; if (!compteur <> 0) & (not mur_devant (x+1) (y-1)) then pivote_a_gauche)
;;
let pledge (x,y) =
let u = ref x and v = ref y in
let direction = ref 0 in
while (!u,!v) <> (22,3) & (not mur_devant !u !v) do
(set_color red; v := !v + 1; fill_circle (conv(!u)) (conv(!v)) 3; read_key ())
done;
while (!u,!v) <> (22,3) do
if (mur_devant !u !v) then (pivote_a_droite; read_key ())
else ( if !direction = 0 then v := !v + 1
else if !direction = 1 then u := !u + 1
else if !direction = 2 then v := !v - 1
else if !direction = 3 then u := !u - 1;
tour_pledge (!u,!v);
read_key ()
)
done;
;;
[FIN CODE]
Le petit point rouge ne sait pas tourner... :'(