Difference between revisions of "NP/Source Code"
< NP
Jump to navigation
Jump to search
m (update the code) |
RednaxelaBot (talk | contribs) m (Using <syntaxhighlight>.) |
||
(3 intermediate revisions by one other user not shown) | |||
Line 6: | Line 6: | ||
}} | }} | ||
− | + | == Code For NP 1.3 == | |
+ | [[Code size]]: 745 bytes | ||
− | < | + | <syntaxhighlight> |
package nat.micro; | package nat.micro; | ||
Line 43: | Line 44: | ||
static final int MIDDLE_BIN = 15; // middle gin | static final int MIDDLE_BIN = 15; // middle gin | ||
static final double MEA = 0.694498266 / MIDDLE_BIN; // hard-coded for 2.5 | static final double MEA = 0.694498266 / MIDDLE_BIN; // hard-coded for 2.5 | ||
− | + | // bullet power | |
static double _enemyX; // enemy location | static double _enemyX; // enemy location | ||
Line 49: | Line 50: | ||
static int _enemyDirection = 1; | static int _enemyDirection = 1; | ||
− | static double distance | + | static double distance; |
// Segment: Lateral Velocity | // Segment: Lateral Velocity | ||
− | //static int[][][] _gunStats = new int[6][4][BINS]; | + | // static int[][][] _gunStats = new int[6][4][BINS]; |
static int[][][][] _gunStats = new int[6][4][2][BINS]; | static int[][][][] _gunStats = new int[6][4][2][BINS]; | ||
− | //static int[][][][][] _gunStats = new int[6][4][2][3][BINS]; | + | // static int[][][][][] _gunStats = new int[6][4][2][3][BINS]; |
// Gun | // Gun | ||
Line 66: | Line 67: | ||
static final double CLOSING_FACTOR = 10000d; | static final double CLOSING_FACTOR = 10000d; | ||
− | static double _moveFactor = 20; // length to move, | + | static double _moveFactor = 20; // length to move, store the direction as |
// sign | // sign | ||
static double _enemyEnergy; // keep track of enemy energy | static double _enemyEnergy; // keep track of enemy energy | ||
Line 76: | Line 77: | ||
public void run() { | public void run() { | ||
setAdjustRadarForGunTurn(true); | setAdjustRadarForGunTurn(true); | ||
− | + | // setAdjustGunForRobotTurn(true); // not enough codesize | |
do { | do { | ||
Line 86: | Line 87: | ||
Wave wave; | Wave wave; | ||
double enemyAbsoluteBearing; | double enemyAbsoluteBearing; | ||
+ | int mostVisited = MIDDLE_BIN, i = BINS; | ||
// ///////////////////////////////////// | // ///////////////////////////////////// | ||
// Wave (Velocity) Surfing movement | // Wave (Velocity) Surfing movement | ||
− | // Base | + | // Base loosely on WaveSnake, by Kev |
// | // | ||
// Turn Perpendicular with distance controller | // Turn Perpendicular with distance controller | ||
− | setTurnRightRadians(Math.cos((enemyAbsoluteBearing = e | + | setTurnRightRadians(Math |
− | + | .cos((enemyAbsoluteBearing = e.getBearingRadians()) | |
− | + | - ((NP.distance = e.getDistance()) - PREFERRED_DISTANCE) | |
− | + | * _moveFactor / CLOSING_FACTOR)); | |
if (_enemyEnergy > (_enemyEnergy = e.getEnergy())) { | if (_enemyEnergy > (_enemyEnergy = e.getEnergy())) { | ||
Line 104: | Line 106: | ||
_currentVelocity = testVel; | _currentVelocity = testVel; | ||
} | } | ||
− | + | if (testVel == 5) | |
− | + | testVel = 3; | |
} while (testVel-- > 0); | } while (testVel-- > 0); | ||
Line 119: | Line 121: | ||
// ///////////////////////////////////// | // ///////////////////////////////////// | ||
// GuessFactor targeting gun | // GuessFactor targeting gun | ||
− | // Base | + | // Base loosely on Falcon gun. |
// | // | ||
addCustomEvent(wave = new Wave()); | addCustomEvent(wave = new Wave()); | ||
Line 135: | Line 137: | ||
int direction; | int direction; | ||
if ((direction = (int) Math.signum(enemyLatVel = e.getVelocity() | if ((direction = (int) Math.signum(enemyLatVel = e.getVelocity() | ||
− | * Math.sin(e.getHeadingRadians() - enemyAbsoluteBearing))) != 0) | + | * Math.sin(e.getHeadingRadians() - (wave.wBearing = enemyAbsoluteBearing)))) != 0) |
_enemyDirection = direction; | _enemyDirection = direction; | ||
− | |||
− | |||
− | |||
− | |||
− | |||
// Segment: lateralVelocity and forwardWall | // Segment: lateralVelocity and forwardWall | ||
− | // | + | // wave.stats = _gunStats[(Math.abs(enemyLatVel) >= 7.75) ? 4 : (int) |
− | // | + | // (1.4427 * Math |
+ | // .log(Math.abs(enemyLatVel) + 1.75))][gunWallDistance(0.18247367367) ? | ||
+ | // (gunWallDistance(0.36494734735) ? (gunWallDistance(0.63865785787) ? 3 | ||
+ | // : 2) : 1) : 0]; | ||
wave.stats = _gunStats[(Math.abs(enemyLatVel) >= 7.75) ? 4 : (int) (1.4427 * Math | wave.stats = _gunStats[(Math.abs(enemyLatVel) >= 7.75) ? 4 : (int) (1.4427 * Math | ||
− | .log(Math.abs(enemyLatVel) + 1.75))][gunWallDistance(0.18247367367) ? (gunWallDistance(0.36494734735) ? (gunWallDistance(0.63865785787) ? 3 : 2) : 1) : 0][gunWallDistance(-0.36494734735) ? 0 : 1] | + | .log(Math.abs(enemyLatVel) + 1.75))][gunWallDistance( |
− | + | 0.18247367367, enemyAbsoluteBearing) ? (gunWallDistance( | |
− | + | 0.36494734735, enemyAbsoluteBearing) ? (gunWallDistance( | |
− | + | 0.63865785787, enemyAbsoluteBearing) ? 3 : 2) : 1) : 0][gunWallDistance( | |
+ | -0.36494734735, enemyAbsoluteBearing) ? 0 : 1]; | ||
do { | do { | ||
Line 158: | Line 159: | ||
} while (i > 0); | } while (i > 0); | ||
− | setTurnGunRightRadians(Utils | + | setTurnGunRightRadians(Utils.normalRelativeAngle(enemyAbsoluteBearing |
− | + | - getGunHeadingRadians() | |
− | + | + (wave.wBearingDirection = (MEA * _enemyDirection)) | |
− | + | * (mostVisited - MIDDLE_BIN))); | |
− | + | wave.weight = setFireBullet(BULLET_POWER) != null ? 4 : 1; | |
− | |||
− | |||
// ///////////////////////////////////////// | // ///////////////////////////////////////// | ||
Line 170: | Line 169: | ||
_myLatVel = (int) ((Math.abs(getVelocity() | _myLatVel = (int) ((Math.abs(getVelocity() | ||
* Math.sin(e.getBearingRadians())) + 1) / 2); | * Math.sin(e.getBearingRadians())) + 1) / 2); | ||
+ | |||
+ | setTurnRadarRightRadians(Utils | ||
+ | .normalRelativeAngle(enemyAbsoluteBearing | ||
+ | - getRadarHeadingRadians()) * 2); | ||
} | } | ||
Line 178: | Line 181: | ||
double wBearingDirection; | double wBearingDirection; | ||
double wDistance; | double wDistance; | ||
− | int weight | + | int weight; |
int[] stats; | int[] stats; | ||
Line 184: | Line 187: | ||
if (Math.abs((wDistance += BULLET_VELOCITY) | if (Math.abs((wDistance += BULLET_VELOCITY) | ||
- Point2D.distance(wGunX, wGunY, _enemyX, _enemyY)) <= BULLET_VELOCITY / 2) { | - Point2D.distance(wGunX, wGunY, _enemyX, _enemyY)) <= BULLET_VELOCITY / 2) { | ||
+ | |||
stats[(int) ((Utils.normalRelativeAngle(Math.atan2(_enemyX | stats[(int) ((Utils.normalRelativeAngle(Math.atan2(_enemyX | ||
- wGunX, _enemyY - wGunY) | - wGunX, _enemyY - wGunY) | ||
Line 207: | Line 211: | ||
} | } | ||
− | // | + | // inject the absBearing here is good since it on the register, but inject |
− | private static | + | // the distance isn't good since it out of register now. |
− | + | private static boolean gunWallDistance(double wallDistance, double ab) { | |
− | + | double angle; | |
− | + | return (new Rectangle2D.Double(18, 18, 764, 564)) | |
− | + | .contains(new Point2D.Double(_enemyX | |
− | + | + Math.sin(angle = ab | |
− | + | + (_enemyDirection * wallDistance)) * distance, | |
− | return (new Rectangle2D.Double(18, 18, 764, 564)).contains( | + | _enemyY + Math.cos(angle) * distance)); |
− | |||
− | |||
} | } | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
Latest revision as of 09:29, 1 July 2010
- NP Sub-pages:
- NP - Version History - Source Code
Code For NP 1.3
Code size: 745 bytes
package nat.micro;
import robocode.AdvancedRobot;
import robocode.BulletHitEvent;
import robocode.Condition;
import robocode.HitByBulletEvent;
import robocode.HitWallEvent;
import robocode.ScannedRobotEvent;
import robocode.util.Utils;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
/**
*
* NP - Nat Pavasant
*
* A micro-bot by Nat Pavasant; named after the author. This robot perform a
* Wave Surfing-like movement called Velocity Surfing and fire using a very
* simple GuessFactor targeting.
*
* Gun base on Falcon, by PEZ and Kawigi; Movement base on WaveSnake, by Kev.
*/
public class NP extends AdvancedRobot {
// //////////////////////////////////////////
// Falcon's Gun
static final double BULLET_POWER = 2.5; // 2.5 is the best by the way =)
static final double BULLET_VELOCITY = 12.5; // bullet velocity for 2.5-size
// bullet
static final int BINS = 31; // 31 bins is fine for non-smoothed array.
static final int MIDDLE_BIN = 15; // middle gin
static final double MEA = 0.694498266 / MIDDLE_BIN; // hard-coded for 2.5
// bullet power
static double _enemyX; // enemy location
static double _enemyY; // enemy location
static int _enemyDirection = 1;
static double distance;
// Segment: Lateral Velocity
// static int[][][] _gunStats = new int[6][4][BINS];
static int[][][][] _gunStats = new int[6][4][2][BINS];
// static int[][][][][] _gunStats = new int[6][4][2][3][BINS];
// Gun
// //////////////////////////////////////////
// //////////////////////////////////////////
// Movement
// Distance controller constant
static final double PREFERRED_DISTANCE = 180d;
static final double CLOSING_FACTOR = 10000d;
static double _moveFactor = 20; // length to move, store the direction as
// sign
static double _enemyEnergy; // keep track of enemy energy
static int _currentVelocity;
static int _myLateralVelocity;
static int _myLatVel, _distance;
static int[][][] _surfStats = new int[4][5][9];
public void run() {
setAdjustRadarForGunTurn(true);
// setAdjustGunForRobotTurn(true); // not enough codesize
do {
turnRadarRightRadians(1);
} while (true);
}
public void onScannedRobot(ScannedRobotEvent e) {
Wave wave;
double enemyAbsoluteBearing;
int mostVisited = MIDDLE_BIN, i = BINS;
// /////////////////////////////////////
// Wave (Velocity) Surfing movement
// Base loosely on WaveSnake, by Kev
//
// Turn Perpendicular with distance controller
setTurnRightRadians(Math
.cos((enemyAbsoluteBearing = e.getBearingRadians())
- ((NP.distance = e.getDistance()) - PREFERRED_DISTANCE)
* _moveFactor / CLOSING_FACTOR));
if (_enemyEnergy > (_enemyEnergy = e.getEnergy())) {
int testVel = 8;
do {
if (_surfStats[_distance][_myLatVel][testVel] < _surfStats[_distance][_myLatVel][_currentVelocity]) {
_currentVelocity = testVel;
}
if (testVel == 5)
testVel = 3;
} while (testVel-- > 0);
if (_currentVelocity < 4) {
onHitWall(null);
}
}
setMaxVelocity(2 * (_currentVelocity - 4));
setAhead(_moveFactor);
// /////////////////////////////////////
// /////////////////////////////////////
// GuessFactor targeting gun
// Base loosely on Falcon gun.
//
addCustomEvent(wave = new Wave());
_enemyX = (wave.wGunX = getX())
+ Math.sin(enemyAbsoluteBearing += getHeadingRadians())
* distance;
_enemyY = (wave.wGunY = getY()) + Math.cos(enemyAbsoluteBearing)
* distance;
double enemyLatVel;
// check for enemy movement direction, preserve old direction if current
// velocity is 0
int direction;
if ((direction = (int) Math.signum(enemyLatVel = e.getVelocity()
* Math.sin(e.getHeadingRadians() - (wave.wBearing = enemyAbsoluteBearing)))) != 0)
_enemyDirection = direction;
// Segment: lateralVelocity and forwardWall
// wave.stats = _gunStats[(Math.abs(enemyLatVel) >= 7.75) ? 4 : (int)
// (1.4427 * Math
// .log(Math.abs(enemyLatVel) + 1.75))][gunWallDistance(0.18247367367) ?
// (gunWallDistance(0.36494734735) ? (gunWallDistance(0.63865785787) ? 3
// : 2) : 1) : 0];
wave.stats = _gunStats[(Math.abs(enemyLatVel) >= 7.75) ? 4 : (int) (1.4427 * Math
.log(Math.abs(enemyLatVel) + 1.75))][gunWallDistance(
0.18247367367, enemyAbsoluteBearing) ? (gunWallDistance(
0.36494734735, enemyAbsoluteBearing) ? (gunWallDistance(
0.63865785787, enemyAbsoluteBearing) ? 3 : 2) : 1) : 0][gunWallDistance(
-0.36494734735, enemyAbsoluteBearing) ? 0 : 1];
do {
i--;
if (wave.stats[i] > wave.stats[mostVisited])
mostVisited = i;
} while (i > 0);
setTurnGunRightRadians(Utils.normalRelativeAngle(enemyAbsoluteBearing
- getGunHeadingRadians()
+ (wave.wBearingDirection = (MEA * _enemyDirection))
* (mostVisited - MIDDLE_BIN)));
wave.weight = setFireBullet(BULLET_POWER) != null ? 4 : 1;
// /////////////////////////////////////////
_distance = (int) (Math.min((distance + 50) / 200, 3));
_myLatVel = (int) ((Math.abs(getVelocity()
* Math.sin(e.getBearingRadians())) + 1) / 2);
setTurnRadarRightRadians(Utils
.normalRelativeAngle(enemyAbsoluteBearing
- getRadarHeadingRadians()) * 2);
}
static class Wave extends Condition {
double wGunX;
double wGunY;
double wBearing;
double wBearingDirection;
double wDistance;
int weight;
int[] stats;
public boolean test() {
if (Math.abs((wDistance += BULLET_VELOCITY)
- Point2D.distance(wGunX, wGunY, _enemyX, _enemyY)) <= BULLET_VELOCITY / 2) {
stats[(int) ((Utils.normalRelativeAngle(Math.atan2(_enemyX
- wGunX, _enemyY - wGunY)
- wBearing)) / wBearingDirection)
+ MIDDLE_BIN] += weight;
// removeCustomEvent(this);
}
return false;
}
}
public void onBulletHit(BulletHitEvent e) {
_enemyEnergy -= 12.5;
}
public void onHitByBullet(HitByBulletEvent e) {
_surfStats[_distance][_myLatVel][_currentVelocity]++;
}
public void onHitWall(HitWallEvent e) {
_moveFactor = -_moveFactor;
}
// inject the absBearing here is good since it on the register, but inject
// the distance isn't good since it out of register now.
private static boolean gunWallDistance(double wallDistance, double ab) {
double angle;
return (new Rectangle2D.Double(18, 18, 764, 564))
.contains(new Point2D.Double(_enemyX
+ Math.sin(angle = ab
+ (_enemyDirection * wallDistance)) * distance,
_enemyY + Math.cos(angle) * distance));
}
}