I've been working on a PatternMatching gun that is based on (and uses a few lines of code from) Moebius' gun. It seems, however, to be eventually causing my robot to time out, despite the fact that I am controlling the size of its buffers. Please help! Also, it's accuracy seems to be less than good... |
This code is based on the PM gun that Moebius uses, although only a couple of lines of code are actually from Moebius. Feel free to use this code - it's not all that accurate anyway, but it's good to learn PatternMatching. |
import java.util.Hashtable; |
import java.util.Vector; |
import java.util.Vector; |
double prednow; double eDist; |
for (int i = 0; i <= MAX_BUFFER_SIZE; i++) { arcLength.add(new Double(0)); |
if (getRoundNum?() == 0) { for (int i = 0; i <= MAX_BUFFER_SIZE; i++) { arcLength.add(new Double(0)); } |
eDist = e.getDistance(); |
timeToHit? += 2; |
//timeToHit? += 2; if (index + timeToHit? >= arcLength.size()) { index += arcLength.size() - index - timeToHit? - 1; } |
if (getY() < enemyY) { prednow = Math.asin(Math.sin((paramOne - paramTwo) / e.getDistance() + absBearing)); } else { if (getX() > enemyX) { prednow = Math.acos(Math.cos((paramOne - paramTwo) / e.getDistance() + absBearing)) * -1; } else { prednow = Math.acos(Math.cos((paramOne - paramTwo) / e.getDistance() + absBearing)); } } if (Math.abs(Math.toDegrees(prednow) - Math.toDegrees(robocode.util.Utils.normalRelativeAngle(absBearing))) > Math.toDegrees(Math.asin(8 / (20 - 3 * Math.min(3.0, e.getEnergy()/4))))) { fireLinear(e, absBearing, enemyX, enemyY); //out.println(Math.toDegrees(prednow) + " and " + Math.toDegrees(robocode.util.Utils.normalRelativeAngle(absBearing))); //out.println("Error - angle dif:" + (Math.abs(Math.toDegrees(prednow) - Math.toDegrees(robocode.util.Utils.normalRelativeAngle(absBearing)))) + " > " + (Math.toDegrees(Math.asin(8 / (20 - 3 * Math.min(3.0, e.getEnergy()/4)))))); } else { //out.println("Fired normally."); } |
} else { arcLength.removeElementAt?(arcLength.size() - 1); |
public void onPaint(java.awt.Graphics2D g) { g.setColor(Color.green); g.drawOval((int)(getX() + eDist * Math.sin(prednow)) +22, 600- (int)(getY() + eDist * Math.cos(prednow)) +22, 10,10); } public void fireLinear(ScannedRobotEvent e, double absBearing, double enemyX, double enemyY) { double bulletPower = Math.min(3.0,getEnergy()); double myX = getX(); double myY = getY(); double enemyHeading = e.getHeadingRadians(); double enemyVelocity = e.getVelocity(); 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; 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 = robocode.util.Utils.normalAbsoluteAngle?(Math.atan2(predictedX - getX(), predictedY - getY())); setTurnGunRightRadians?(robocode.util.Utils.normalRelativeAngle(theta - getGunHeadingRadians?())); } |
The updated code, with no memory problems, is above. Anyone who wants to help me refine it to hit more accurately, please feel free to give suggestions. Also, when it sees a clear targeting error, it uses linear targeting until it thinks it's fixed. -- Greywhind |