import opt
import math
def move_to(x,y):
radian = opt.TANK.radian_to(x, y)
vs = math.cos(radian)
hs = -1 * math.sin(radian)
return vs, hs
def smart_fire():
tank_ball_angle = opt.TANK.angle_to(opt.BALL.x,opt.BALL.y)
if opt.TANK.face_enemy_door() and (0 <= tank_ball_angle < 3 or 357 < tank_ball_angle <360):
opt.TANK.do_fire()
def striker():
if opt.BALL.x > 45 and -8 < opt.BALL.y < 8 :
vs , hs = move_to(opt.BALL.x+1 , opt.BALL.y)
elif opt.BALL.y > 0 :
vs , hs = move_to(45 , 5)
else:
vs , hs = move_to(45 , -5)
return vs , hs
def midfield():
smart_fire()
t_x=opt.TANK.x
if opt.BALL.vx < -0.5:
if opt.BALL.y > 0 :
if t_x<opt.BALL.x:#此时处于有利局势,并且在球后,正常追球
vs , hs = move_to(opt.BALL.x+5 , opt.BALL.y-2)
else:#此时处于有利局势,但在球前,需要绕到后面再正常追球
vs , hs = move_to(opt.BALL.x-5 , opt.BALL.y-2)
else:
if t_x<opt.BALL.x:
vs , hs = move_to(opt.BALL.x+5 , opt.BALL.y+2)
else:
vs , hs = move_to(opt.BALL.x-5 , opt.BALL.y+2)
else:
if opt.BALL.y > 0 :
if t_x<opt.BALL.x:#此时处于被动局势,并且在球后,正常防守
vs , hs = move_to(opt.BALL.x+4.5 , opt.BALL.y-1.5)
else:#此时处于被动局势,而且在球前,需要绕到后面再正常防守
vs , hs = move_to(opt.BALL.x-4.5 , opt.BALL.y-1.5)
else:
if t_x<opt.BALL.x:
vs , hs = move_to(opt.BALL.x+4.5 , opt.BALL.y+1.5)
else:
vs , hs = move_to(opt.BALL.x-4.5 , opt.BALL.y+1.5)
return vs, hs
def defence():
vs, hs = 0, 0
# 如果足球的x坐标小于-40,进入防守范围,机器人追击足球
if opt.BALL.x < -40:
angle = opt.TANK.angle_to(opt.BALL.x, opt.BALL.y)
if angle > 0 and angle <= 90:
vs, hs = 0.8, -0.3
elif angle > 90 and angle <= 180:
vs, hs = -0.8, -0.3
elif angle > 180 and angle <= 270:
vs, hs = -0.8, 0.3
elif angle > 270 and angle <= 360:
vs, hs = 0.8, 0.3
# 否则,超出防守范围,机器人驶向并停在(-48,0)坐标附近
else:
if opt.TANK.is_point_in_range(-48, 0, 2):
vs, hs = 0, 0
else:
angle = opt.TANK.angle_to(-48, 0)
if angle > 0 and angle <= 90:
vs, hs = 0.8, -0.3
elif angle > 90 and angle <= 180:
vs, hs = -0.8, -0.3
elif angle > 180 and angle <= 270:
vs, hs = -0.8, 0.3
elif angle > 270 and angle <= 360:
vs, hs = 0.8, 0.3
# 当defence()被tank_update()调用时,每一帧都会执行以上策略,并返回vs,hs值
return vs, hs
定义机器人attack( )进攻策略的方法
def attack():
vs, hs = 0, 0
# 控制机器人移动的唯一方法是设置速度vs的值[-1,+1]和转动方向hs的值[-1,+1]
# 首先,获取足球相对于机器人的角度,并储存在变量angle中
angle = opt.TANK.angle_to(opt.BALL.x, opt.BALL.y)
# 如果足球在机器人0-90度范围内,设置机器人速度vs为前进0.8,转动方向hs为左转-0.3
if angle > 0 and angle <= 90:
vs, hs = 0.8, -0.3
# 如果足球在机器人90-180度范围内,设置机器人速度vs为后退-0.8,转动方向hs为左转-0.3
elif angle > 90 and angle <= 180:
vs, hs = -0.8, -0.3
# 如果足球在机器人180-270度范围内,设置机器人速度vs为后退-0.8,转动方向hs为右转0.3
elif angle > 180 and angle <= 270:
vs, hs = -0.8, 0.3
# 如果足球在机器人270-360度范围内,设置机器人速度vs为前进0.8,转动方向hs为右转0.3
elif angle > 270 and angle <= 360:
vs, hs = 0.8, 0.3
# 当attack()被tank_update()调用时,每一帧都会执行以上策略,并返回vs,hs值
return vs, hs
定义机器人goalkeeper( )门将策略的方法
def goalkeeper():
if opt.BALL.x < -35:
vs , hs = move_to(opt.BALL.x-3 , opt.BALL.y)
elif opt.BALL.y >= 0 :
vs , hs = move_to(-49 , 5)
else:
vs , hs = move_to(-49 , -5)
return vs, hs
#主循环
def tank1_update():
smart_fire()
return striker()
#return attack()
#return midfield()
#return defence()
#return goalkeeper()
def tank2_update():
smart_fire()
#return striker()
#return attack()
return midfield()
#return defence()
#return goalkeeper()
def tank3_update():
smart_fire()
#return striker()
#return attack()
return midfield()
#return defence()
#return goalkeeper()
def tank4_update():
smart_fire()
#return striker()
#return attack()
#return midfield()
return defence()
#return goalkeeper()
def tank5_update():
smart_fire()
#return striker()
#return attack()
#return midfield()
#return defence()
return goalkeeper()
版权归原作者 lqk30875 所有, 如有侵权,请联系我们删除。