From 8d46228c2e2c9a8a26c4689b4882271fcabacad3 Mon Sep 17 00:00:00 2001 From: Alexandre Date: Sat, 9 Nov 2024 17:16:56 +0100 Subject: [PATCH] calibrated everything --- compil.sh | 3 +- entrees.txt | 47 ++-- exec.sh | 4 +- iachallenge2024_bomberman_tkinter.py | 4 +- main | Bin 229606 -> 229853 bytes main.cmi | Bin 7607 -> 8684 bytes main.cmo | Bin 30589 -> 31279 bytes main.ml | 350 ++++++++++++++------------- main.sav | 2 +- main_0.sav | 1 + main_1.sav | 1 + main_2.sav | 1 + main_3.sav | 1 + sortie.txt | 1 - 14 files changed, 207 insertions(+), 208 deletions(-) create mode 100644 main_0.sav create mode 100644 main_1.sav create mode 100644 main_2.sav create mode 100644 main_3.sav diff --git a/compil.sh b/compil.sh index 0ff119f..a5fbb7d 100644 --- a/compil.sh +++ b/compil.sh @@ -1,2 +1 @@ -ocamlc main.ml -o main -./main \ No newline at end of file +ocamlc main.ml -o main \ No newline at end of file diff --git a/entrees.txt b/entrees.txt index 1bee19f..b403d83 100644 --- a/entrees.txt +++ b/entrees.txt @@ -1,32 +1,25 @@ -88.00000000000014 +158.0 0 13 21 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -1 3 3 3 3 0 0 2 2 2 2 2 2 0 0 5 5 5 5 5 1 -1 3 1 3 1 0 1 0 1 2 1 0 1 0 1 0 1 5 1 5 1 -1 3 3 3 3 0 2 2 2 2 0 0 0 2 2 2 0 5 5 5 1 -1 3 1 3 1 2 1 2 1 2 1 2 1 2 1 2 1 0 1 5 1 -1 0 0 3 0 2 2 2 2 2 0 2 2 2 2 0 2 2 0 5 1 -1 6 1 0 1 2 1 2 1 2 1 2 1 0 1 2 1 2 1 0 1 -1 6 0 0 2 0 2 2 2 2 2 2 2 0 0 2 2 2 2 0 1 -1 6 1 0 1 2 1 2 1 2 1 2 1 2 1 2 1 0 1 4 1 -1 6 6 6 0 2 2 2 2 2 2 2 0 2 2 2 0 4 4 4 1 -1 6 1 6 1 2 1 0 1 2 1 2 1 2 1 0 1 4 1 4 1 -1 6 6 6 0 2 2 2 2 2 2 2 2 2 0 4 4 4 4 4 1 +1 3 3 3 0 2 0 2 2 2 2 2 2 0 5 5 5 5 5 5 1 +1 3 1 3 1 2 1 0 1 2 1 2 1 5 1 5 1 5 1 5 1 +1 3 3 3 0 0 3 3 0 2 2 0 5 5 5 5 5 5 5 5 1 +1 3 1 3 1 2 1 3 1 0 1 0 1 5 1 5 1 0 1 5 1 +1 6 6 6 6 0 0 3 4 4 4 4 5 5 5 4 4 0 0 5 1 +1 3 1 0 1 0 1 3 1 4 1 4 1 5 1 4 1 0 1 0 1 +1 6 6 6 6 6 6 3 6 4 2 0 0 5 5 5 5 4 0 0 1 +1 6 1 6 1 3 1 6 1 0 1 0 1 5 1 4 1 4 1 4 1 +1 6 6 6 6 5 5 5 5 5 5 5 5 5 5 4 4 4 4 4 1 +1 6 1 6 1 6 1 6 1 5 1 0 1 5 1 4 1 4 1 4 1 +1 6 6 6 6 6 6 6 6 5 0 0 5 5 5 5 4 4 4 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -3 -11 4 1 89.5 -3 5 3 89.90000000000012 -8 17 3 90.5 +1 +7 9 2 159.00000000000048 4 -1 6 0 1 1 3 0 1 -9 17 1 0 1 3 1 1 -3 17 2 1 1 2 1 1 -9 3 3 0 1 1 3 1 -6 -7 19 2 -5 18 0 -5 4 0 -9 4 3 -10 15 2 -11 14 0 +5 7 0 0 2 4 0 1 +4 7 1 5 2 1 2 2 +9 8 2 4 4 4 1 4 +9 8 3 1 2 3 2 0 +1 +3 8 2 diff --git a/exec.sh b/exec.sh index eba9c6e..0ff119f 100644 --- a/exec.sh +++ b/exec.sh @@ -1,2 +1,2 @@ -chmod u+x main.ml -./main.ml \ No newline at end of file +ocamlc main.ml -o main +./main \ No newline at end of file diff --git a/iachallenge2024_bomberman_tkinter.py b/iachallenge2024_bomberman_tkinter.py index f186ef3..a2f5c5d 100644 --- a/iachallenge2024_bomberman_tkinter.py +++ b/iachallenge2024_bomberman_tkinter.py @@ -7,7 +7,7 @@ Created on Wed Sep 12 13:52:48 2018 TEMPS_BASE = 1 TEMPS_PROPAGATION = 0.01 TEMPS_EXPLOSION = 5.5 -TEMPS_PARTIE = 100 +TEMPS_PARTIE = 1000 E_INSTANT = 0 E_NATURE = 1 @@ -339,7 +339,7 @@ def simulation(strategies): execute_evenement(evenements, evenement, plateau, plateauCouleur, bombes, joueurs, powerups, pieges) affiche_plateau(canvas, plateau, plateauCouleur, bombes, joueurs, powerups) affiche_infos(canvasInfosJoueurs, joueurs, plateauCouleur) - temps = int((evenements[0][0]-evenement[0])/3*500) + temps = int((evenements[0][0]-evenement[0])/3*100) if temps != 0: fenetre.after(temps, pas_de_jeu) else: diff --git a/main b/main index e580c83560109d40426e08c027c05f70c5f1b5ef..1ebf43bb6c41d0e00f37a27e66ae7c6186be2915 100755 GIT binary patch delta 7992 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 WHY^`A9#fCpB4-Hit!mdT()=$O4jy^{ delta 6891 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 kxo2&WNpJK*5*7hj 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 g88AieqTQUzPpF@XhPL0CRKv-T(jq literal 7607 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 V-lMNLeMuOuy}#r#Ovt3GyZxj0 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 S0l(_-GUI*ATSTpbXGXkbts5 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 diff --git a/main.ml b/main.ml index 88a9d44..785e4d0 100755 --- a/main.ml +++ b/main.ml @@ -76,18 +76,20 @@ type game_data = { mutable boosts : boost array ; } -type danger = Safe | Danger of float | Fatal of float | Blocked ;; +type danger = Safe | Danger of float | Fatal of float | Blocked | Bonus ;; let int_of_danger = function | Safe -> 0 - | Danger _ -> 1 - | Fatal _ -> 2 - | Blocked -> 3 ;; + | Bonus -> 1 + | Danger _ -> 2 + | Fatal _ -> 3 + | Blocked -> 4 ;; let danger_of_int t = function | 0 -> Safe - | 1 -> Danger t - | 2 -> Fatal t + | 1 -> Bonus + | 2 -> Danger t + | 3 -> Fatal t | _ -> Blocked ;; type moveType = EscapeDeath | BlowUpCrates | KillPlayers | ClaimLand ;; @@ -113,11 +115,11 @@ let is_valid i j len hei = i >= 0 && j >= 0 && i < len && j < hei ;; let print_direction = function - | 0 -> Printf.printf "NORTH " - | 1 -> Printf.printf "EAST " - | 2 -> Printf.printf "SOUTH " - | 3 -> Printf.printf "WEST " - | 4 -> Printf.printf "STILL " + | 0 -> Printf.fprintf stderr "NORTH " + | 1 -> Printf.fprintf stderr "EAST " + | 2 -> Printf.fprintf stderr "SOUTH " + | 3 -> Printf.fprintf stderr "WEST " + | 4 -> Printf.fprintf stderr "STILL " | _-> failwith "ERROR : invalid direction" ;; let level_of_danger = function @@ -135,57 +137,63 @@ let overwrite_file (filename : string) = (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) let print_game_data (gd : game_data) = - 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)); + Printf.fprintf stderr "--------------------------------| Board data |--------------------------------\n" ; + Printf.fprintf stderr "Time : %f\n" gd.dt ; + Printf.fprintf stderr "ID : %d\n" gd.player_id ; + Printf.fprintf stderr "Laby [of size %d %d]:\n" (Array.length gd.laby) (Array.length gd.laby.(0)); for l = 0 to Array.length gd.laby -1 do - Printf.printf " " ; + Printf.fprintf stderr " " ; for c = 0 to Array.length gd.laby.(l) -1 do - Printf.printf "%d " gd.laby.(l).(c) ; + Printf.fprintf stderr "%d " gd.laby.(l).(c) ; done; - Printf.printf "\n" + Printf.fprintf stderr "\n" done ; - Printf.printf "Bombs (%d) : \n" gd.nbombs ; + Printf.fprintf stderr "Bombs (%d) : \n" gd.nbombs ; for b = 0 to gd.nbombs -1 do - Printf.printf " [Bomb] (at %d %d) (of size %d) (blowing up at %f)\n" gd.bombs.(b).xy.x gd.bombs.(b).xy.y gd.bombs.(b).size gd.bombs.(b).det_time ; + Printf.fprintf stderr " [Bomb] (at %d %d) (of size %d) (blowing up at %f)\n" gd.bombs.(b).xy.x gd.bombs.(b).xy.y gd.bombs.(b).size gd.bombs.(b).det_time ; done; - Printf.printf "Players (%d) : \n" gd.nplayers ; + Printf.fprintf stderr "Players (%d) : \n" gd.nplayers ; for b = 0 to gd.nplayers -1 do - Printf.printf " [Player %d] (at %d %d) (holding %d %d %d %d %d)\n" gd.players.(b).id gd.players.(b).xy.x gd.players.(b).xy.y gd.players.(b).nspeed gd.players.(b).nbomb_atonce gd.players.(b).bomb_radius gd.players.(b).ndash gd.players.(b).ntraps ; + Printf.fprintf stderr " [Player %d] (at %d %d) (holding %d %d %d %d %d)\n" gd.players.(b).id gd.players.(b).xy.x gd.players.(b).xy.y gd.players.(b).nspeed gd.players.(b).nbomb_atonce gd.players.(b).bomb_radius gd.players.(b).ndash gd.players.(b).ntraps ; done; - Printf.printf "Boosts (%d) : \n" gd.nboosts ; + Printf.fprintf stderr "Boosts (%d) : \n" gd.nboosts ; for b = 0 to gd.nboosts -1 do - Printf.printf " [Boost] (at %d %d) (of type %d)\n" gd.boosts.(b).xy.x gd.boosts.(b).xy.y gd.boosts.(b).spec ; + Printf.fprintf stderr " [Boost] (at %d %d) (of type %d)\n" gd.boosts.(b).xy.x gd.boosts.(b).xy.y gd.boosts.(b).spec ; done;; let print_danger_levels (map : danger array array) = - Printf.printf "--------------------------------| Danger levels |--------------------------------\n" ; + Printf.fprintf stderr "--------------------------------| 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 x -> Printf.printf "! " - | Fatal x -> Printf.printf "X " + | Blocked -> Printf.fprintf stderr "@ " + | Safe -> Printf.fprintf stderr ". " + | Bonus -> Printf.fprintf stderr "+ " + | Danger x -> Printf.fprintf stderr "! " + | Fatal x -> Printf.fprintf stderr "X " done; - Printf.printf "\n" + Printf.fprintf stderr "\n" done ;; let print_gain_map (map : int array array) = - Printf.printf "--------------------------------| Gain levels |--------------------------------\n" ; + Printf.fprintf stderr "--------------------------------| Gain levels |--------------------------------\n" ; for l = 0 to (Array.length map -1) do for c = 0 to (Array.length map.(l) -1) do - Printf.printf "%d " map.(l).(c) ; + Printf.fprintf stderr "%d " map.(l).(c) ; done; - Printf.printf "\n" + Printf.fprintf stderr "\n" done ;; (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) -let get_meta_info () = - let ptr = open_in "main.sav" in +let rec ln_b b = function + | k when k < 0 -> failwith "are you sure about that ?" + | k when k < b -> 0 + | k -> 1 + ln_b b (k/b) ;; + +let get_meta_info (pid : int) = + let ptr = open_in ("main_"^(string_of_int pid)^".sav") in match (int_of_string (input_line ptr)) with | 0 -> current_status := EscapeDeath | 1 -> current_status := BlowUpCrates @@ -194,8 +202,8 @@ let get_meta_info () = | _ -> current_status := EscapeDeath ; close_in ptr ;; -let set_meta_info () = - let ptr = open_out "main.sav" in +let set_meta_info (pid : int) = + let ptr = open_out ("main_"^(string_of_int pid)^".sav") in match !current_status with | EscapeDeath -> Printf.fprintf ptr "0" | BlowUpCrates -> Printf.fprintf ptr "1" @@ -209,6 +217,9 @@ let set_meta_info () = let int_of_string (str : string) = String.fold_right (fun ch acc -> let cd = Char.code ch in if cd >= 48 || cd <= 57 then 10*acc + cd - 48 else failwith "not an integer\n") str 0 ;; +let string_of_int (k0 : int) = + String.make (1) (Char.chr (k0 + 48)) ;; + let int_n_of_string (str : string) (n : int) (nlast : int ref) = let res = Array.make n 0 in let rec aux idres idstr = match idstr with @@ -235,15 +246,15 @@ let parse_input (str : string) = let (res : game_data) = {dt = 0. ; player_id = 0 ; laby = [||] ; nbombs = 0 ; bombs = [||] ; nplayers = 0 ; players = [||] ; nboosts = 0 ; boosts = [||] ;} in try (* time *) - if debug_all then Printf.printf "Time\n" ; + if debug_all then Printf.fprintf stderr "Time\n" ; res.dt <- Float.of_string (input_line ptr) ; (* player_id *) - if debug_all then Printf.printf "PID\n" ; + if debug_all then Printf.fprintf stderr "PID\n" ; res.player_id <- int_of_string (input_line ptr) ; (* maze *) - if debug_all then Printf.printf "Maze\n" ; + if debug_all then Printf.fprintf stderr "Maze\n" ; let msize = int_n_of_string (input_line ptr) 2 useless in res.laby <- Array.make msize.(0) [||] ; @@ -253,7 +264,7 @@ let parse_input (str : string) = done; (* bombs *) - if debug_all then Printf.printf "Boom\n" ; + if debug_all then Printf.fprintf stderr "Boom\n" ; res.nbombs <- int_of_string (input_line ptr) ; res.bombs <- Array.make res.nbombs default_bomb ; @@ -267,7 +278,7 @@ let parse_input (str : string) = done; (* players *) - if debug_all then Printf.printf "Players\n" ; + if debug_all then Printf.fprintf stderr "Players\n" ; res.nplayers <- int_of_string (input_line ptr) ; res.players <- Array.make res.nplayers default_player ; @@ -277,7 +288,7 @@ let parse_input (str : string) = done; (* boosts *) - if debug_all then Printf.printf "Boosts\n" ; + if debug_all then Printf.fprintf stderr "Boosts\n" ; res.nboosts <- int_of_string (input_line ptr) ; res.boosts <- Array.make res.nboosts default_boost ; @@ -286,7 +297,7 @@ let parse_input (str : string) = res.boosts.(p) <- {xy = {x = dat.(0) ; y = dat.(1) ;} ; spec = dat.(2)} done; - if debug_all then Printf.printf "Done!\n" ; + if debug_all then Printf.fprintf stderr "Done!\n" ; close_in ptr ; res with @@ -318,6 +329,11 @@ let evaluate_dangers (gd : game_data) = done done ; + (* add bonuses *) + for b = 0 to gd.nboosts -1 do + res.(gd.boosts.(b).xy.x).(gd.boosts.(b).xy.y) <- danger_priority (res.(gd.boosts.(b).xy.x).(gd.boosts.(b).xy.y)) Bonus + done; + (* sort bombs based on detonation time *) for b = 0 to gd.nbombs -1 do let m = ref gd.bombs.(b).det_time @@ -401,8 +417,70 @@ let cell_values (gd : game_data) = (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +let has_a_safe_path_origin (cx0 : int) (cy0 : int) (lines : int) (cols : int) (simt : float) (interval : float) (gd : game_data) (dgs : danger array array) (white_dgs : danger array) (white_gd : int array) (black_dgs : danger array) (black_gd : int array) (maxdepth : int) = + (* + core function + performs a BFS starting at (cx0, cy0), avoiding anything in blacklists and halting upon stepping on a whitelisted element + *) + let visited = Hashtbl.create 100 in + let q = Queue.create () in + + Hashtbl.add visited (cx0, cy0) 1 ; + + if is_valid (cx0+1) (cy0) lines cols && not ((simt +. interval) > (level_of_danger dgs.(cx0+1).(cy0)) && (simt +. interval) < (level_of_danger dgs.(cx0+1).(cy0)) +. explosion_time) then begin (* South *) + if debug_all then Printf.fprintf stderr "[escape] +South\n" ; + Queue.add (cx0+1, cy0, simt +. interval, 2) q ; + end; + if is_valid (cx0-1) (cy0) lines cols && not ((simt +. interval) > (level_of_danger dgs.(cx0-1).(cy0)) && (simt +. interval) < (level_of_danger dgs.(cx0-1).(cy0)) +. explosion_time) then begin (* North *) + if debug_all then Printf.fprintf stderr "[escape] +North\n" ; + Queue.add (cx0-1, cy0, simt +. interval, 0) q ; + end; + if is_valid (cx0) (cy0+1) lines cols && not ((simt +. interval) > (level_of_danger dgs.(cx0).(cy0+1)) && (simt +. interval) < (level_of_danger dgs.(cx0).(cy0+1)) +. explosion_time) then begin (* East *) + if debug_all then Printf.fprintf stderr "[escape] +East\n" ; + Queue.add (cx0, cy0+1, simt +. interval, 1) q ; + end; + if is_valid (cx0) (cy0-1) lines cols && not ((simt +. interval) > (level_of_danger dgs.(cx0).(cy0-1)) && (simt +. interval) < (level_of_danger dgs.(cx0).(cy0-1)) +. explosion_time) then begin (* West *) + if debug_all then Printf.fprintf stderr "[escape] +West\n" ; + Queue.add (cx0, cy0-1, simt +. interval, 3) q ; + end; + + if debug_all then Printf.fprintf stderr "[escape] Attempt 1/1...\n" ; + try + while not (Queue.is_empty q) do + let (cx, cy, cur_t, direct) = Queue.pop q in + if Hashtbl.find_opt visited (cx, cy) <> None then () else begin + Hashtbl.add visited (cx, cy) 1 ; + if cur_t > simt +. (float_of_int maxdepth) *. interval then (* too deep *) + raise (ReturnInt 4) + else if Array.mem dgs.(cx).(cy) white_dgs then + raise (ReturnInt direct) + else if Array.mem gd.laby.(cx).(cy) white_gd then + raise (ReturnInt direct) + else if Array.mem dgs.(cx).(cy) black_dgs then + () + else if Array.mem gd.laby.(cx).(cy) black_gd then + () + else begin (* either danger or fatal *) + let dang_time = level_of_danger dgs.(cx).(cy) in + for dir = 0 to 3 do + let newx = cx + fst order.(dir) + and newy = cy + snd order.(dir) + and newt = cur_t +. interval in + if (is_valid newx newy lines cols) && not (newt > dang_time && newt < dang_time +. explosion_time) then + Queue.add (newx, newy, newt, direct) q + done + end + end + done; + 4 + with + | ReturnInt b -> b ;; + +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) + let is_safe = function - | Safe | Danger _ -> true + | Safe | Danger _ | Bonus -> true | Fatal _ | Blocked -> false ;; let move_safe (gd : game_data) (dgs : danger array array) = @@ -411,7 +489,7 @@ let move_safe (gd : game_data) (dgs : danger array array) = let pid = gd.player_id in let interval = Float.pow 0.9 (float_of_int gd.players.(pid).nspeed) in - if debug_all then Printf.printf "I = %f\n" interval ; + if debug_all then Printf.fprintf stderr "I = %f\n" interval ; let lines = Array.length gd.laby and cols = Array.length gd.laby.(0) in @@ -424,65 +502,18 @@ let move_safe (gd : game_data) (dgs : danger array array) = current_status := BlowUpCrates ; raise (ReturnInt 4) ; end; - - let visited = Hashtbl.create 100 in - let has_a_safe_path (cx0 : int) (cy0 : int) (simt : float) = - let q = Queue.create () in - - Hashtbl.add visited (cx0, cy0) 1 ; - - if is_valid (cx0+1) (cy0) lines cols && not ((simt +. interval) > (level_of_danger dgs.(cx0+1).(cy0)) && (simt +. interval) < (level_of_danger dgs.(cx0+1).(cy0)) +. explosion_time) then begin (* South *) - if debug_all then Printf.printf "[escape] +South\n" ; - Queue.add (cx0+1, cy0, simt +. interval, 2) q ; - end; - if is_valid (cx0-1) (cy0) lines cols && not ((simt +. interval) > (level_of_danger dgs.(cx0-1).(cy0)) && (simt +. interval) < (level_of_danger dgs.(cx0-1).(cy0)) +. explosion_time) then begin (* North *) - if debug_all then Printf.printf "[escape] +North\n" ; - Queue.add (cx0-1, cy0, simt +. interval, 0) q ; - end; - if is_valid (cx0) (cy0+1) lines cols && not ((simt +. interval) > (level_of_danger dgs.(cx0).(cy0+1)) && (simt +. interval) < (level_of_danger dgs.(cx0).(cy0+1)) +. explosion_time) then begin (* East *) - if debug_all then Printf.printf "[escape] +East\n" ; - Queue.add (cx0, cy0+1, simt +. interval, 1) q ; - end; - if is_valid (cx0) (cy0-1) lines cols && not ((simt +. interval) > (level_of_danger dgs.(cx0).(cy0-1)) && (simt +. interval) < (level_of_danger dgs.(cx0).(cy0-1)) +. explosion_time) then begin (* West *) - if debug_all then Printf.printf "[escape] +West\n" ; - Queue.add (cx0, cy0-1, simt +. interval, 3) q ; - end; - - if debug_all then Printf.printf "[escape] Attempt 1/1...\n" ; - try - while not (Queue.is_empty q) do - let (cx, cy, cur_t, direct) = Queue.pop q in - if Hashtbl.find_opt visited (cx, cy) <> None then () else begin - Hashtbl.add visited (cx, cy) 1 ; - (*if debug_all then Printf.printf "dealing at (%d, %d) with dir %d\n" cx cy direct ;*) - if dgs.(cx).(cy) = Safe then - raise (ReturnInt direct) - else if dgs.(cx).(cy) = Blocked then - () - else begin (* either danger or fatal *) - let dang_time = level_of_danger dgs.(cx).(cy) in - for dir = 0 to 3 do - let newx = cx + fst order.(dir) - and newy = cy + snd order.(dir) - and newt = cur_t +. interval in - if (is_valid newx newy lines cols) && not (newt > dang_time && newt < dang_time +. explosion_time) then - Queue.add (newx, newy, newt, direct) q - done - end - end - done; - 4 - with - | ReturnInt b -> b - in - - let result = has_a_safe_path (cx) (cy) gd.dt in + (*let result = has_a_safe_path (cx) (cy) gd.dt in*) + let result = has_a_safe_path_origin cx cy lines cols gd.dt interval gd dgs [|Bonus|] [||] [|Blocked|] [||] 20 in if result <> 4 then result else begin - (* you're probably dead if the code reaches here... *) - if debug_all then Printf.printf "[escape] Attempt F...\n"; - 4 + let result2 = has_a_safe_path_origin cx cy lines cols gd.dt interval gd dgs [|Safe|] [||] [|Blocked|] [||] 80 in + if result2 <> 4 then result2 + else begin + (* you're probably dead if the code reaches here... *) + if debug_all then Printf.fprintf stderr "[escape] Attempt F...\n"; + 4 + end end with | ReturnInt k -> k ;; @@ -502,67 +533,24 @@ let move_explore (gd: game_data) (dgs : danger array array) = try let (cxi, cyi) = (gd.players.(pid).xy.x, gd.players.(pid).xy.y) in - let visited = Hashtbl.create 100 in - - let has_a_safe_path (cx0 : int) (cy0 : int) (simt : float) = - let q = Queue.create () in - Hashtbl.add visited (cx0, cy0) 1 ; - - if is_valid (cx0+1) (cy0) lines cols && not ((simt +. interval) > (level_of_danger dgs.(cx0+1).(cy0)) && (simt +. interval) < (level_of_danger dgs.(cx0+1).(cy0)) +. explosion_time) then begin (* South *) - if debug_all then Printf.printf "[crates] +South\n" ; - Queue.add (cx0+1, cy0, simt +. interval, 2) q ; - end; - if is_valid (cx0-1) (cy0) lines cols && not ((simt +. interval) > (level_of_danger dgs.(cx0-1).(cy0)) && (simt +. interval) < (level_of_danger dgs.(cx0-1).(cy0)) +. explosion_time) then begin (* North *) - if debug_all then Printf.printf "[crates] +North\n" ; - Queue.add (cx0-1, cy0, simt +. interval, 0) q ; - end; - if is_valid (cx0) (cy0+1) lines cols && not ((simt +. interval) > (level_of_danger dgs.(cx0).(cy0+1)) && (simt +. interval) < (level_of_danger dgs.(cx0).(cy0+1)) +. explosion_time) then begin (* East *) - if debug_all then Printf.printf "[crates] +East\n" ; - Queue.add (cx0, cy0+1, simt +. interval, 1) q ; - end; - if is_valid (cx0) (cy0-1) lines cols && not ((simt +. interval) > (level_of_danger dgs.(cx0).(cy0-1)) && (simt +. interval) < (level_of_danger dgs.(cx0).(cy0-1)) +. explosion_time) then begin (* West *) - if debug_all then Printf.printf "[crates] +West\n" ; - Queue.add (cx0, cy0-1, simt +. interval, 3) q ; - end; - - if debug_all then Printf.printf "[crates] Attempt 1/1...\n" ; - try - while not (Queue.is_empty q) do - let (cx, cy, cur_t, direct) = Queue.pop q in - if Hashtbl.find_opt visited (cx, cy) <> None then () else begin - Hashtbl.add visited (cx, cy) 1 ; - (*if debug_all then Printf.printf "[crates] exploring (%d, %d) at time %f for dir %d\n" cx cy cur_t direct ;*) - if gd.laby.(cx).(cy) = 2 then (* crate *) - raise (ReturnInt direct) - else if dgs.(cx).(cy) = Blocked then - () - else begin (* we need to go deeper *) - let dang_time = level_of_danger dgs.(cx).(cy) in - for dir = 0 to 3 do - let newx = cx + fst order.(dir) - and newy = cy + snd order.(dir) - and newt = cur_t +. interval in - if (is_valid newx newy lines cols) && not (newt > dang_time && newt < dang_time +. explosion_time) then - Queue.add (newx, newy, newt, direct) q - done - end - end - done; - (-1) - with - | ReturnInt k -> k - in - let move_with_caution (exit : bool) = - let res = has_a_safe_path cxi cyi gd.dt in - if res <> -1 then begin - if debug_all then Printf.printf "[crates] success!\n" ; + let res = has_a_safe_path_origin cxi cyi lines cols gd.dt interval gd dgs [|Bonus|] [||] [|Blocked|] [||] 5 in + if res <> 4 then begin + if debug_all then Printf.fprintf stderr "[crates] success 1/2!\n" ; res end else begin - if false && exit then - current_status := ClaimLand ; - 4 + let res2 = has_a_safe_path_origin cxi cyi lines cols gd.dt interval gd dgs [||] [|2|] [|Blocked|] [||] 80 in + if res2 <> 4 then begin + if debug_all then Printf.fprintf stderr "[crates] success 2/2!\n" ; + res2 + end + else begin + if false && exit then (* TODO *) + current_status := ClaimLand ; + Printf.fprintf stderr "Exited.\n" ; + 4 + end end in @@ -593,7 +581,7 @@ let move_explore (gd: game_data) (dgs : danger array array) = if gd.players.(pid).nbomb_atonce > 0 then begin current_status := EscapeDeath ; action := 1; - if debug_all then Printf.printf "Fire in the hole!\n" ; + if debug_all then Printf.fprintf stderr "Fire in the hole!\n" ; end; raise (ReturnInt 4) ; end; @@ -602,7 +590,7 @@ let move_explore (gd: game_data) (dgs : danger array array) = if gd.players.(pid).nbomb_atonce > 0 then begin current_status := EscapeDeath ; action := 1; - if debug_all then Printf.printf "Fire in the hole!\n" ; + if debug_all then Printf.fprintf stderr "Fire in the hole!\n" ; end; raise (ReturnInt 4) ; end; @@ -611,7 +599,7 @@ let move_explore (gd: game_data) (dgs : danger array array) = if gd.players.(pid).nbomb_atonce > 0 then begin current_status := EscapeDeath ; action := 1; - if debug_all then Printf.printf "Fire in the hole!\n" ; + if debug_all then Printf.fprintf stderr "Fire in the hole!\n" ; end; raise (ReturnInt 4) ; end; @@ -620,12 +608,12 @@ let move_explore (gd: game_data) (dgs : danger array array) = if gd.players.(pid).nbomb_atonce > 0 then begin current_status := EscapeDeath ; action := 1; - if debug_all then Printf.printf "Fire in the hole!\n" ; + if debug_all then Printf.fprintf stderr "Fire in the hole!\n" ; end; raise (ReturnInt 4) ; end; - if debug_all then Printf.printf "[crates] Cannot bomb now, searching for a crate...\n"; + if debug_all then Printf.fprintf stderr "[crates] Cannot bomb now, searching for a crate...\n"; (* go to one without stepping into a dangerous tile *) raise (ReturnInt (move_with_caution true)) ; @@ -638,24 +626,30 @@ let move_explore (gd: game_data) (dgs : danger array array) = let update_strat (gd : game_data) (dgs : danger array array) = match dgs.(gd.players.(gd.player_id).xy.x).(gd.players.(gd.player_id).xy.y) with | Safe -> () | Danger k -> () + | Bonus -> () | Fatal k -> (* should not happen *) current_status := EscapeDeath | Blocked -> failwith "did you just suffocate the player ?" ;; (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) +let debug_game_data1 (gd : game_data) = + Printf.fprintf stderr "[player %d started turn]\n" gd.player_id ;; + let debug_game_data (gd : game_data) = - Printf.fprintf stderr "[player %d]\n" gd.player_id ;; + Printf.fprintf stderr "[player %d ended turn]\n" gd.player_id ;; (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) -get_meta_info () ;; - let game_d = parse_input "entrees.txt" ;; let dangers = evaluate_dangers game_d ;; let gains = cell_values game_d ;; +get_meta_info game_d.player_id ;; + +(*debug_game_data1 game_d ;;*) + if debug_data then begin print_game_data game_d ; print_danger_levels dangers ; @@ -664,15 +658,21 @@ end ;; update_strat game_d dangers ;; +let chosen = ref 0 ;; + let main_actions () = match !current_status with | EscapeDeath -> - Printf.printf "%d " (move_safe game_d dangers) + chosen := move_safe game_d dangers ; + Printf.printf "%d " !chosen | BlowUpCrates -> - if dangers.(game_d.players.(game_d.player_id).xy.x).(game_d.players.(game_d.player_id).xy.y) = Safe then - Printf.printf "%d " (move_explore game_d dangers) + if dangers.(game_d.players.(game_d.player_id).xy.x).(game_d.players.(game_d.player_id).xy.y) = Safe then begin + chosen := move_explore game_d dangers ; + Printf.printf "%d " !chosen + end else begin current_status := EscapeDeath ; - Printf.printf "%d " (move_safe game_d dangers) + chosen := move_safe game_d dangers ; + Printf.printf "%d " !chosen end | ClaimLand -> () @@ -682,6 +682,10 @@ let main_actions () = match !current_status with main_actions () ; Printf.printf "%d" !action ; -debug_game_data game_d ;; +(*debug_game_data game_d ;;*) -set_meta_info () ;; \ No newline at end of file +Printf.fprintf stderr "[player %d went at direction " game_d.player_id ;; +print_direction !chosen ;; +Printf.fprintf stderr "with action %d] time at end : %f\n" !action game_d.dt ;; + +set_meta_info game_d.player_id ;; \ No newline at end of file diff --git a/main.sav b/main.sav index c227083..56a6051 100644 --- a/main.sav +++ b/main.sav @@ -1 +1 @@ -0 \ No newline at end of file +1 \ No newline at end of file diff --git a/main_0.sav b/main_0.sav new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/main_0.sav @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/main_1.sav b/main_1.sav new file mode 100644 index 0000000..56a6051 --- /dev/null +++ b/main_1.sav @@ -0,0 +1 @@ +1 \ No newline at end of file diff --git a/main_2.sav b/main_2.sav new file mode 100644 index 0000000..c227083 --- /dev/null +++ b/main_2.sav @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/main_3.sav b/main_3.sav new file mode 100644 index 0000000..c227083 --- /dev/null +++ b/main_3.sav @@ -0,0 +1 @@ +0 \ No newline at end of file diff --git a/sortie.txt b/sortie.txt index 4be3712..e69de29 100644 --- a/sortie.txt +++ b/sortie.txt @@ -1 +0,0 @@ -4 1 \ No newline at end of file