diff --git a/bin/main b/bin/main index 3a17023..a2cd4de 100755 Binary files a/bin/main and b/bin/main differ diff --git a/main.cmi b/main.cmi index 4d5bcb5..65809bd 100644 Binary files a/main.cmi and b/main.cmi differ diff --git a/main.cmo b/main.cmo index c2de0a6..9e68455 100644 Binary files a/main.cmo and b/main.cmo differ diff --git a/main.ml b/main.ml index 731ecc7..4ad2e2c 100644 --- a/main.ml +++ b/main.ml @@ -62,11 +62,27 @@ type game_data = { mutable boosts : boost array ; } +type danger = Powerup | Safe | Danger | Fatal | Blocked ;; + +let int_of_danger = function + | Safe -> 0 + | Danger -> 1 + | Powerup -> 2 + | Fatal -> 3 + | Blocked -> 4 ;; + +let danger_of_int = function + | 0 -> Safe + | 1 -> Danger + | 2 -> Powerup + | 3 -> Fatal + | _ -> Blocked ;; + (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) let print_game_data (gd : game_data) = - Printf.printf "-----------------------| Board data |-----------------------\n" ; + Printf.printf "--------------------------------| Board data |--------------------------------\n" ; Printf.printf "Time : %f\n" gd.dt ; Printf.printf "ID : %d\n" gd.player_id ; Printf.printf "Laby [of size %d %d]:\n" (Array.length gd.laby) (Array.length gd.laby.(0)); @@ -90,6 +106,20 @@ let print_game_data (gd : game_data) = Printf.printf " [Boost] (at %d %d) (of type %d)\n" gd.boosts.(b).x gd.boosts.(b).y gd.boosts.(b).spec ; done;; +let print_danger_levels (map : danger array array) = + Printf.printf "--------------------------------| Danger levels |--------------------------------\n" ; + for l = 0 to (Array.length map -1) do + for c = 0 to (Array.length map.(l) -1) do + match map.(l).(c) with + | Blocked -> Printf.printf "@ " + | Safe -> Printf.printf ". " + | Danger -> Printf.printf "! " + | Fatal -> Printf.printf "X " + | Powerup -> Printf.printf "P " + done; + Printf.printf "\n" + done ;; + (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) @@ -119,17 +149,7 @@ let int_n_of_string (str : string) (n : int) (nlast : int ref) = let parse_input (str : string) = let ptr = open_in str in - let (res : game_data) = { - dt = 0. ; - player_id = 0 ; - laby = [||] ; - nbombs = 0 ; - bombs = [||] ; - nplayers = 0 ; - players = [||] ; - nboosts = 0 ; - boosts = [||] ; - } in + let (res : game_data) = {dt = 0. ; player_id = 0 ; laby = [||] ; nbombs = 0 ; bombs = [||] ; nplayers = 0 ; players = [||] ; nboosts = 0 ; boosts = [||] ;} in try (* time *) if debug then Printf.printf "Time\n" ; @@ -159,11 +179,7 @@ let parse_input (str : string) = and last = ref 0 in let dat = int_n_of_string psd 3 last in let dtime = Float.of_string (String.init (String.length psd - !last) (fun i -> psd.[i + !last])) in - res.bombs.(b) <- { - x = dat.(0) ; - y = dat.(1) ; - size = dat.(2) ; - det_time = dtime ; + res.bombs.(b) <- {x = dat.(0) ; y = dat.(1) ; size = dat.(2) ; det_time = dtime ; } done; @@ -174,16 +190,7 @@ let parse_input (str : string) = res.players <- Array.make res.nplayers default_player ; for p = 0 to res.nplayers -1 do let dat = int_n_of_string (input_line ptr) 8 useless in - res.players.(p) <- { - id = dat.(2) ; - x = dat.(0) ; - y = dat.(1) ; - nspeed = dat.(3) ; - nbomb_atonce = dat.(4) ; - bomb_radius = dat.(5) ; - ndash = dat.(6) ; - ntraps = dat.(7) ; - } + res.players.(p) <- {id = dat.(2) ; x = dat.(0) ; y = dat.(1) ; nspeed = dat.(3) ; nbomb_atonce = dat.(4) ; bomb_radius = dat.(5) ; ndash = dat.(6) ; ntraps = dat.(7) ;} done; (* boosts *) @@ -193,11 +200,7 @@ let parse_input (str : string) = res.boosts <- Array.make res.nboosts default_boost ; for p = 0 to res.nboosts -1 do let dat = int_n_of_string (input_line ptr) 3 useless in - res.boosts.(p) <- { - x = dat.(0) ; - y = dat.(1) ; - spec = dat.(2) - } + res.boosts.(p) <- {x = dat.(0) ; y = dat.(1) ; spec = dat.(2)} done; if debug then Printf.printf "Done!\n" ; @@ -208,4 +211,46 @@ let parse_input (str : string) = close_in ptr ; failwith "cannot happen unless something is wrong" ;; -print_game_data (parse_input "input_test.txt") ;; \ No newline at end of file +let warn_level (b : bomb) (ct : float) = match (b.det_time -. ct) with + | k when k < 1.0 -> Fatal ; + | _ -> Danger ;; + +let danger_priority (p1 : danger) (p2 : danger) = + danger_of_int (max (int_of_danger p1) (int_of_danger p2)) ;; + +let evaluate_dangers (gd : game_data) = + let lines = Array.length gd.laby + and cols = Array.length gd.laby.(0) in + let res = Array.make_matrix lines cols Safe in + + (* add solid blocks *) + for l = 0 to lines -1 do + for c = 0 to cols -1 do + if gd.laby.(l).(c) = 1 || gd.laby.(l).(c) = 1 then + res.(l).(c) <- Blocked ; + done + done ; + + (* add bomb tiles *) + for b = 0 to gd.nbombs -1 do + let dgr = warn_level gd.bombs.(b) gd.dt in + for off = -gd.bombs.(b).size to gd.bombs.(b).size do + let ln = min (lines -1) (max 0 (gd.bombs.(b).x + off)) + and cl = min (cols -1) (max 0 (gd.bombs.(b).y + off)) in + if res.(ln).(gd.bombs.(b).y) = Safe then + res.(ln).(gd.bombs.(b).y) <- danger_priority (res.(ln).(gd.bombs.(b).y)) dgr ; + if res.(gd.bombs.(b).x).(cl) = Safe then + res.(gd.bombs.(b).x).(cl) <- danger_priority (res.(gd.bombs.(b).x).(cl)) dgr ; + done; + done; + + (* add powerups *) + for p = 0 to gd.nboosts -1 do + res.(gd.boosts.(p).x).(gd.boosts.(p).y) <- Powerup ; + done; + + res ;; + +let game_d = parse_input "input_test.txt" ;; +print_game_data game_d ;; +print_danger_levels (evaluate_dangers game_d) \ No newline at end of file