diff --git a/again b/again index 0529b2c..6a935d4 100755 Binary files a/again and b/again differ diff --git a/again.cmi b/again.cmi index 7970f1a..3e7a71b 100644 Binary files a/again.cmi and b/again.cmi differ diff --git a/again.cmx b/again.cmx index 6eb26fa..9301440 100644 Binary files a/again.cmx and b/again.cmx differ diff --git a/again.ml b/again.ml index 46281d6..39506c7 100644 --- a/again.ml +++ b/again.ml @@ -2,8 +2,9 @@ TODO : - deal with double bombing (DONE) - well shit ==> dash -- deeper analysis on pathfinfing (1/2) +- deeper analysis on pathfinfing (n-1/n) - correct fatal bug on player death (DONE) +- solve when player is on a bomb on an intersection *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) (* ---------------------------------------------------------------------------------------------------------------------------------------------------- *) @@ -498,7 +499,7 @@ let tile_distance (gd : game_data) (x0 : int) (y0 : int) (end_x : int) (end_y : try while not (Queue.is_empty q) do let (x, y, depth) = Queue.pop q in - if is_valid x y lines cols && gd.laby.(x).(y) <> 1 && gd.laby.(x).(y) <> 2 && not (Array.fold_left (fun acc (b : bomb) -> acc || (b.xy.x = x && b.xy.y = y)) false gd.bombs) then begin + if is_valid x y lines cols && gd.laby.(x).(y) <> 1 && gd.laby.(x).(y) <> 2 then begin if Hashtbl.find_opt visited (x, y) = None then begin (* has not been visited yet *) Hashtbl.add visited (x, y) 1 ; if (x = end_x && y = end_y) then begin @@ -541,52 +542,18 @@ let amt_free_adj_spaces (gd : game_data) (x : int) (y : int) = and cols = Array.length gd.laby.(0) in Array.fold_left (fun acc (ox, oy) -> - if (is_valid (x+ox) (y+oy) lines cols && gd.laby.(x+ox).(y+oy) <> 1 && gd.laby.(x+ox).(y+oy) <> 2 && not (Array.fold_left (fun acc (b : bomb) -> acc || (b.xy.x = x+ox && b.xy.y = y+oy)) false gd.bombs)) then acc+1 else acc + if not (ox = 0 && oy = 0) && (is_valid (x+ox) (y+oy) lines cols && gd.laby.(x+ox).(y+oy) <> 1 && gd.laby.(x+ox).(y+oy) <> 2 && not (Array.fold_left (fun acc (b : bomb) -> acc || (b.xy.x = x+ox && b.xy.y = y+oy)) false gd.bombs)) then acc+1 else acc ) 0 order ;; let max_depth = 12345 ;; let is_player_nearby (gd : game_data) (x0 : int) (y0 : int) (detect_dist : int) = - let pid = gd.player_id in - let lines = Array.length gd.laby - and cols = Array.length gd.laby.(0) in - (* DFS to find whether or not there are nearby players *) - let visited = Hashtbl.create 40 in - Hashtbl.add visited (x0, y0) 1 ; - let rec dfs x y depth = - if - (Hashtbl.find_opt visited (x, y) = None) && - (depth <= detect_dist) && - (is_valid x y lines cols) && - (gd.laby.(x).(y) <> 1 && gd.laby.(x).(y) <> 2) && - (not (Array.fold_left (fun acc (b : bomb) -> acc || (b.xy.x = x && b.xy.y = y)) false gd.bombs)) - then begin - Hashtbl.add visited (x, y) 1; - if Array.exists (fun (p : player) -> p.xy.x = x && p.xy.y = y && p.id <> gd.player_id) gd.players then begin - raise (ReturnBool true) - end - else begin - for dir = 0 to 3 do - dfs (x + fst order.(dir)) (y + snd order.(dir)) (depth+1) - done - end - end - in - try - (* if another player is stacked *) - if Array.fold_left (fun acc (p : player) -> acc || (p.id <> pid && p.xy.x = gd.players.(pid).xy.x && p.xy.y = gd.players.(pid).xy.y)) false gd.players then - raise (ReturnBool true) ; - dfs (gd.players.(pid).xy.x +1) (gd.players.(pid).xy.y) 0; - dfs (gd.players.(pid).xy.x -1) (gd.players.(pid).xy.y) 0; - dfs (gd.players.(pid).xy.x) (gd.players.(pid).xy.y +1) 0; - dfs (gd.players.(pid).xy.x) (gd.players.(pid).xy.y -1) 0; - false - with - | ReturnBool b -> b ;; + let mind = min_dist_from_player gd x0 y0 in + (mind <= detect_dist) ;; let is_dead_end (gd : game_data) (xstart : int) (ystart : int) (xban : int) (yban : int) = - if not (is_player_nearby gd gd.players.(gd.player_id).xy.x gd.players.(gd.player_id).xy.y max_depth) then + if not (is_player_nearby gd gd.players.(gd.player_id).xy.x gd.players.(gd.player_id).xy.y 3) then false (* if no one is nearby, it's safe to go there (hopefully) *) else begin let lines = Array.length gd.laby @@ -732,7 +699,7 @@ let goto_tile (gd : game_data) (dgs : danger_map) (x0 : int) (y0 : int) (end_x : raise (ReturnInt direction) end; (*Queue.add (x, y, ct +. interval, direction) q ;*) - if not (x0 == x && y0 == y) then begin + if not (is_player_nearby gd x y 3 && amt_free_adj_spaces gd (gd.players.(pid).xy.x + fst order.(direction)) (gd.players.(pid).xy.y + snd order.(direction)) = 1) && not (x0 == x && y0 == y) then begin for dir = 0 to 3 do Queue.add (x + (fst order.(dir)), y + (snd order.(dir)), ct +. interval, direction) q ; done; @@ -846,7 +813,7 @@ let bfs_for_crate (gd : game_data) (dgs : danger_map) (x0 : int) (y0 : int) (sti raise (ReturnInt direction) end; (*Queue.add (x, y, ct +. interval, direction, polar+1) q ;*) - if not (x0 == x && y0 == y) then begin + if not (x0 == x && y0 == y) && (not (is_player_nearby gd x y 3 && amt_free_adj_spaces gd (gd.players.(pid).xy.x + fst order.(direction)) (gd.players.(pid).xy.y + snd order.(direction)) = 1)) then begin for dir = 0 to 3 do Queue.add (x + (fst order.(dir)), y + (snd order.(dir)), ct +. interval, direction, polar) q ; done; diff --git a/again.o b/again.o index 02ffa59..60d8fd2 100644 Binary files a/again.o and b/again.o differ diff --git a/entrees.txt b/entrees.txt index 1f5cdc3..a673742 100644 --- a/entrees.txt +++ b/entrees.txt @@ -1,26 +1,26 @@ -187.24208499999915 -2 +183.6000000000002 +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 3 3 6 3 3 3 3 0 0 0 0 5 5 5 5 1 -1 3 1 3 1 3 1 6 1 0 1 3 1 5 1 0 1 5 1 5 1 -1 3 3 3 3 3 3 6 3 0 0 3 5 5 5 5 5 5 5 5 1 -1 3 1 3 1 3 1 6 1 6 1 3 1 5 1 5 1 0 1 0 1 -1 3 3 5 3 4 3 6 3 5 0 3 0 3 3 3 3 3 3 0 1 -1 3 1 5 1 4 1 6 1 5 1 3 1 4 1 4 1 4 1 0 1 -1 0 0 4 4 4 4 4 6 6 6 6 6 6 4 4 3 3 3 3 1 -1 0 1 5 1 4 1 6 1 5 1 0 1 4 1 4 1 4 1 3 1 -1 5 5 5 5 4 5 6 6 5 6 5 6 6 4 4 4 4 4 3 1 -1 5 1 6 1 5 1 6 1 6 1 5 1 0 1 4 1 4 1 3 1 -1 5 6 6 6 5 6 6 6 6 6 6 5 5 4 4 4 4 4 4 1 +1 3 3 3 3 3 3 3 0 0 0 4 4 4 4 5 5 5 5 5 1 +1 3 1 3 1 3 1 3 1 0 1 0 1 4 1 4 1 5 1 5 1 +1 3 6 3 6 3 3 3 3 3 3 3 4 4 4 4 4 5 5 5 1 +1 3 1 0 1 3 1 3 1 3 1 0 1 4 1 4 1 4 1 5 1 +1 6 3 3 3 3 3 3 3 3 3 3 4 4 4 4 4 5 4 5 1 +1 3 1 3 1 6 1 3 1 5 1 5 1 5 1 5 1 4 1 4 1 +1 3 3 6 6 5 5 3 5 5 5 5 5 5 5 5 5 4 4 4 1 +1 3 1 3 1 6 1 5 1 5 1 5 1 5 1 5 1 4 1 4 1 +1 3 6 3 6 6 6 5 6 6 5 5 5 5 5 5 4 4 4 4 1 +1 6 1 6 1 3 1 4 1 5 1 5 1 5 1 4 1 4 1 4 1 +1 6 6 6 4 4 4 4 4 4 4 6 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 -5 1 3 189.5 -7 4 6 190.30000000000013 -6 3 2 192.5 +8 9 3 186.5850000000011 +2 7 2 187.30000000000018 +9 10 3 188.04300000000111 4 -7 1 0 0 2 3 1 1 -5 3 1 0 0 2 1 3 -6 3 2 6 1 2 2 2 -7 5 3 1 0 6 1 1 +1 8 0 1 1 2 1 4 +9 8 1 3 1 3 1 1 +9 8 2 1 4 2 2 0 +9 11 3 1 4 2 0 2 0 diff --git a/sortie.txt b/sortie.txt index 4a3b60a..92880af 100644 --- a/sortie.txt +++ b/sortie.txt @@ -1 +1 @@ -0 0 \ No newline at end of file +1 1 \ No newline at end of file