ocaml-toys / maze / gfx.ml

let pixel = 16

let load_maze maze name = 
  Graphics.set_window_title ("Maze solver - " ^ name);
  let width = Maze.width maze and height = Maze.height maze in
  Graphics.resize_window (width*pixel) (height*pixel);
  let gray = Graphics.rgb 150 150 150 in
  for x = 0 to width -1 do
    for y = 0 to height - 1 do
      let tile = Maze.get maze (x, y) in
      let color = match tile with
        | '@' -> Graphics.red
        | 'X' -> Graphics.green
        | '#' -> gray
        | _ -> Graphics.white
      in
      Graphics.set_color color;
      Graphics.fill_rect (x*pixel) ((height-1-y)*pixel) pixel pixel;
      Graphics.set_color gray;
      Graphics.draw_rect (x*pixel) ((height-1-y)*pixel) pixel pixel;
    done
  done 

let draw_dot maze (x, y) = 
  let shift = pixel / 2 in
  let half = shift / 2 in
  let height = Maze.height maze in
  if Maze.get maze (x, y) <> '#' then Graphics.fill_rect 
    (x*pixel + half) ((height-y-1)*pixel + half) shift shift

let walk maze path =
  Graphics.set_color Graphics.blue;
  List.iter (draw_dot maze) path

let solve maze goal start = 
  let path = Astar.Pathfinding.find_path maze start goal in
  walk maze path;
  while Graphics.read_key() != ' ' do
    ()
  done

let rec interact maze goal start current =
  Graphics.set_color Graphics.black;
  draw_dot maze current; 
  
  let key = Graphics.read_key() in
  if key = ' ' then solve maze goal start
  else begin
    let next = match key with
      | '6' -> (fst current) +1, snd current
      | '4' -> (fst current) -1, snd current
      | '8' -> fst current, (snd current) -1
      | '2' -> fst current, (snd current) +1
      | _ -> current
    in
    if not (Maze.check maze next) || Maze.get maze next = '#' then begin 
      interact maze goal start current
    end
    else begin
      Graphics.set_color 0xffc600;
      draw_dot maze current;
      if next = goal then solve maze goal start
      else interact maze goal start next
    end       
  end
         
                   
let _ =
  Random.self_init ();
  let maze, start, goal = Generator.generate 20 10 in
  Graphics.open_graph "";
  load_maze maze "auto";
  interact maze goal start start
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.