Difference between revisions of "Quantum/Source (Java)"

From Robowiki
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">
// -------------------------------------------------------------------------------------------------
 
// ==============
 
// Quantum (Nano)
 
// ==============
 
// Author: David414
 
// License: RWPCL (https://robowiki.net/wiki/RWPCL)
 
// -------------------------------------------------------------------------------------------------
 
 
// -------------------------------------------------------------------------------------------------
 
// Credits
 
// -------------------------------------------------------------------------------------------------
 
// Quantum started out life as a tweaked version of Mike Dorgan's DustBunny before being heavily
 
// shrunk to make room for improved target tracking (inspired by Infinity, also by Mike).
 
 
// -------------------------------------------------------------------------------------------------
 
// Version History
 
// -------------------------------------------------------------------------------------------------
 
// =================================================================================================
 
// v0.2.2 (2024-04-06) Codesize: 249  | Colors: Yes | 1v1 capable: No
 
// =================================================================================================
 
// - Antigravity movement based on DustBunny, but with forces calculated based on
 
//  where we would aim to hit the enemy, rather than where they currently are
 
// - Aim like DustBunny but with different energy management based only on how
 
//  many enemies are still alive. Fire more agressively early on and much less
 
//  agressively in 1v1
 
// - Quite a bit of code shrinking to make room for Infinity style target tracking
 
//
 
// =================================================================================================
 
// v0.2.2a (2024-04-11) Codesize: 249  | Colors: Yes | 1v1 capable: No
 
// =================================================================================================
 
// - No functional changes, added credits, version history and commented the code
 
//
 
// =================================================================================================
 
// v0.2.3 (2024-05-14) Codesize: 245  | Colors: Yes | 1v1 capable: No
 
// =================================================================================================
 
// - Change to int for distance and targetDistance variables
 
// - Switch to a gunHeat radar lock that doesn't require an if statement
 
// - Switch from setTurnRight to setTurnLeft
 
 
 
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 int POWER_FACTOR = 2;
+
 
 +
    // ---------------------------------------------------------------------------------------------
 +
    // Constants
 +
    // ---------------------------------------------------------------------------------------------
 +
     static final double BATTLEFIELD_SIZE = 1000.0;
  
 
     // ---------------------------------------------------------------------------------------------
 
     // ---------------------------------------------------------------------------------------------
Line 63: Line 33:
 
     // ---------------------------------------------------------------------------------------------
 
     // ---------------------------------------------------------------------------------------------
 
     static String targetName;
 
     static String targetName;
     static int targetDistance;
+
     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);
        setAdjustGunForRobotTurn(true);
+
         setTurnRadarRight(targetDistance = Double.POSITIVE_INFINITY);
        onRobotDeath(null);
 
         setTurnRadarRight(Double.POSITIVE_INFINITY);
 
 
     }
 
     }
  
 
     @Override
 
     @Override
 
     public void onRobotDeath(RobotDeathEvent r1e) {
 
     public void onRobotDeath(RobotDeathEvent r1e) {
         targetDistance = Integer.MAX_VALUE;
+
         targetDistance = Double.POSITIVE_INFINITY;
 
     }
 
     }
  
 
     @Override
 
     @Override
 
     public void onScannedRobot(ScannedRobotEvent r1e) {
 
     public void onScannedRobot(ScannedRobotEvent r1e) {
         int r2i;
+
         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())
                             + (r1e.getVelocity()
+
                             + (Math.sin(r1e.getHeadingRadians() - r3d)
                                * Math.sin(r1e.getHeadingRadians() - r3d)
+
                                * r1e.getVelocity()
                                 / (AIM_START + Math.pow(AIM_FACTOR, r2i = (int)r1e.getDistance()))
+
                                 / (AIM_START + Math.pow(AIM_FACTOR, r1d = r1e.getDistance()))
 
                               )
 
                               )
                             ) / r2i
+
                             ) / r1d
 
                         )
 
                         )
 
                         + calcWallForce(getX())
 
                         + calcWallForce(getX())
 
                         ,  
 
                         ,  
                         (yForce = yForce * AGRAV_DECAY - Math.cos(r3d) / r2i)
+
                         (yForce = yForce * AGRAV_DECAY - Math.cos(r3d) / r1d)
 
                         + calcWallForce(getY())
 
                         + calcWallForce(getY())
 
                         )
 
                         )
 
                     ));
 
                     ));
         setAhead(AHEAD_AMOUNT - Math.abs(getTurnRemaining()));
+
         setBack(Math.abs(getTurnRemaining()) - AHEAD_AMOUNT);
  
         if (r2i < targetDistance || r1e.getName() == targetName) {
+
         if (r1e.getName() == targetName || r1d < targetDistance) {
 
             targetName = r1e.getName();
 
             targetName = r1e.getName();
             targetDistance = r2i;
+
             targetDistance = r1d;
  
 
             setTurnRadarRight((getGunHeat() - RADAR_LOCK_THRESHOLD) * getRadarTurnRemaining());
 
             setTurnRadarRight((getGunHeat() - RADAR_LOCK_THRESHOLD) * getRadarTurnRemaining());
             setFire(getOthers() / POWER_FACTOR);
+
             setTurnGunLeftRadians(Utils.normalRelativeAngle(getGunHeadingRadians() - r3d));
             setTurnGunRightRadians(Utils.normalRelativeAngle(r3d - getGunHeadingRadians()));
+
 
 +
             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 / (1000 - r0d));
+
         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));
    }
}