思路如图,需要碰运气
比赛时的代码:
import api
import math
info = {"flag": -1}
flag=[10]*10
def position(atoms):#输出最近的星球ID和坐标
for i in atoms:
print(i.id, i.position)
def update(context):
def f(atom_id):
return context.get_atom_by_id(atom_id)
me = context.me
t = context.step
senemies = context.enemies
senemies = api.find_neighbors(me, senemies, close_to_far=True)
enemies=[]
for i in senemies:
if not i.is_bullet:
enemies.append(i)
if t==1599:
print(me.radius)
if t<=18 and t%2==0:
return api.a2r(70)
if 100<=t<=105 and f(22)!=None and me.mass*0.9>f(22).mass :
return api.a2r(55)
if f(12)==None and 200<=t<=260:
if 240<=t<=242:#上奏
return api.a2r(270)
if 250<=t<=252:
return api.a2r(270)
if 1500<=t<=1502:
return api.a2r(90)
if 1510<=t<=1512:
return api.a2r(0)
for i in enemies:
if i.mass>me.mass and me.whether_collide(i) and me.get_atom_surface_dist(i) < 60 :
return me.avoid(i)
new_enemies=[]
if t>=310:
for i in enemies:
if i.mass < me.mass*0.85:
new_enemies=api.raycast(
colliders=enemies, # 待检测的星体
origin = (me.x, me.y),
direction = api.relative_radian(me.x, me.y, i.x, i.y), # 射线发出方向
max_distance=None, # 最大距离
)
sorted_enemies = sorted(new_enemies, key=lambda x: x.mass, reverse=True)
for atom in sorted_enemies:
if me.angle_to_atom(atom)<45 or 315 < me.angle_to_atom(atom) <= 360:
if atom.mass < me.mass*0.8 and math.sqrt(me.vx ** 2 + me.vy ** 2) <= 100 and atom.mass > me.mass*0.15:
if t%20==3:
return me.goto_atom(i)
# 其它情况下返回 None,保持静止
return None
最终大小:
思路如图,主要手操
比赛代码:
import api
import math
info = {"flag": -1}
flag=[10]*10
def position(atoms):#输出最近的星球ID和坐标
for i in atoms:
print(i.id, i.position)
def update(context):
def f(atom_id):
return context.get_atom_by_id(atom_id)
me = context.me
t = context.step
senemies = context.enemies
senemies = api.find_neighbors(me, senemies, close_to_far=True)
enemies=[]
for i in senemies:
if not i.is_bullet:
enemies.append(i)
if t==1599:
print(me.radius)
if t<=10:
return api.a2r(270)
if 90<=t<=95:
return api.a2r(180)
if 120<=t<=122:
return api.a2r(90)
if 124<=t<=126:
return api.a2r(180)
if 270<=t<=272:
return api.a2r(120)
if 300<=t<=302:
return api.a2r(90)
if 310<=t<=312:
return api.a2r(90)
if 1500<=t<=1502:
return api.a2r(90)
if 1510<=t<=1512:
return api.a2r(0)
for i in enemies:
if i.mass>me.mass and me.whether_collide(i) and me.get_atom_surface_dist(i) < 60 :
return me.avoid(i)
new_enemies=[]
if t>=450:
for i in enemies:
if i.mass < me.mass*0.85:
new_enemies=api.raycast(
colliders=enemies, # 待检测的星体
origin = (me.x, me.y),
direction = api.relative_radian(me.x, me.y, i.x, i.y), # 射线发出方向
max_distance=None, # 最大距离
)
sorted_enemies = sorted(new_enemies, key=lambda x: x.mass, reverse=True)
for atom in sorted_enemies:
if me.angle_to_atom(atom)<45 or 315 < me.angle_to_atom(atom) <= 360:
if atom.mass < me.mass*0.8 and math.sqrt(me.vx ** 2 + me.vy ** 2) <= 100 and atom.mass > me.mass*0.15:
if t%20==3:
return me.goto_atom(i)
# 其它情况下返回 None,保持静止
return None
最终大小:
我感觉很遗憾,因为多次都是差一点就可以全吃
差不多是这样:
分享一下思路,左右皆可,AI喜欢往左边走:
比赛代码:
import api
import math
info = {"flag": -1}
flag=[10]*10
def position(atoms):#输出最近的星球ID和坐标
for i in atoms:
print(i.id, i.position)
def update(context):
def f(atom_id):
return context.get_atom_by_id(atom_id)
me = context.me
t = context.step
senemies = context.enemies
senemies = api.find_neighbors(me, senemies, close_to_far=True)
enemies=[]
for i in senemies:
if not i.is_bullet:
enemies.append(i)
if t==1599:
print(me.radius)
if t<=6:
return api.a2r(335)
if 150<=t<=154:#左
return api.a2r(0)
if 250<=t<=252:
return api.a2r(270)
if 260<=t<=262:
return api.a2r(270)
if 350<=t<=352:
return api.a2r(270)
if 600<=t<=602:
return api.a2r(180)
if 1500<=t<=1502 and me.radius>300:
return api.a2r(90)
if 1510<=t<=1512 and me.radius>300:
return api.a2r(0)
for i in enemies:
if i.mass>me.mass and me.whether_collide(i) and me.get_atom_surface_dist(i) < 60 and t>=70 :
return me.avoid(i)
new_enemies=[]
if t>=810:
for i in enemies:
if i.mass < me.mass*0.85:
new_enemies=api.raycast(
colliders=enemies, # 待检测的星体
origin = (me.x, me.y),
direction = api.relative_radian(me.x, me.y, i.x, i.y), # 射线发出方向
max_distance=None, # 最大距离
)
sorted_enemies = sorted(new_enemies, key=lambda x: x.mass, reverse=True)
for atom in sorted_enemies:
if me.angle_to_atom(atom)<45 or 315 < me.angle_to_atom(atom) <= 360:
if atom.mass < me.mass*0.8 and math.sqrt(me.vx ** 2 + me.vy ** 2) <= 100 and atom.mass > me.mass*0.15:
if t%20==3:
return me.goto_atom(i)
# 其它情况下返回 None,保持静止
return None
最终大小:
总结来说,这次全国赛还是很有挑战性的,国一的要求真的太高了。本次将思路和代码分享给大家,希望大家来年的时候从容应对。