Difference between revisions of "Circular Targeting"
Jump to navigation
Jump to search
(Adding categories) |
m (Fix syntax highlighting) |
||
(8 intermediate revisions by 4 users not shown) | |||
Line 1: | Line 1: | ||
== Description == | == Description == | ||
− | A method of [[ | + | A method of [[targeting]] which assumes that the target will continue moving with the same turn rate and at the same speed. |
== Example == | == Example == | ||
This is the code used in [[WaveSurfing Challenge Bot/C|WaveSurfing Challenge Bot C]]: | This is the code used in [[WaveSurfing Challenge Bot/C|WaveSurfing Challenge Bot C]]: | ||
− | < | + | <syntaxhighlight lang="java"> |
//Add import robocode.util.* for Utils and import java.awt.geom.* for Point2D | //Add import robocode.util.* for Utils and import java.awt.geom.* for Point2D | ||
//This code goes in your onScannedRobot() event handler | //This code goes in your onScannedRobot() event handler | ||
Line 50: | Line 50: | ||
theta - getGunHeadingRadians())); | theta - getGunHeadingRadians())); | ||
fire(3); | fire(3); | ||
− | </ | + | </syntaxhighlight> |
== See also == | == See also == | ||
− | * [[Circular Targeting/Walkthrough]] An in-depth example of creating a | + | * [[Circular Targeting/Walkthrough]] - An in-depth example of creating a circular targeting algorithm in Robocode, authored by [[Dummy]]. |
− | + | * Alisdair Owen's [https://www.ibm.com/developerworks/library/j-circular/index.html circular targeting tutorial] with iteration. | |
− | * Alisdair Owen's [ | ||
+ | {{Targeting Navbox}} | ||
[[Category:Simple Targeting Strategies]] | [[Category:Simple Targeting Strategies]] | ||
[[Category:Code Snippets]] | [[Category:Code Snippets]] |
Latest revision as of 22:45, 9 May 2024
Description
A method of targeting which assumes that the target will continue moving with the same turn rate and at the same speed.
Example
This is the code used in WaveSurfing Challenge Bot C:
//Add import robocode.util.* for Utils and import java.awt.geom.* for Point2D
//This code goes in your onScannedRobot() event handler
double bulletPower = Math.min(3.0,getEnergy());
double myX = getX();
double myY = getY();
double absoluteBearing = getHeadingRadians() + e.getBearingRadians();
double enemyX = getX() + e.getDistance() * Math.sin(absoluteBearing);
double enemyY = getY() + e.getDistance() * Math.cos(absoluteBearing);
double enemyHeading = e.getHeadingRadians();
double enemyHeadingChange = enemyHeading - oldEnemyHeading;
double enemyVelocity = e.getVelocity();
oldEnemyHeading = enemyHeading;
double deltaTime = 0;
double battleFieldHeight = getBattleFieldHeight(),
battleFieldWidth = getBattleFieldWidth();
double predictedX = enemyX, predictedY = enemyY;
while((++deltaTime) * (20.0 - 3.0 * bulletPower) <
Point2D.Double.distance(myX, myY, predictedX, predictedY)){
predictedX += Math.sin(enemyHeading) * enemyVelocity;
predictedY += Math.cos(enemyHeading) * enemyVelocity;
enemyHeading += enemyHeadingChange;
if( predictedX < 18.0
|| predictedY < 18.0
|| predictedX > battleFieldWidth - 18.0
|| predictedY > battleFieldHeight - 18.0){
predictedX = Math.min(Math.max(18.0, predictedX),
battleFieldWidth - 18.0);
predictedY = Math.min(Math.max(18.0, predictedY),
battleFieldHeight - 18.0);
break;
}
}
double theta = Utils.normalAbsoluteAngle(Math.atan2(
predictedX - getX(), predictedY - getY()));
setTurnRadarRightRadians(Utils.normalRelativeAngle(
absoluteBearing - getRadarHeadingRadians()));
setTurnGunRightRadians(Utils.normalRelativeAngle(
theta - getGunHeadingRadians()));
fire(3);
See also
- Circular Targeting/Walkthrough - An in-depth example of creating a circular targeting algorithm in Robocode, authored by Dummy.
- Alisdair Owen's circular targeting tutorial with iteration.
|