From 250fd5e42b05ed1056b10ff8b4f6b525db19c18c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fernando=20S=C3=A1nchez?= Date: Sun, 26 Jan 2014 09:38:12 -0800 Subject: [PATCH] --- MarksMan | 84 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 MarksMan diff --git a/MarksMan b/MarksMan new file mode 100644 index 0000000..5fc3faa --- /dev/null +++ b/MarksMan @@ -0,0 +1,84 @@ +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