Evolve to mutlipod management.
This commit is contained in:
parent
2be6ac9930
commit
1089f6cd49
2 changed files with 234 additions and 197 deletions
|
@ -86,7 +86,6 @@ let module CheckpointList = struct
|
|||
(ck_li.mem)
|
||||
|> List.map (fun cur -> (Vector.equal elem cur))
|
||||
|> List.fold_left (fun acc elem -> acc || elem) false
|
||||
|
||||
end in
|
||||
|
||||
let parse_line1 () =
|
||||
|
|
|
@ -52,14 +52,39 @@ end in
|
|||
|
||||
let module Pod = struct
|
||||
type t = {
|
||||
mutable id : int ;
|
||||
mutable pos : Vector.t ;
|
||||
mutable dir : Vector.t ;
|
||||
mutable has_boost : bool ;
|
||||
mutable checkpoint_pos : Vector.t ;
|
||||
mutable checkpoint_dist : int ;
|
||||
mutable checkpoint_angle : int ;
|
||||
mutable output_str : string
|
||||
}
|
||||
|
||||
let create () =
|
||||
{ pos = Vector.create 0 0 ;
|
||||
dir = Vector.create 0 0
|
||||
{
|
||||
id = 0 ;
|
||||
pos = Vector.create 0 0 ;
|
||||
dir = Vector.create 0 0 ;
|
||||
has_boost = true ;
|
||||
checkpoint_pos = Vector.create 0 0 ;
|
||||
checkpoint_dist = 0 ;
|
||||
checkpoint_angle = 0 ;
|
||||
output_str = ""
|
||||
}
|
||||
|
||||
let use_boost pod =
|
||||
pod.has_boost <- false
|
||||
|
||||
let update pod (pos, checkpoint_pos, checkpoint_dist, checkpoint_angle) =
|
||||
pod.pos <- pos ;
|
||||
pod.checkpoint_pos <- checkpoint_pos ;
|
||||
pod.checkpoint_dist <- checkpoint_dist ;
|
||||
pod.checkpoint_angle <- checkpoint_angle ;
|
||||
pod
|
||||
|
||||
|
||||
end in
|
||||
|
||||
let module CheckpointList = struct
|
||||
|
@ -96,7 +121,74 @@ let module CheckpointList = struct
|
|||
|
||||
end in
|
||||
|
||||
let parse_line1 () =
|
||||
let module Game = struct
|
||||
type t = {
|
||||
pods : Pod.t array ;
|
||||
opponents : Pod.t array ;
|
||||
ticks : int ;
|
||||
}
|
||||
end in
|
||||
|
||||
let module Strategy = struct
|
||||
let apply game pod =
|
||||
if !first_turn then begin
|
||||
old_pod := pod ;
|
||||
first_turn := false
|
||||
end ;
|
||||
let movement = Vector.diff pod !old_pod in
|
||||
|
||||
if (CheckpointList.inc !checkpoint_list checkpoint) then begin
|
||||
prerr_endline "List already includes this checkpoint" ;
|
||||
end else begin
|
||||
checkpoint_list := (CheckpointList.add !checkpoint_list checkpoint) ;
|
||||
fprintf stderr "New checkpoint : %s\n%!" (Vector.to_string checkpoint);
|
||||
end ;
|
||||
|
||||
(* output "x y thrust" : the target position + the power *)
|
||||
let is_aligned = checkpoint_angle > -2 && checkpoint_angle < 2 in
|
||||
let is_near_aligned =
|
||||
(checkpoint_angle > -15 && checkpoint_angle <= -2) ||
|
||||
(checkpoint_angle >= 2 && checkpoint_angle < 15)
|
||||
in
|
||||
let is_wide_aligned =
|
||||
(checkpoint_angle > -45 && checkpoint_angle <= -15) ||
|
||||
(checkpoint_angle >= 15 && checkpoint_angle < 45)
|
||||
in
|
||||
let is_aside =
|
||||
(checkpoint_angle > -85 && checkpoint_angle <= -45) ||
|
||||
(checkpoint_angle >= 45 && checkpoint_angle < 85)
|
||||
in
|
||||
let is_behind = checkpoint_angle >= 85 || checkpoint_angle <= -85 in
|
||||
let use_boost =
|
||||
(!tick > 100) && is_aligned && (Vector.is_far pod checkpoint)
|
||||
in
|
||||
|
||||
debug "angle = %d\n%!" checkpoint_angle ;
|
||||
|
||||
let thrust =
|
||||
(* droit devant *)
|
||||
if is_behind && (Vector.is_touching pod opponent) then 20
|
||||
else if is_aside && (Vector.is_touching pod opponent) then 20
|
||||
else if is_behind then 6
|
||||
else if is_aside && (Vector.is_near checkpoint pod) then 10
|
||||
else if is_wide_aligned && (Vector.is_near checkpoint pod) then 20
|
||||
else if is_near_aligned && (Vector.is_near checkpoint pod) then 40
|
||||
else 100
|
||||
in
|
||||
|
||||
let power_str = match use_boost with
|
||||
| false -> string_of_int thrust
|
||||
| true -> "BOOST"
|
||||
in
|
||||
|
||||
let target = Vector.add checkpoint (Vector.mult movement (-3)) in
|
||||
|
||||
printf "%d %d %s\n%!" target.x target.y power_str ;
|
||||
|
||||
|
||||
end in
|
||||
|
||||
let parse_pod_line () =
|
||||
let line = input_line stdin in
|
||||
let build_results_fn = (
|
||||
fun x y checkpointx checkpointy checkpointdist checkpointangle ->
|
||||
|
@ -108,15 +200,6 @@ let parse_line1 () =
|
|||
Scanf.sscanf line "%d %d %d %d %d %d" build_results_fn
|
||||
in
|
||||
|
||||
let parse_line2 () =
|
||||
let line = input_line stdin in
|
||||
let build_results_fn = (
|
||||
fun opponentx opponenty ->
|
||||
(Vector.create opponentx opponenty)
|
||||
) in
|
||||
Scanf.sscanf line "%d %d" build_results_fn
|
||||
in
|
||||
|
||||
let map_center = Vector.create (16000 / 2) (9000 / 2) in
|
||||
let first_turn = ref true in
|
||||
let old_pod = ref (Vector.create 0 0) in
|
||||
|
@ -147,68 +230,23 @@ let parse_init () =
|
|||
done
|
||||
in
|
||||
|
||||
let pods = Array.create 2 (Pod.create ()) in
|
||||
let pods = Array.make 2 (Pod.create ()) in
|
||||
let game = Game.create () in
|
||||
|
||||
(* game loop *)
|
||||
while true do
|
||||
(* read pod1 line & update game data *)
|
||||
parse_pod_line () |> Pod.update game.pods.(0) ;
|
||||
parse_pod_line () |> Pod.update game.pods.(1) ;
|
||||
parse_pod_line () |> Pod.update game.opponents.(0) ;
|
||||
parse_pod_line () |> Pod.update game.opponents.(1) ;
|
||||
|
||||
|
||||
(* nextcheckpointdist: distance to the next checkpoint *)
|
||||
(* nextcheckpointangle: angle between your pod orientation and the direction of the next checkpoint *)
|
||||
let pod, checkpoint, checkpoint_dist, checkpoint_angle = parse_line1 () in
|
||||
let opponent = parse_line2 () in
|
||||
|
||||
if !first_turn then begin
|
||||
old_pod := pod ;
|
||||
first_turn := false
|
||||
end ;
|
||||
let movement = Vector.diff pod !old_pod in
|
||||
|
||||
if (CheckpointList.inc !checkpoint_list checkpoint) then begin
|
||||
prerr_endline "List already includes this checkpoint" ;
|
||||
end else begin
|
||||
checkpoint_list := (CheckpointList.add !checkpoint_list checkpoint) ;
|
||||
fprintf stderr "New checkpoint : %s\n%!" (Vector.to_string checkpoint);
|
||||
end ;
|
||||
|
||||
(* output "x y thrust" : the target position + the power *)
|
||||
let is_aligned = checkpoint_angle > -2 && checkpoint_angle < 2 in
|
||||
let is_near_aligned =
|
||||
(checkpoint_angle > -15 && checkpoint_angle <= -2) ||
|
||||
(checkpoint_angle >= 2 && checkpoint_angle < 15)
|
||||
in
|
||||
let is_wide_aligned =
|
||||
(checkpoint_angle > -45 && checkpoint_angle <= -15) ||
|
||||
(checkpoint_angle >= 15 && checkpoint_angle < 45)
|
||||
in
|
||||
let is_aside =
|
||||
(checkpoint_angle > -85 && checkpoint_angle <= -45) ||
|
||||
(checkpoint_angle >= 45 && checkpoint_angle < 85)
|
||||
in
|
||||
let is_behind = checkpoint_angle >= 85 || checkpoint_angle <= -85 in
|
||||
let use_boost = (!tick > 100) && is_aligned && (Vector.is_far pod checkpoint) in
|
||||
|
||||
debug "angle = %d\n%!" checkpoint_angle ;
|
||||
|
||||
let thrust =
|
||||
(* droit devant *)
|
||||
if is_behind && (Vector.is_touching pod opponent) then 20
|
||||
else if is_aside && (Vector.is_touching pod opponent) then 20
|
||||
else if is_behind then 6
|
||||
else if is_aside && (Vector.is_near checkpoint pod) then 10
|
||||
else if is_wide_aligned && (Vector.is_near checkpoint pod) then 20
|
||||
else if is_near_aligned && (Vector.is_near checkpoint pod) then 40
|
||||
else 100
|
||||
in
|
||||
|
||||
let power_str = match use_boost with
|
||||
| false -> string_of_int thrust
|
||||
| true -> "BOOST"
|
||||
in
|
||||
|
||||
let target = Vector.add checkpoint (Vector.mult movement (-3)) in
|
||||
|
||||
printf "%d %d %s\n%!" target.x target.y power_str ;
|
||||
for i = 0 to 1 do
|
||||
game.pods.(i)
|
||||
|> Pod.update pod1_data
|
||||
|> Strategy.apply
|
||||
|> fun pod -> print_endline pod.output_str ;
|
||||
done
|
||||
|
||||
tick := !tick + 1 ;
|
||||
old_pod := pod ;
|
||||
|
|
Loading…
Reference in a new issue