diff --git a/again b/again index 19bc11d..167df63 100755 Binary files a/again and b/again differ diff --git a/again.cmi b/again.cmi index 0bbadd0..637b87e 100644 Binary files a/again.cmi and b/again.cmi differ diff --git a/again.cmx b/again.cmx index 84604f8..0e9b5d5 100644 Binary files a/again.cmx and b/again.cmx differ diff --git a/again.ml b/again.ml index bb928e9..1d9b34e 100644 --- a/again.ml +++ b/again.ml @@ -470,7 +470,7 @@ let simulate_bomb (dgs : danger_map) (b : bomb) = done; saved_data ;; -let simulate_bomb_deconstruct (dgs : danger_map) (bx : int) (by : int) (bsize : int) (dtime0 : float) = +let simulate_bomb_deconstruct (gd : game_data) (dgs : danger_map) (bx : int) (by : int) (bsize : int) (dtime0 : float) = let saved_data = Hashtbl.create 30 in let dtime = min dtime0 (List.fold_left min (32760.) dgs.explosionTimes.(bx).(by)) in let lines = Array.length dgs.explosionTimes @@ -487,6 +487,25 @@ let simulate_bomb_deconstruct (dgs : danger_map) (bx : int) (by : int) (bsize : end done; done; + let pid = gd.player_id in + Array.iter (fun (pl : player) -> + if pl.id <> pid then begin + let dtimep = min (gd.dt +. 5.5) (List.fold_left min (32760.) dgs.explosionTimes.(pl.xy.x).(pl.xy.y)) in + for dir = 0 to 3 do + for w = 0 to bsize do + if (w > 0 || dir = 0) then begin + let nx = pl.xy.x + w * (fst order.(dir)) + and ny = pl.xy.y + w * (snd order.(dir)) in + if is_valid nx ny lines cols then begin + Hashtbl.add saved_data (nx, ny) dtimep ; + dgs.explosionTimes.(nx).(ny) <- (dtimep)::(dgs.explosionTimes.(nx).(ny)) + end + end + done; + done; + end + ) + gd.players ; saved_data ;; (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) @@ -586,14 +605,15 @@ let generate_dead_end_map (gd : game_data) = ((x = gd.players.(pid).xy.x && y = gd.players.(pid).xy.y) || not (Array.fold_left (fun acc (b : bomb) -> acc || (b.xy.x = x && b.xy.y = y)) false gd.bombs))(*&& (not (Array.fold_left (fun acc (p : player) -> acc || (p.xy.x = x && p.xy.y = y && p.id <> pid)) false gd.players))*) then begin - Hashtbl.add visited (x, y) 1 ; + if not (x = gd.players.(pid).xy.x && y = gd.players.(pid).xy.y) then + Hashtbl.add visited (x, y) 1 ; if (amt_free_adj_spaces gd x y) >= 3 || (x = gd.players.(pid).xy.x && y = gd.players.(pid).xy.y) then begin if prev <> [] then Hashtbl.remove visited (x, y) ; List.iter (fun (cx, cy) -> res.(cx).(cy) <- 0) ((x, y)::prev) ; for dir = 0 to 3 do - if fpass || (dir + 2) mod 4 <> last_dir then (* dont backtrack *) - dfs (x + fst (order.(dir))) (y + snd (order.(dir))) [] dir false + if fpass <> 0 || (dir + 2) mod 4 <> last_dir then (* dont backtrack *) + dfs (x + fst (order.(dir))) (y + snd (order.(dir))) [] dir (max 0 (fpass-1)) done end else begin @@ -604,7 +624,7 @@ let generate_dead_end_map (gd : game_data) = end end in - dfs gd.players.(pid).xy.x gd.players.(pid).xy.y [] 4 true; + dfs gd.players.(pid).xy.x gd.players.(pid).xy.y [] 4 1; (* fills remaining spaces with BFS *) let bfs (x0 : int) (y0 : int) = @@ -655,13 +675,13 @@ let reverse_simulate_bomb (dgs : danger_map) (save : (int * int, float) Hashtbl. save ;; let is_dead (dgs : danger_map) (x : int) (y : int) (t : float) (dt : float) = - (List.fold_left + (List.fold_left (* bombs *) (fun acc curtime -> acc || (t >= curtime && t <= curtime +. dt) ) false dgs.explosionTimes.(x).(y) - ) || (List.fold_left + ) || (List.fold_left (* player-related bombs (only if in range of another bomb) *) (fun acc curtime -> acc || (t >= curtime && t <= curtime +. dt) ) @@ -755,8 +775,10 @@ let is_a_crate_nearby (gd : game_data) (dgs : danger_map) = let nx = gd.players.(pid).xy.x + o * (fst order.(dir)) and ny = gd.players.(pid).xy.y + o * (snd order.(dir)) in if is_valid nx ny lines cols then begin - if gd.laby.(nx).(ny) = 2 then - res := true + if gd.laby.(nx).(ny) = 2 && not dgs.explodedCrates.(nx).(ny) then begin + res := true; + halt := true + end else if gd.laby.(nx).(ny) = 1 then halt := true else if dgs.bonusMap.(nx).(ny) then @@ -783,8 +805,10 @@ let sees_a_crate (gd : game_data) (dgs : danger_map) (x : int) (y : int) = let nx = x + o * (fst order.(dir)) and ny = y + o * (snd order.(dir)) in if is_valid nx ny lines cols then begin - if gd.laby.(nx).(ny) = 2 then - res := true + if gd.laby.(nx).(ny) = 2 && not dgs.explodedCrates.(nx).(ny) then begin + res := true; + halt := true + end else if gd.laby.(nx).(ny) = 1 then halt := true else if dgs.bonusMap.(nx).(ny) then @@ -886,7 +910,7 @@ let move_crate (gd : game_data) (dgs : danger_map) = if Array.exists (fun (p : player) -> p.id <> pid && p.xy.x = cxi && p.xy.y = cyi) gd.players && (is_empty_lst dgs.explosionTimes.(cxi).(cyi)) then begin if gd.players.(pid).bomb_to_place > 0 then begin if logg then Printf.fprintf stderr "oh no you dont\n" ; - let saved_p = simulate_bomb_deconstruct dgs cxi cyi gd.players.(pid).bomb_radius (gd.dt +. 5.5) in + let saved_p = simulate_bomb_deconstruct gd dgs cxi cyi gd.players.(pid).bomb_radius (gd.dt +. 5.5) in let bonusres_2p = bfs_for_crate gd dgs cxi cyi gd.dt false true false 0 false 5 in if bonusres_2p <> 4 then begin @@ -903,10 +927,10 @@ let move_crate (gd : game_data) (dgs : danger_map) = reverse_simulate_bomb dgs saved_p ; end end; - if (is_a_crate_nearby gd dgs) && (is_empty_lst dgs.explosionTimes.(cxi).(cyi)) then begin + if (is_a_crate_nearby gd dgs)(* && (is_empty_lst dgs.explosionTimes.(cxi).(cyi)) *)then begin if gd.players.(pid).bomb_to_place > 0 then begin if logg then Printf.fprintf stderr "trying...\n" ; - let saved = simulate_bomb_deconstruct dgs cxi cyi gd.players.(pid).bomb_radius (gd.dt +. 5.5) in + let saved = simulate_bomb_deconstruct gd dgs cxi cyi gd.players.(pid).bomb_radius (gd.dt +. 5.5) in let bonus2_x = ref 0 and bonus2_y = ref 0 in let bonusres_2 = bfs_for_crate ~return_x:bonus2_x ~return_y:bonus2_y gd dgs cxi cyi gd.dt false true false 0 false 5 in @@ -923,9 +947,6 @@ let move_crate (gd : game_data) (dgs : danger_map) = end; reverse_simulate_bomb dgs saved ; end - else begin - raise (ReturnInt 4) - end; end; if logg then Printf.fprintf stderr "bonusing...\n" ; let bonus_x = ref 0 @@ -989,7 +1010,7 @@ let move_land_2 (gd : game_data) (dgs : danger_map) (gns : int array array) = (is_empty_lst dgs.explosionTimes.(cxi).(cyi)) then begin if logg then Printf.fprintf stderr "trying...\n" ; - let _ = simulate_bomb_deconstruct dgs cxi cyi gd.players.(pid).bomb_radius (gd.dt +. 5.5) in + let _ = simulate_bomb_deconstruct gd dgs cxi cyi gd.players.(pid).bomb_radius (gd.dt +. 5.5) in let result = goto_tile gd dgs cxi cyi x y gd.dt in if result <> 4 then begin action := 1 ; diff --git a/again.o b/again.o index e0862b2..eaedde0 100644 Binary files a/again.o and b/again.o differ diff --git a/entrees.txt b/entrees.txt index 1c9ae86..f3b59c9 100644 --- a/entrees.txt +++ b/entrees.txt @@ -1,24 +1,29 @@ -330.0 -3 +93.0 +2 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 6 6 0 2 0 0 5 5 5 5 5 5 5 5 5 5 1 -1 3 1 6 1 0 1 2 1 0 1 5 1 5 1 4 1 5 1 5 1 -1 3 6 6 6 0 0 5 5 5 5 5 5 5 5 5 5 5 5 5 1 -1 3 1 3 1 0 1 2 1 5 1 5 1 5 1 4 1 4 1 5 1 -1 3 6 3 0 2 2 0 5 5 5 5 5 5 5 5 4 4 4 5 1 -1 3 1 3 1 2 1 0 1 5 1 5 1 5 1 5 1 4 1 5 1 -1 3 3 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5 4 5 1 -1 6 1 3 1 2 1 5 1 5 1 5 1 0 1 5 1 4 1 5 1 -1 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 1 -1 6 1 3 1 2 1 5 1 5 1 5 1 5 1 4 1 4 1 4 1 -1 3 3 3 5 5 5 5 5 5 5 5 5 5 5 5 5 4 4 4 1 +1 3 3 3 0 2 2 2 2 2 2 0 2 2 2 2 0 5 5 5 1 +1 3 1 0 1 2 1 2 1 2 1 0 1 2 1 2 1 0 1 5 1 +1 3 3 0 2 2 2 2 2 2 2 2 0 0 2 2 0 5 5 5 1 +1 3 1 2 1 2 1 2 1 2 1 2 1 0 1 2 1 0 1 5 1 +1 3 0 2 0 0 0 2 2 2 2 2 0 2 2 2 0 5 4 5 1 +1 3 1 0 1 6 1 2 1 2 1 2 1 2 1 0 1 5 1 5 1 +1 6 6 6 6 6 2 0 2 0 2 2 0 2 2 5 5 5 5 5 1 +1 3 1 6 1 6 1 2 1 2 1 2 1 2 1 2 1 5 1 4 1 +1 6 6 6 6 6 6 0 2 2 0 2 0 2 0 5 5 4 5 5 1 +1 6 1 6 1 6 1 2 1 0 1 2 1 2 1 2 1 4 1 4 1 +1 6 6 6 6 6 6 0 2 2 2 2 2 2 5 5 5 5 5 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 -0 -3 -5 1 0 2 1 3 1 1 -11 6 2 1 4 3 1 4 -2 3 3 0 2 1 3 0 2 -1 6 3 -5 4 3 +11 19 2 94.5 +9 18 2 97.5 +2 +9 17 1 0 1 1 1 2 +9 19 2 0 0 2 0 0 +6 +1 4 0 +9 7 0 +11 7 3 +6 3 0 +5 5 3 +4 17 3 diff --git a/sortie.txt b/sortie.txt index 389086a..4a3b60a 100644 --- a/sortie.txt +++ b/sortie.txt @@ -1 +1 @@ -2 0 \ No newline at end of file +0 0 \ No newline at end of file