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 ;
|
||||
}
|
||||
|
||||
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") ;;
|
||||
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