Posté 03 mars 2010 - 02:24 
					
				
				
				
					Ok, bon, j'ai fais ça rapidement : 
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.