added danger map

This commit is contained in:
Alexandre 2024-11-06 15:54:18 +01:00
parent 06f01a6307
commit f5e5113e72
4 changed files with 78 additions and 33 deletions

BIN
bin/main

Binary file not shown.

BIN
main.cmi

Binary file not shown.

BIN
main.cmo

Binary file not shown.

111
main.ml
View File

@ -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)