added danger map
This commit is contained in:
parent
06f01a6307
commit
f5e5113e72
111
main.ml
111
main.ml
|
@ -62,11 +62,27 @@ type game_data = {
|
||||||
mutable boosts : boost array ;
|
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) =
|
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 "Time : %f\n" gd.dt ;
|
||||||
Printf.printf "ID : %d\n" gd.player_id ;
|
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));
|
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 ;
|
Printf.printf " [Boost] (at %d %d) (of type %d)\n" gd.boosts.(b).x gd.boosts.(b).y gd.boosts.(b).spec ;
|
||||||
done;;
|
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 parse_input (str : string) =
|
||||||
let ptr = open_in str in
|
let ptr = open_in str in
|
||||||
let (res : game_data) = {
|
let (res : game_data) = {dt = 0. ; player_id = 0 ; laby = [||] ; nbombs = 0 ; bombs = [||] ; nplayers = 0 ; players = [||] ; nboosts = 0 ; boosts = [||] ;} in
|
||||||
dt = 0. ;
|
|
||||||
player_id = 0 ;
|
|
||||||
laby = [||] ;
|
|
||||||
nbombs = 0 ;
|
|
||||||
bombs = [||] ;
|
|
||||||
nplayers = 0 ;
|
|
||||||
players = [||] ;
|
|
||||||
nboosts = 0 ;
|
|
||||||
boosts = [||] ;
|
|
||||||
} in
|
|
||||||
try
|
try
|
||||||
(* time *)
|
(* time *)
|
||||||
if debug then Printf.printf "Time\n" ;
|
if debug then Printf.printf "Time\n" ;
|
||||||
|
@ -159,11 +179,7 @@ let parse_input (str : string) =
|
||||||
and last = ref 0 in
|
and last = ref 0 in
|
||||||
let dat = int_n_of_string psd 3 last 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
|
let dtime = Float.of_string (String.init (String.length psd - !last) (fun i -> psd.[i + !last])) in
|
||||||
res.bombs.(b) <- {
|
res.bombs.(b) <- {x = dat.(0) ; y = dat.(1) ; size = dat.(2) ; det_time = dtime ;
|
||||||
x = dat.(0) ;
|
|
||||||
y = dat.(1) ;
|
|
||||||
size = dat.(2) ;
|
|
||||||
det_time = dtime ;
|
|
||||||
}
|
}
|
||||||
done;
|
done;
|
||||||
|
|
||||||
|
@ -174,16 +190,7 @@ let parse_input (str : string) =
|
||||||
res.players <- Array.make res.nplayers default_player ;
|
res.players <- Array.make res.nplayers default_player ;
|
||||||
for p = 0 to res.nplayers -1 do
|
for p = 0 to res.nplayers -1 do
|
||||||
let dat = int_n_of_string (input_line ptr) 8 useless in
|
let dat = int_n_of_string (input_line ptr) 8 useless in
|
||||||
res.players.(p) <- {
|
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) ;}
|
||||||
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;
|
done;
|
||||||
|
|
||||||
(* boosts *)
|
(* boosts *)
|
||||||
|
@ -193,11 +200,7 @@ let parse_input (str : string) =
|
||||||
res.boosts <- Array.make res.nboosts default_boost ;
|
res.boosts <- Array.make res.nboosts default_boost ;
|
||||||
for p = 0 to res.nboosts -1 do
|
for p = 0 to res.nboosts -1 do
|
||||||
let dat = int_n_of_string (input_line ptr) 3 useless in
|
let dat = int_n_of_string (input_line ptr) 3 useless in
|
||||||
res.boosts.(p) <- {
|
res.boosts.(p) <- {x = dat.(0) ; y = dat.(1) ; spec = dat.(2)}
|
||||||
x = dat.(0) ;
|
|
||||||
y = dat.(1) ;
|
|
||||||
spec = dat.(2)
|
|
||||||
}
|
|
||||||
done;
|
done;
|
||||||
|
|
||||||
if debug then Printf.printf "Done!\n" ;
|
if debug then Printf.printf "Done!\n" ;
|
||||||
|
@ -208,4 +211,46 @@ let parse_input (str : string) =
|
||||||
close_in ptr ;
|
close_in ptr ;
|
||||||
failwith "cannot happen unless something is wrong" ;;
|
failwith "cannot happen unless something is wrong" ;;
|
||||||
|
|
||||||
print_game_data (parse_input "input_test.txt") ;;
|
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)
|
Loading…
Reference in New Issue