全国赛题目分析

第一题

思路如图,需要碰运气

第一题思路图

比赛时的代码:


        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
    

最终大小:

第三题最终大小

总结

总结来说,这次全国赛还是很有挑战性的,国一的要求真的太高了。本次将思路和代码分享给大家,希望大家来年的时候从容应对。