Posté 03 mars 2010 - 02:24
Ok, bon, j'ai fais ça rapidement :
exception S
open Robot
type dir = Avant | Gauche | Droite | Arriere
let inv = function
| Gauche -> Droite
| Droite -> Gauche
| e -> e
let tourelle() =
let pred() = regarde () = Vide || regarde() = Sortie || regarde() = Caillou in
let l = if pred() then [(Avant, regarde())] else [] in
gauche();
let l = if pred() then (Gauche, regarde())::l else l in
droite(); droite();
let l = if pred() then (Droite, regarde())::l else l in
gauche();
l
let rec tourne (dir, e) =
let caillou() = prend(); tourne (Arriere, Vide); pose(); tourne(Arriere, Vide) in
begin
match dir with
| Gauche -> gauche()
| Droite -> droite()
| Avant -> ()
| Arriere -> gauche(); gauche();
end;
if e = Caillou then caillou()
let go (dir, e) = tourne(dir, e); avance()
let rec loop path =
begin
match path with
| None -> ()
| Some(d, e) ->
go(d, e)
end;
let l = tourelle() in
(* Si on a trouvé la sortie *)
if List.exists (fun (_, b) -> b = Sortie) l then
begin
tourne (List.find (fun (_, b) -> b = Sortie) l);
ouvre();
raise S
end
else
(* Si on est dans une impasse, on revient sur ses pas *)
if l = [] then go(Arriere, Vide)
else List.iter (fun (d, e) -> loop (Some(d, e))) l ;
(* Lorsque qu'on a finit d'explorer une zone on retourne sur ses pas pour explorer les autres*)
match path with
| None -> ()
| Some (d, e) -> go (d, e)
let fourmi =
try loop None with S -> ()
[/code]
Il regarde les chemins libres, et les empreinte jusqu'a la porte.
Evidemment, ça ne marche pas tout le temps, car il revient sur ces pas parfois :).
Je ferais une version un peu plus évoluée ce soir ou demain :).
A+
PS : elle est moche la coloration ocaml.