added another layer of security to is_dead + added 1st prototype of seek_player

This commit is contained in:
Alexandre 2025-01-01 18:50:57 +01:00
parent f555842ffc
commit 003a25f4cd
8 changed files with 161 additions and 47 deletions

BIN
again

Binary file not shown.

BIN
again.cmi

Binary file not shown.

BIN
again.cmx

Binary file not shown.

147
again.ml
View File

@ -49,7 +49,7 @@ type boost = {
let default_point = {
x = 0 ;
y = 0 ;
}
} (* works for dead players - inside a wall *)
let default_bomb = {
xy = default_point ;
@ -689,7 +689,7 @@ let reverse_simulate_bomb (dgs : danger_map) (save : (int * int, float) Hashtbl.
let is_dead (dgs : danger_map) (x : int) (y : int) (t : float) (dt : float) =
(List.fold_left (* bombs *)
(fun acc expl_time ->
acc || (t >= expl_time && t <= expl_time +. dt)
acc || (t >= expl_time && t <= expl_time +. dt) || (t >= expl_time -. dt && t <= expl_time)
)
false
dgs.explosionTimes.(x).(y)
@ -704,7 +704,7 @@ let is_dead (dgs : danger_map) (x : int) (y : int) (t : float) (dt : float) =
let is_dead_2 (dgs : danger_map) (x : int) (y : int) (t : float) (dt : float) =
(List.fold_left
(fun acc expl_time ->
acc || (t >= expl_time && t <= expl_time +. dt)
acc || (t >= expl_time && t <= expl_time +. dt) || (t >= expl_time -. dt && t <= expl_time)
)
false
dgs.explosionTimes.(x).(y)
@ -962,6 +962,98 @@ let rec move_crate (gd : game_data) (dgs : danger_map) =
(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *)
(* ---------------------------------------------------------------------------------------------------------------------------------------------------- *)
let path_seek (gd : game_data) (dgs : danger_map) (stime : float) (end_x : int) (end_y : int) (max_dist : int) (retval : bool ref) =
let lines = Array.length gd.laby
and cols = Array.length gd.laby.(0) in
let visited = Hashtbl.create 100 in
let q = Queue.create () in
let interval = Float.pow (0.9) (float_of_int gd.players.(gd.player_id).nspeed) in
let pid = gd.player_id in
let x0 = gd.players.(pid).xy.x
and y0 = gd.players.(pid).xy.y in
Queue.add (x0, y0, stime +. interval, 4, 1) q ;
Queue.add (x0+1, y0, stime +. interval, 2, 1) q ;
Queue.add (x0-1, y0, stime +. interval, 0, 1) q ;
Queue.add (x0, y0+1, stime +. interval, 1, 1) q ;
Queue.add (x0, y0-1, stime +. interval, 3, 1) q ;
try
while not (Queue.is_empty q) do
let (x, y, ct, direction, polar) = Queue.pop q in
(*Printf.fprintf stderr "at (%d %d)\n" x y;*)
if is_valid x y lines cols && gd.laby.(x).(y) <> 1 && gd.laby.(x).(y) <> 2 then begin (* within the map *)
if Hashtbl.find_opt visited (x, y, polar) = None then begin (* has not been visited yet *)
Hashtbl.add visited (x, y, polar) 1 ;
if
ct <= stime +. interval *. (float_of_int max_dist) &&
not (is_dead_all dgs x y ct interval false) &&
not (Array.fold_left (fun acc (b : bomb) -> acc || (b.xy.x = x && b.xy.y = y)) false gd.bombs) &&
polar <= 4
then begin
if
(x = end_x && y = end_y) (* dest tile *)
then begin
raise (ReturnInt direction)
end;
for dir = 0 to 3 do
Queue.add (x + (fst order.(dir)), y + (snd order.(dir)), ct +. interval, direction, polar) q ;
done;
Queue.add (x, y, ct +. interval, direction, polar+1) q
end
end
end
done;
retval := false ;
4 ;
with
| ReturnInt k ->
retval := true ;
k ;;
let seek_player (gd : game_data) (dgs : danger_map) =
(* returns whether or not it found a target, and prints if found *)
let pid = gd.player_id in
let cxi = gd.players.(pid).xy.x
and cyi = gd.players.(pid).xy.y in
let interval = Float.pow (0.9) (float_of_int gd.players.(gd.player_id).nspeed) in
let act = ref 0 in
let player_range = 3 * gd.players.(pid).ndash in
try
if gd.players.(pid).ntraps = 0 then begin
if logg then Printf.fprintf stderr "no trap\n";
raise (ReturnBool false);
end;
if logg then Printf.fprintf stderr "has trap(s)\n";
for pl = 0 to 3 do
if gd.players.(pl).id <> -1 then begin (* not dead *)
let within_range = ref false in
let direct = path_seek gd dgs (gd.dt -. interval *. !remaining_dash) gd.players.(pl).xy.x gd.players.(pl).xy.y player_range within_range in
if !within_range then begin
if logg then Printf.fprintf stderr "\n\nlesgo\n\n\n";
if gd.players.(pl).xy.x = cxi && gd.players.(pl).xy.y = cyi then begin
act := 3
end
else begin
if !remaining_dash = 0. then begin
remaining_dash := 3. ;
act := 2 ;
end
end;
Printf.printf "%d %d" direct !act ;
if logg then Printf.fprintf stderr "[player %d] trap [%d] %d, %d\n" gd.player_id pl direct !act;
raise (ReturnBool true)
end
end
done;
if logg then Printf.fprintf stderr "wont trap\n";
false
with
| ReturnBool b -> b ;;
let bfs_for_land ?return_x:(retx=fodder) ?return_y:(rety=fodder) ?return_ok:(retfl=bodder) (skip_near : bool) (gd : game_data) (dgs : danger_map) (x0 : int) (y0 : int) (target_x : int) (target_y : int) ?leniency:(lenc=1) (stime : float) (minDist : int) (maxDist : int) =
let lines = Array.length gd.laby
and cols = Array.length gd.laby.(0) in
@ -1042,7 +1134,7 @@ let bfs_for_land ?return_x:(retx=fodder) ?return_y:(rety=fodder) ?return_ok:(ret
retfl := true ;
k ;;
let move_land (gd : game_data) (dgs : danger_map) (gn : int array array) =
let rec move_land (gd : game_data) (dgs : danger_map) (gn : int array array) =
let max_cols = Array.mapi
(fun i lne ->
Array.fold_left
@ -1079,7 +1171,7 @@ let move_land (gd : game_data) (dgs : danger_map) (gn : int array array) =
let is_good = ref false in
let result_bomb = bfs_for_land ~return_ok:is_good true gd dgs cxi cyi xmax ymax gd.dt 1 80 in
if is_safe && gd.players.(pid).bomb_to_place > 0 && !is_good then begin
if is_safe && gd.players.(pid).bomb_to_place > 0 && !is_good && !action <> 2 then begin
if logg then Printf.fprintf stderr "kaboom\n" ;
action := 1 ;
result_bomb
@ -1093,9 +1185,25 @@ let move_land (gd : game_data) (dgs : danger_map) (gn : int array array) =
res
end
else begin
if logg then Printf.fprintf stderr "E\n" ;
let res = bfs_for_land ~leniency:20 false gd dgs cxi cyi xmax ymax gd.dt 1 80 in
res
if logg then Printf.fprintf stderr "no explosion ?\n" ;
let res = bfs_for_land ~leniency:20 ~return_ok:is_good false gd dgs cxi cyi xmax ymax gd.dt 1 80 in
if !is_good then begin
if logg then Printf.fprintf stderr "found\n";
res
end
else begin
if logg then Printf.fprintf stderr "Needs dash lmao (_2)\n";
if !remaining_dash <> 0. && gd.players.(pid).ndash > 0 then begin
if logg then Printf.fprintf stderr "-------------- Lets rewind time for a bit (_2) --------------\n";
remaining_dash := 3. ;
action := 2 ;
move_land gd dgs gn
end
else begin
if logg then Printf.fprintf stderr "Now you're screwed (_2)\n" ;
4
end
end
end
end ;;
@ -1144,6 +1252,7 @@ if game_map.player_id = 4 then begin
done
end ;;
(*Printf.fprintf stderr "\n" ;;
print_dangers danger_data ;;*)
@ -1152,17 +1261,19 @@ print_dangers danger_data ;;*)
print_dangers danger_data ;;*)
let direction = ref 4 ;;
if exists_crate game_map danger_data then begin
if logg then Printf.fprintf stderr "Crates\n" ;
direction := move_crate game_map danger_data
end
else begin
if logg then Printf.fprintf stderr "No crates\n" ;
direction := move_land game_map danger_data gain_map
end ;;
if true || not (seek_player game_map danger_data) then begin
if exists_crate game_map danger_data then begin
if logg then Printf.fprintf stderr "Crates\n" ;
direction := move_crate game_map danger_data
end
else begin
if logg then Printf.fprintf stderr "No crates\n" ;
direction := move_land game_map danger_data gain_map
end ;
Printf.printf "%d %d" !direction !action ;
if logg then Printf.fprintf stderr "[player %d] %d %d (at time %f - with %d dash potential)\n" game_map.player_id !direction !action game_map.dt (int_of_float !remaining_dash);;
Printf.printf "%d %d" !direction !action ;
if logg then Printf.fprintf stderr "[player %d] %d %d (at time %f - with %d dash potential)\n" game_map.player_id !direction !action game_map.dt (int_of_float !remaining_dash);
end;;
set_rem_dash ("again"^(string_of_int game_map.player_id)^".sav") ;;
(*set_meta_info game_map.player_id ;;*)
let __end = Unix.gettimeofday() ;;

BIN
again.o

Binary file not shown.

View File

@ -1,29 +1,31 @@
182.76300000000106
3
169.0
1
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 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 1
1 3 1 3 1 3 1 6 1 3 1 6 1 6 1 6 1 5 1 5 1
1 3 3 3 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 6 1
1 3 1 3 1 6 1 3 1 3 1 6 1 6 1 6 1 3 1 5 1
1 3 6 6 6 4 4 4 4 4 4 4 4 4 4 4 6 6 6 4 1
1 0 1 3 1 5 1 4 1 3 1 6 1 6 1 6 1 3 1 4 1
1 6 6 3 3 5 3 3 3 3 3 3 3 3 3 6 3 3 3 3 1
1 6 1 3 1 5 1 4 1 3 1 6 1 6 1 6 1 3 1 4 1
1 6 6 5 5 5 5 5 5 5 3 6 3 6 3 6 3 3 3 3 1
1 6 1 3 1 6 1 4 1 3 1 6 1 3 1 6 1 3 1 4 1
1 6 6 3 3 3 3 4 4 4 3 6 3 4 3 3 3 3 3 4 1
1 3 3 3 3 6 6 6 4 4 4 4 4 4 4 4 4 4 5 5 1
1 3 1 3 1 6 1 6 1 0 1 0 1 0 1 4 1 5 1 5 1
1 3 6 6 6 6 6 3 6 3 0 0 4 5 4 4 4 4 4 5 1
1 6 1 3 1 3 1 3 1 3 1 0 1 5 1 4 1 5 1 5 1
1 6 0 6 6 6 3 3 3 3 3 3 3 3 3 3 3 5 4 5 1
1 6 1 3 1 3 1 3 1 3 1 3 1 5 1 4 1 5 1 5 1
1 6 3 3 3 3 3 3 3 3 3 3 3 5 5 4 5 5 5 5 1
1 6 1 6 1 3 1 3 1 3 1 3 1 5 1 4 1 5 1 4 1
1 6 6 3 3 3 5 5 5 3 5 3 5 5 5 5 5 5 5 5 1
1 6 1 6 1 3 1 3 1 0 1 3 1 0 1 5 1 5 1 4 1
1 6 3 3 3 3 3 3 3 3 0 5 5 5 5 5 5 5 5 5 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
5
7 15 3 184.53200000000103
9 10 1 185.70000000000073
6 11 4 186.45991999999896
9 16 3 186.71900000000107
4 9 8 186.80500000000103
4
6 13 0 5 1 4 4 5
11 17 1 3 0 3 2 1
9 11 2 1 7 1 4 2
6 9 3 3 1 8 2 1
1
6 1 0
7
6 13 5 169.34300000000087
3 10 4 169.5
7 12 5 170.8010000000009
2 11 4 171.5
6 15 5 173.40000000000057
1 10 4 173.5
9 12 5 174.44600000000096
3
8 15 0 1 1 5 4 2
1 9 1 0 0 4 3 1
9 11 2 3 0 5 3 4
2
10 9 0
4 11 1

View File

@ -392,6 +392,7 @@ def execute_evenement(evenements, evenement, plateau, plateauCouleur, bombes, jo
indicePiege = trouve_objet(i,j, pieges)
penalite = 0
if indicePiege != None:
piege = pieges[indicePiege]
if piege[P_JOUEUR] != indiceJoueur:
penalite = 3
piege.pop(indicePiege)
@ -572,9 +573,9 @@ def simulation(strategies):
joueurs = []
for i in range(len(strategies)):
joueur = [positionsInitiales[i][0], positionsInitiales[i][1], strategies[i], 0, 1, 1, 1, 0, 0, 0, 0]
joueur = [positionsInitiales[i][0], positionsInitiales[i][1], strategies[i], 0, 1, 1, 1, 1, 0, 0, 0]
joueurs.append(joueur)
ajoute_evenement(evenements, [0., EVENEMENT_TOUR_JOUEUR, i])
ajoute_evenement(evenements, [0., EVENEMENT_TOUR_JOUEUR, i])
canvasInfosJoueurs = Canvas(width = LARGEUR_INFOS, height=len(joueurs)*HAUTEUR_JOUEUR)
canvasInfosJoueurs.pack()

View File

@ -1 +1 @@
1
0