Difference between revisions of "SuperRamFire"
Jump to navigation
Jump to search
m (Add links) |
m (Small changes) |
||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
− | + | {{Infobox Robot | |
+ | | author = [[CrazyBassoonist]] | ||
+ | | extends = [[AdvancedRobot]] | ||
+ | | targeting = [[Circular Targeting]] | ||
+ | | movement = Orbital Movement, [[Ramming Movement]] | ||
+ | | current_version = 1.0 | ||
+ | | license = Public domain | ||
+ | | download_link = http://robocode-archive.strangeautomata.com/robots/supersample.SuperRamFire_1.0.jar | ||
+ | | isOpenSource = yes | ||
+ | | isMelee = no | ||
+ | | isOneOnOne = yes | ||
+ | }} | ||
− | [ | + | SuperRamFire is a part of the [[Super Sample Bots]] set by [[CrazyBassoonist]]. It is intended to provide new Robocoders with a new challenge after beating all of the [[Sample Bots|sample robots]]. |
== Movement == | == Movement == | ||
− | SuperRamFire tries to ram its opponent (hence the name). It changes | + | SuperRamFire tries to ram its opponent (hence the name). It changes its turn direction and chance-to-reverse based on distance from the enemy. |
== Targeting == | == Targeting == | ||
Line 27: | Line 38: | ||
//These are constants. One advantage of these is that the logic in them (such as 20-3*BULLET_POWER) | //These are constants. One advantage of these is that the logic in them (such as 20-3*BULLET_POWER) | ||
//does not use codespace, making them cheaper than putting the logic in the actual code. | //does not use codespace, making them cheaper than putting the logic in the actual code. | ||
− | |||
final static double BULLET_POWER=3;//Our bulletpower. | final static double BULLET_POWER=3;//Our bulletpower. | ||
final static double BULLET_DAMAGE=BULLET_POWER*4;//Formula for bullet damage. | final static double BULLET_DAMAGE=BULLET_POWER*4;//Formula for bullet damage. | ||
Line 36: | Line 46: | ||
static double oldEnemyHeading; | static double oldEnemyHeading; | ||
static double enemyEnergy; | static double enemyEnergy; | ||
− | + | ||
− | |||
public void run(){ | public void run(){ | ||
− | |||
//RamFire Colors | //RamFire Colors | ||
setBodyColor(Color.lightGray); | setBodyColor(Color.lightGray); | ||
Line 49: | Line 57: | ||
setTurnRadarRightRadians(Double.POSITIVE_INFINITY); | setTurnRadarRightRadians(Double.POSITIVE_INFINITY); | ||
} | } | ||
+ | |||
public void onScannedRobot(ScannedRobotEvent e){ | public void onScannedRobot(ScannedRobotEvent e){ | ||
double absBearing=e.getBearingRadians()+getHeadingRadians(); | double absBearing=e.getBearingRadians()+getHeadingRadians(); | ||
Line 110: | Line 119: | ||
setTurnGunRightRadians(Utils.normalRelativeAngle(aim - getGunHeadingRadians())); | setTurnGunRightRadians(Utils.normalRelativeAngle(aim - getGunHeadingRadians())); | ||
setFire(BULLET_POWER); | setFire(BULLET_POWER); | ||
− | + | ||
− | |||
− | |||
− | |||
− | |||
− | |||
setTurnRadarRightRadians(Utils.normalRelativeAngle(absBearing-getRadarHeadingRadians())*2); | setTurnRadarRightRadians(Utils.normalRelativeAngle(absBearing-getRadarHeadingRadians())*2); | ||
} | } | ||
+ | |||
public void onBulletHit(BulletHitEvent e){ | public void onBulletHit(BulletHitEvent e){ | ||
enemyEnergy-=BULLET_DAMAGE; | enemyEnergy-=BULLET_DAMAGE; | ||
} | } | ||
+ | |||
public void onHitWall(HitWallEvent e){ | public void onHitWall(HitWallEvent e){ | ||
dir=-dir; | dir=-dir; |
Latest revision as of 11:19, 4 September 2017
SuperRamFire | |
Author(s) | CrazyBassoonist |
Extends | AdvancedRobot |
Targeting | Circular Targeting |
Movement | Orbital Movement, Ramming Movement |
Current Version | 1.0 |
Code License | Public domain |
Download |
SuperRamFire is a part of the Super Sample Bots set by CrazyBassoonist. It is intended to provide new Robocoders with a new challenge after beating all of the sample robots.
Movement
SuperRamFire tries to ram its opponent (hence the name). It changes its turn direction and chance-to-reverse based on distance from the enemy.
Targeting
SuperRamFire uses Circular Targeting.
Code
package supersample;
import java.awt.Color;
import java.awt.geom.Point2D;
import robocode.*;
import robocode.util.Utils;
/**
* SuperSpinBot - a Super Sample Robot by CrazyBassoonist based on the robot RamFire by Mathew Nelson and maintained by Flemming N. Larsen.
*
* This robot tries to ram it's opponents.
*
*/
public class SuperRamFire extends AdvancedRobot {
//These are constants. One advantage of these is that the logic in them (such as 20-3*BULLET_POWER)
//does not use codespace, making them cheaper than putting the logic in the actual code.
final static double BULLET_POWER=3;//Our bulletpower.
final static double BULLET_DAMAGE=BULLET_POWER*4;//Formula for bullet damage.
final static double BULLET_SPEED=20-3*BULLET_POWER;//Formula for bullet speed.
//Variables
static double dir=1;
static double oldEnemyHeading;
static double enemyEnergy;
public void run(){
//RamFire Colors
setBodyColor(Color.lightGray);
setGunColor(Color.gray);
setRadarColor(Color.darkGray);
setAdjustGunForRobotTurn(true);
setAdjustRadarForGunTurn(true);
setTurnRadarRightRadians(Double.POSITIVE_INFINITY);
}
public void onScannedRobot(ScannedRobotEvent e){
double absBearing=e.getBearingRadians()+getHeadingRadians();
//This makes the amount we want to turn be perpendicular to the enemy.
double turn=absBearing+Math.PI/2;
//This formula is used because the 1/e.getDistance() means that as we get closer to the enemy, we will turn to them more sharply.
//We want to do this because it reduces our chances of being defeated before we reach the enemy robot.
turn-=Math.max(0.5,(1/e.getDistance())*100)*dir;
setTurnRightRadians(Utils.normalRelativeAngle(turn-getHeadingRadians()));
//This block of code detects when an opponents energy drops.
if(enemyEnergy>(enemyEnergy=e.getEnergy())){
//We use 300/e.getDistance() to decide if we want to change directions.
//This means that we will be less likely to reverse right as we are about to ram the enemy robot.
if(Math.random()>200/e.getDistance()){
dir=-dir;
}
}
//This line makes us slow down when we need to turn sharply.
setMaxVelocity(400/getTurnRemaining());
setAhead(100*dir);
//Finding the heading and heading change.
double enemyHeading = e.getHeadingRadians();
double enemyHeadingChange = enemyHeading - oldEnemyHeading;
oldEnemyHeading = enemyHeading;
/*This method of targeting is know as circular targeting; you assume your enemy will
*keep moving with the same speed and turn rate that he is using at fire time.The
*base code comes from the wiki.
*/
double deltaTime = 0;
double predictedX = getX()+e.getDistance()*Math.sin(absBearing);
double predictedY = getY()+e.getDistance()*Math.cos(absBearing);
while((++deltaTime) * BULLET_SPEED < Point2D.Double.distance(getX(), getY(), predictedX, predictedY)){
//Add the movement we think our enemy will make to our enemy's current X and Y
predictedX += Math.sin(enemyHeading) * e.getVelocity();
predictedY += Math.cos(enemyHeading) * e.getVelocity();
//Find our enemy's heading changes.
enemyHeading += enemyHeadingChange;
//If our predicted coordinates are outside the walls, put them 18 distance units away from the walls as we know
//that that is the closest they can get to the wall (Bots are non-rotating 36*36 squares).
predictedX=Math.max(Math.min(predictedX,getBattleFieldWidth()-18),18);
predictedY=Math.max(Math.min(predictedY,getBattleFieldHeight()-18),18);
}
//Find the bearing of our predicted coordinates from us.
double aim = Utils.normalAbsoluteAngle(Math.atan2( predictedX - getX(), predictedY - getY()));
//Aim and fire.
setTurnGunRightRadians(Utils.normalRelativeAngle(aim - getGunHeadingRadians()));
setFire(BULLET_POWER);
setTurnRadarRightRadians(Utils.normalRelativeAngle(absBearing-getRadarHeadingRadians())*2);
}
public void onBulletHit(BulletHitEvent e){
enemyEnergy-=BULLET_DAMAGE;
}
public void onHitWall(HitWallEvent e){
dir=-dir;
}
}