Difference between revisions of "Quantum/Source (Java)"
< Quantum
Jump to navigation
Jump to search
(Update source code to v0.2.3) |
(Update to v1.0.0) |
||
(One intermediate revision by the same user not shown) | |||
Line 1: | Line 1: | ||
+ | The following code is functionally equivalent to [[Quantum/Source (Assembly)]] but when compiled with OpenJDK 17 it will be 265 bytes. | ||
+ | |||
<syntaxhighlight lang="java"> | <syntaxhighlight lang="java"> | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
package d414.nano; | package d414.nano; | ||
Line 56: | Line 19: | ||
static final double AIM_START = 10.0; | static final double AIM_START = 10.0; | ||
static final double AIM_FACTOR = 1.008; | static final double AIM_FACTOR = 1.008; | ||
+ | static final double AIM_TOLERANCE = 18.0; | ||
+ | static final double BULLET_POWER = 2.49999; | ||
+ | static final double ENERGY_FACTOR = 7.0; | ||
static final double RADAR_LOCK_THRESHOLD = 1.0; | static final double RADAR_LOCK_THRESHOLD = 1.0; | ||
− | static final | + | |
+ | // --------------------------------------------------------------------------------------------- | ||
+ | // Constants | ||
+ | // --------------------------------------------------------------------------------------------- | ||
+ | static final double BATTLEFIELD_SIZE = 1000.0; | ||
// --------------------------------------------------------------------------------------------- | // --------------------------------------------------------------------------------------------- | ||
Line 63: | Line 33: | ||
// --------------------------------------------------------------------------------------------- | // --------------------------------------------------------------------------------------------- | ||
static String targetName; | static String targetName; | ||
− | static | + | static double targetDistance; |
static double xForce; | static double xForce; | ||
static double yForce; | static double yForce; | ||
Line 69: | Line 39: | ||
@Override | @Override | ||
public void run() { | public void run() { | ||
− | setAllColors(Color.cyan | + | //setAllColors(Color.cyan); |
− | + | setTurnRadarRight(targetDistance = Double.POSITIVE_INFINITY); | |
− | |||
− | setTurnRadarRight(Double.POSITIVE_INFINITY); | ||
} | } | ||
@Override | @Override | ||
public void onRobotDeath(RobotDeathEvent r1e) { | public void onRobotDeath(RobotDeathEvent r1e) { | ||
− | targetDistance = | + | targetDistance = Double.POSITIVE_INFINITY; |
} | } | ||
@Override | @Override | ||
public void onScannedRobot(ScannedRobotEvent r1e) { | public void onScannedRobot(ScannedRobotEvent r1e) { | ||
− | + | double r1d; | |
double r3d; | double r3d; | ||
+ | setAdjustGunForRobotTurn(true); | ||
setTurnLeftRadians(Utils.normalRelativeAngle( | setTurnLeftRadians(Utils.normalRelativeAngle( | ||
(r3d = getHeadingRadians()) | (r3d = getHeadingRadians()) | ||
Line 90: | Line 59: | ||
(xForce = xForce * AGRAV_DECAY | (xForce = xForce * AGRAV_DECAY | ||
- Math.sin(r3d = (r3d += r1e.getBearingRadians()) | - Math.sin(r3d = (r3d += r1e.getBearingRadians()) | ||
− | + ( | + | + (Math.sin(r1e.getHeadingRadians() - r3d) |
− | + | * r1e.getVelocity() | |
− | / (AIM_START + Math.pow(AIM_FACTOR, | + | / (AIM_START + Math.pow(AIM_FACTOR, r1d = r1e.getDistance())) |
) | ) | ||
− | ) / | + | ) / r1d |
) | ) | ||
+ calcWallForce(getX()) | + calcWallForce(getX()) | ||
, | , | ||
− | (yForce = yForce * AGRAV_DECAY - Math.cos(r3d) / | + | (yForce = yForce * AGRAV_DECAY - Math.cos(r3d) / r1d) |
+ calcWallForce(getY()) | + calcWallForce(getY()) | ||
) | ) | ||
)); | )); | ||
− | + | setBack(Math.abs(getTurnRemaining()) - AHEAD_AMOUNT); | |
− | if ( | + | if (r1e.getName() == targetName || r1d < targetDistance) { |
targetName = r1e.getName(); | targetName = r1e.getName(); | ||
− | targetDistance = | + | targetDistance = r1d; |
setTurnRadarRight((getGunHeat() - RADAR_LOCK_THRESHOLD) * getRadarTurnRemaining()); | setTurnRadarRight((getGunHeat() - RADAR_LOCK_THRESHOLD) * getRadarTurnRemaining()); | ||
− | + | setTurnGunLeftRadians(Utils.normalRelativeAngle(getGunHeadingRadians() - r3d)); | |
− | + | ||
+ | if (Math.abs(getGunTurnRemainingRadians()) < (AIM_TOLERANCE / r1d)) { | ||
+ | setFire(Math.min(getEnergy() / ENERGY_FACTOR, BULLET_POWER)); | ||
+ | } | ||
} | } | ||
} | } | ||
public static double calcWallForce(double r0d) { | public static double calcWallForce(double r0d) { | ||
− | return (WALL_FORCE / r0d) - (WALL_FORCE / ( | + | return (WALL_FORCE / r0d) - (WALL_FORCE / (BATTLEFIELD_SIZE - r0d)); |
} | } | ||
} | } | ||
</syntaxhighlight> | </syntaxhighlight> |
Latest revision as of 03:28, 30 May 2024
The following code is functionally equivalent to Quantum/Source (Assembly) but when compiled with OpenJDK 17 it will be 265 bytes.
package d414.nano;
import robocode.*;
import robocode.util.Utils;
import java.awt.Color;
public class Quantum extends AdvancedRobot {
// ---------------------------------------------------------------------------------------------
// Tuning Knobs
// ---------------------------------------------------------------------------------------------
static final double WALL_FORCE = 1.0;
static final double AGRAV_DECAY = 0.9;
static final double AHEAD_AMOUNT = 120.0;
static final double AIM_START = 10.0;
static final double AIM_FACTOR = 1.008;
static final double AIM_TOLERANCE = 18.0;
static final double BULLET_POWER = 2.49999;
static final double ENERGY_FACTOR = 7.0;
static final double RADAR_LOCK_THRESHOLD = 1.0;
// ---------------------------------------------------------------------------------------------
// Constants
// ---------------------------------------------------------------------------------------------
static final double BATTLEFIELD_SIZE = 1000.0;
// ---------------------------------------------------------------------------------------------
// Globals
// ---------------------------------------------------------------------------------------------
static String targetName;
static double targetDistance;
static double xForce;
static double yForce;
@Override
public void run() {
//setAllColors(Color.cyan);
setTurnRadarRight(targetDistance = Double.POSITIVE_INFINITY);
}
@Override
public void onRobotDeath(RobotDeathEvent r1e) {
targetDistance = Double.POSITIVE_INFINITY;
}
@Override
public void onScannedRobot(ScannedRobotEvent r1e) {
double r1d;
double r3d;
setAdjustGunForRobotTurn(true);
setTurnLeftRadians(Utils.normalRelativeAngle(
(r3d = getHeadingRadians())
- Math.atan2(
(xForce = xForce * AGRAV_DECAY
- Math.sin(r3d = (r3d += r1e.getBearingRadians())
+ (Math.sin(r1e.getHeadingRadians() - r3d)
* r1e.getVelocity()
/ (AIM_START + Math.pow(AIM_FACTOR, r1d = r1e.getDistance()))
)
) / r1d
)
+ calcWallForce(getX())
,
(yForce = yForce * AGRAV_DECAY - Math.cos(r3d) / r1d)
+ calcWallForce(getY())
)
));
setBack(Math.abs(getTurnRemaining()) - AHEAD_AMOUNT);
if (r1e.getName() == targetName || r1d < targetDistance) {
targetName = r1e.getName();
targetDistance = r1d;
setTurnRadarRight((getGunHeat() - RADAR_LOCK_THRESHOLD) * getRadarTurnRemaining());
setTurnGunLeftRadians(Utils.normalRelativeAngle(getGunHeadingRadians() - r3d));
if (Math.abs(getGunTurnRemainingRadians()) < (AIM_TOLERANCE / r1d)) {
setFire(Math.min(getEnergy() / ENERGY_FACTOR, BULLET_POWER));
}
}
}
public static double calcWallForce(double r0d) {
return (WALL_FORCE / r0d) - (WALL_FORCE / (BATTLEFIELD_SIZE - r0d));
}
}