144 lines
4.3 KiB
Python
144 lines
4.3 KiB
Python
import sys
|
|
import math
|
|
|
|
MAP_RADIUS = 6000
|
|
|
|
|
|
class Position:
|
|
def __init__(self, x, y):
|
|
self.x = x
|
|
self.y = y
|
|
|
|
def distance_to(self, other):
|
|
if other is None:
|
|
return math.inf
|
|
return ((self.x - other.x)**2 + (self.y - other.y)**2) ** 0.5
|
|
|
|
|
|
class Entity(Position):
|
|
def __init__(self, id, x, y, radius, mass):
|
|
super().__init__(x, y)
|
|
self.id = id
|
|
self.radius = radius
|
|
self.mass = mass
|
|
|
|
|
|
class Vehicle(Entity):
|
|
def __init__(self, id, x, y, player, mass, radius, vx, vy):
|
|
super().__init__(id, x, y, radius, mass)
|
|
self.player = player
|
|
self.mass = mass
|
|
self.friction = 0.2
|
|
self.vx = vx
|
|
self.vy = vy
|
|
|
|
|
|
class Reaper(Vehicle):
|
|
def play(self, target):
|
|
print("{} {} 250".format(target.x, target.y))
|
|
|
|
|
|
class Destroyer(Vehicle):
|
|
def play(self, target):
|
|
print('{} {} 250'.format(target.x, target.y))
|
|
|
|
|
|
class Tanker(Vehicle):
|
|
def __init__(self, id, x, y, player, mass, radius, vx, vy, water, max_water):
|
|
super().__init__(id, x, y, player, mass, radius, vx, vy)
|
|
self.water = water
|
|
self.max_water = max_water
|
|
|
|
|
|
class Wreck(Tanker):
|
|
pass
|
|
|
|
|
|
def main():
|
|
# Auto-generated code below aims at helping you parse
|
|
# the standard input according to the problem statement.
|
|
|
|
# game loop
|
|
while True:
|
|
my_score = int(input())
|
|
enemy_score_1 = int(input())
|
|
enemy_score_2 = int(input())
|
|
my_rage = int(input())
|
|
enemy_rage_1 = int(input())
|
|
enemy_rage_2 = int(input())
|
|
unit_count = int(input())
|
|
my_reaper = None
|
|
enemy_reaper_1 = None
|
|
enemy_reaper_2 = None
|
|
my_destroyer = None
|
|
enemy_destroyer_1 = None
|
|
enemy_destroyer_2 = None
|
|
wrecks = []
|
|
nearest_wreck = None
|
|
shortest_wreck_distance = math.inf
|
|
tankers = []
|
|
nearest_tanker = None
|
|
shortest_tanker_distance = math.inf
|
|
for i in range(unit_count):
|
|
unit_id, unit_type, player, mass, radius, x, y, vx, vy, extra, extra_2 = input().split()
|
|
unit_id = int(unit_id)
|
|
unit_type = int(unit_type)
|
|
player = int(player)
|
|
mass = float(mass)
|
|
radius = int(radius)
|
|
x = int(x)
|
|
y = int(y)
|
|
vx = int(vx)
|
|
vy = int(vy)
|
|
extra = int(extra)
|
|
extra_2 = int(extra_2)
|
|
|
|
if unit_type == 0:
|
|
reaper = Reaper(unit_id, x, y, player, mass, radius, vx, vy)
|
|
if player == 0:
|
|
my_reaper = reaper
|
|
elif player == 1:
|
|
enemy_reaper_1 = reaper
|
|
elif player == 2:
|
|
enemy_reaper_2 = reaper
|
|
|
|
elif unit_type == 1:
|
|
destroyer = Destroyer(unit_id, x, y, player, mass, radius, vx, vy)
|
|
if player == 0:
|
|
my_destroyer = destroyer
|
|
elif player == 1:
|
|
enemy_destroyer_1 = destroyer
|
|
elif player == 2:
|
|
enemy_destroyer_2 = destroyer
|
|
|
|
elif unit_type == 3:
|
|
tanker = Tanker(unit_id, x, y, player, mass, radius, vx, vy, extra, extra_2)
|
|
tankers.append(tanker)
|
|
if nearest_tanker is None and tanker.water > 0:
|
|
nearest_tanker = tanker
|
|
elif tanker.water > 0:
|
|
distance = tanker.distance_to(nearest_tanker)
|
|
if distance < shortest_tanker_distance:
|
|
shortest_tanker_distance = distance
|
|
nearest_tanker = tanker
|
|
|
|
elif unit_type == 4:
|
|
wreck = Wreck(unit_id, x, y, player, mass, radius, vx, vy, extra, extra_2)
|
|
wrecks.append(wreck)
|
|
if nearest_wreck is None:
|
|
nearest_wreck = wreck
|
|
else:
|
|
distance = wreck.distance_to(nearest_wreck)
|
|
if distance < shortest_wreck_distance:
|
|
shortest_wreck_distance = distance
|
|
nearest_wreck = wreck
|
|
|
|
print(locals(), file=sys.stderr)
|
|
reaper_target = nearest_wreck or nearest_tanker
|
|
my_reaper.play(reaper_target)
|
|
my_destroyer.play(nearest_tanker)
|
|
print("WAIT")
|
|
|
|
|
|
if __name__ == '__main__':
|
|
main()
|