1
0
mirror of https://github.com/balkian/gists.git synced 2024-11-23 01:52:27 +00:00
gists/repos/1e1452d5ae6d0268c651/MarksMan
J. Fernando Sánchez fffa3851b0 Add 'repos/1e1452d5ae6d0268c651/' from commit '250fd5e42b05ed1056b10ff8b4f6b525db19c18c'
git-subtree-dir: repos/1e1452d5ae6d0268c651
git-subtree-mainline: a55d007746
git-subtree-split: 250fd5e42b
2021-10-30 15:14:03 +02:00

85 lines
2.6 KiB
Plaintext

class Marksman < RTanque::Bot::Brain
NAME = 'MarksmanSample_testbattle'
include RTanque::Bot::BrainHelper
def tick!
command.speed = RTanque::Bot::MAX_SPEED
nearest = nearest_target()
if (!defined?(@direction))
@direction = 0
@previousTargetX = 0
@previousTargetY = 0
end
if (nearest)
targetX = sensors.position.x + Math.sin(nearest.heading) * nearest.distance
targetY = sensors.position.y + Math.cos(nearest.heading) * nearest.distance
power = RTanque::Bot::MAX_FIRE_POWER
predictedTargetX = targetX + (targetX - @previousTargetX) * nearest.distance / (5.0 * power)
predictedTargetY = targetY + (targetY - @previousTargetY) * nearest.distance / (5.0 * power)
deltaX = predictedTargetX - sensors.position.x
deltaY = predictedTargetY - sensors.position.y
tan = deltaX / deltaY
if (deltaX > 0 && deltaY > 0)
angle = Math.atan(tan)
elsif (deltaX > 0 && deltaY < 0)
angle = Math::PI - Math.atan(-tan)
elsif (deltaX < 0 && deltaY > 0)
angle = Math::PI * 2 - Math.atan(-tan)
elsif (deltaX < 0 && deltaY < 0)
angle = Math::PI + Math.atan(tan)
end
@previousTargetX = targetX
@previousTargetY = targetY
command.radar_heading = nearest.heading
command.turret_heading = angle
command.fire(power)
else
command.radar_heading = sensors.radar_heading + RTanque::Heading::ONE_DEGREE * 10.0
end
onWall = false
if (sensors.position.on_top_wall?)
command.heading = RTanque::Heading::SOUTH
onWall = true
elsif (sensors.position.on_bottom_wall?)
command.heading = RTanque::Heading::NORTH
onWall = true
elsif (sensors.position.on_left_wall?)
command.heading = RTanque::Heading::EAST
onWall = true
elsif (sensors.position.on_right_wall?)
command.heading = RTanque::Heading::WEST
onWall = true
end
if (onWall)
if (sensors.heading.delta(command.heading) > 0)
@direction = 1
else
@direction = -1
end
else
if (Random.rand(80) < 1)
@direction = 0 - @direction
end
command.heading = sensors.heading + @direction * RTanque::Heading::ONE_DEGREE * 5.0
end
end
# this function borrowed from rort1.rb (https://gist.github.com/ronald/5146511)
def nearest_target
reflections = sensors.radar
reflections = reflections.reject{|r| r.name == NAME } unless @friendly_fire
reflections.sort_by{|r| r.distance }.first
end
end