Talk:CalculatingScore/ScoreWithRamming
Jump to navigation
Jump to search
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]));
}
}
- [View source↑]
- [History↑]
You cannot post new threads to this discussion page because it has been protected from new threads, or you do not currently have permission to edit.
There are no threads on this page yet.