Difference between revisions of "Talk:CalculatingScore/ScoreWithRamming"
Jump to navigation
Jump to search
(Is it possible to calculate the score for an AdvancedRobot?) |
RednaxelaBot (talk | contribs) m (Using <syntaxhighlight>.) |
||
Line 1: | Line 1: | ||
− | < | + | <syntaxhighlight> |
package <package>; | package <package>; | ||
Line 171: | Line 171: | ||
} | } | ||
− | </ | + | </syntaxhighlight> |
Latest revision as of 09:33, 1 July 2010
package <package>;
import java.util.Iterator;
import java.util.Vector;
import robocode.*;
/**
* This is the Score class for duels.
*
* Instantiate this once on match start, and at the top of all the needed events
* just pass them to the instance. Call printScore at any time to print the
* scores to the console. Call getScore(id) at any time to get the score of the
* requested robot (0 = self, 1 = enemy).
*
* If you'd like to use this in your robot, feel free to, but give credit!
*
* @author Vuen (original)
* @author Jab (contributor)
*/
public class Score {
AdvancedRobot robot;
public Score(AdvancedRobot robot) {
this.robot = robot;
}
public double enemyEnergy;
public double myEnergy;
public String enemyName;
public static double[] total = new double[2];
public double[] survivalScore = new double[2];
public double[] bulletDamageBonus = new double[2];
public double[] bulletDamage = new double[2];
public double[] ramDamageBonus = new double[2];
public double[] ramDamage = new double[2];
public void onScannedRobot(ScannedRobotEvent e) {
myEnergy = robot.getEnergy();
enemyEnergy = e.getEnergy();
if (enemyName == null)
enemyName = e.getName();
}
public void onBulletHit(BulletHitEvent e) {
if (e.getEnergy() < 0.001) {
System.out.println("Score.onBulletHit()");
return;
} //ignore if enemy dead
bulletDamage[0] += robocode.Rules.getBulletDamage(e.getBullet()
.getPower());
}
public void onHitByBullet(HitByBulletEvent e) {
if (robocode.Rules.getBulletDamage(e.getPower()) > myEnergy) {
System.out.println("Score.onHitByBullet()");
return;
} //ignore if self dead
bulletDamage[1] += robocode.Rules.getBulletDamage(e.getBullet()
.getPower());
}
public void onHitRobot(HitRobotEvent e) {
ramDamage[e.isMyFault() ? 0 : 1] += robocode.Rules.ROBOT_HIT_DAMAGE;
}
public void onWin(WinEvent e) {
Vector<Event> v = robot.getAllEvents();
Iterator<Event> i = v.iterator();
while (i.hasNext()) {
Event event = i.next();
System.out.println("Missed event: " + event.getClass());
if (event instanceof BulletHitEvent)
onBulletHit((BulletHitEvent) event);
if (event instanceof HitByBulletEvent)
onHitByBullet((HitByBulletEvent) event);
if (event instanceof HitRobotEvent)
onHitRobot((HitRobotEvent) event);
}
survivalScore[0] = 60;
if (v.size() > 0)
if (v.lastElement() instanceof BulletHitEvent)
bulletDamageBonus[0] = (bulletDamage[0] + ramDamage[0]) * .2;
else if (v.lastElement() instanceof HitRobotEvent)
ramDamageBonus[0] = (bulletDamage[0] + ramDamage[0]) * .3;
ramDamage[0] *= 2;
ramDamage[1] *= 2;
total[0] += survivalScore[0] + bulletDamageBonus[0] + bulletDamage[0]
+ ramDamageBonus[0] + ramDamage[0];
total[1] += survivalScore[1] + bulletDamageBonus[1] + bulletDamage[1]
+ ramDamageBonus[1] + ramDamage[1];
this.printScore();
}
public void onDeath(DeathEvent e) {
Vector<Event> v = robot.getAllEvents();
Iterator<Event> i = v.iterator();
while (i.hasNext()) {
Event event = i.next();
System.out.println("Missed event: " + event.getClass());
if (event instanceof BulletHitEvent)
onBulletHit((BulletHitEvent) event);
if (event instanceof HitByBulletEvent)
onHitByBullet((HitByBulletEvent) event);
if (event instanceof HitRobotEvent)
onHitRobot((HitRobotEvent) event);
}
survivalScore[1] = 60;
if (v.size() > 0)
if (v.lastElement() instanceof BulletHitEvent)
bulletDamageBonus[1] = (bulletDamage[1] + ramDamage[1]) * .2;
else if (v.lastElement() instanceof HitRobotEvent)
ramDamageBonus[1] = (bulletDamage[1] + ramDamage[1]) * .3;
ramDamage[0] *= 2;
ramDamage[1] *= 2;
total[0] += survivalScore[0] + bulletDamageBonus[0] + bulletDamage[0]
+ ramDamageBonus[0] + ramDamage[0];
total[1] += survivalScore[1] + bulletDamageBonus[1] + bulletDamage[1]
+ ramDamageBonus[1] + ramDamage[1];
this.printScore();
}
/** returns the score of the requested robot: 0=self, 1=enemy */
public int getScore(int id) {
return (int) Math.round(total[id]);
}
/** prints the score-card to the console */
public void printScore() {
System.out.println("Total: " + Math.round(total[0]) + " "
+ robot.getName());
double totalMe = survivalScore[0] + bulletDamageBonus[0]
+ bulletDamage[0] + ramDamageBonus[0] + ramDamage[0];
System.out
.println("Total Survival BulletDmg BulletBonus RamDmg*2 RamDmgBonus");
System.out.println(Math.round(totalMe) + " "
+ Math.round(survivalScore[0]) + " "
+ Math.round(bulletDamage[0]) + " "
+ Math.round(bulletDamageBonus[0]) + " "
+ Math.round(ramDamage[0]) + " "
+ Math.round(ramDamageBonus[0]));
System.out.println();
System.out.println("Total: " + Math.round(total[1]) + " " + enemyName);
double totalEnemy = survivalScore[1] + bulletDamageBonus[1]
+ bulletDamage[1] + ramDamageBonus[1] + ramDamage[1];
System.out
.println("Total Survival BulletDmg BulletBonus RamDmg*2 RamDmgBonus");
System.out.println(Math.round(totalEnemy) + " "
+ Math.round(survivalScore[1]) + " "
+ Math.round(bulletDamage[1]) + " "
+ Math.round(bulletDamageBonus[1]) + " "
+ Math.round(ramDamage[1]) + " "
+ Math.round(ramDamageBonus[1]));
}
}