/******************************************************************************* * Copyright (c) 2001, 2010 Mathew A. Nelson and Robocode contributors * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://robocode.sourceforge.net/license/epl-v10.html * * Contributors: * Mathew A. Nelson * - Initial API and implementation * Flemming N. Larsen * - Replaced ContestantPeerVector with plain Vector * - Added Rank column * - Ported to Java 5 * - Optimized * - Code cleanup * - Updated to use methods from the Logger and StringUtil, which * replaces methods that have been (re)moved from the robocode.util.Utils * - Changed the column names to be more informative and equal in width * Robert D. Maupin * - Replaced old collection types like Vector and Hashtable with * synchronized List and HashMap * Nathaniel Troutman * - Added sanity check on battle object in getRowCount() * Endre Palatinus, Eniko Nagy, Attila Csizofszki and Laszlo Vigh * - Score with % (percentage) in the table view *******************************************************************************/ package net.sf.robocode.battle; import net.sf.robocode.io.Logger; import robocode.BattleResults; import java.io.FileOutputStream; import java.io.IOException; import java.io.PrintStream; import java.text.DateFormat; import java.text.NumberFormat; import java.util.Date; /** * @author Mathew A. Nelson (original) * @author Flemming N. Larsen (contributor) * @author Robert D. Maupin (contributor) * @author Nathaniel Troutman (contributor) * @author Endre Palatinus, Eniko Nagy, Attila Csizofszki and Laszlo Vigh (contributors) */ @SuppressWarnings("serial") public class BattleResultsTableModel extends javax.swing.table.AbstractTableModel { private String title; private final BattleResults[] results; private final int numRounds; // The sum of the scores gathered by the robots. private final double totalScore; public BattleResultsTableModel(BattleResults[] results, int numRounds) { this.results = results; this.numRounds = numRounds; totalScore = countTotalScore(); } /** * Function for counting the sum of the scores gathered by the robots. * * @return The sum. */ private double countTotalScore() { double totalScore = 0; for (BattleResults result : results) { totalScore += result.getScore(); } return totalScore; } public int getColumnCount() { return 12; } @Override public String getColumnName(int col) { switch (col) { case 0: return "Rank"; case 1: return "Robot Name"; case 2: return " Total Score "; case 3: return "Survival"; case 4: return "Surv Bonus"; case 5: return "Bullet Dmg"; case 6: return "Bullet Bonus"; case 7: return "Ram Dmg * 2"; case 8: return "Ram Bonus"; case 9: return " 1sts "; case 10: return " 2nds "; case 11: return " 3rds "; default: return ""; } } public int getRowCount() { return results.length; } public String getTitle() { if (title == null) { int round = numRounds; title = "Results for " + round + " round"; if (round > 1) { title += 's'; } } return title; } public Object getValueAt(int row, int col) { BattleResults statistics = results[row]; switch (col) { case 0: { int place = row + 1; while (place < getRowCount() && statistics.getScore() == results[place].getScore()) { place++; } return getPlacementString(place); } case 1: return statistics.getTeamLeaderName(); case 2: String percent = ""; if (totalScore != 0) { percent = " (" + NumberFormat.getPercentInstance().format(statistics.getScore() / totalScore) + ")"; } return "" + (int) (statistics.getScore() + 0.5) + percent; case 3: return "" + (int) (statistics.getSurvival() + 0.5); case 4: return "" + (int) (statistics.getLastSurvivorBonus() + 0.5); case 5: return "" + (int) (statistics.getBulletDamage() + 0.5); case 6: return "" + (int) (statistics.getBulletDamageBonus() + 0.5); case 7: return "" + (int) (statistics.getRamDamage() + 0.5); case 8: return "" + (int) (statistics.getRamDamageBonus() + 0.5); case 9: return "" + statistics.getFirsts(); case 10: return "" + statistics.getSeconds(); case 11: return "" + statistics.getThirds(); default: return ""; } } // Used for printing to the console only public void print(PrintStream out) { out.println(getTitle()); for (int col = 1; col < getColumnCount(); col++) { out.print(getColumnName(col) + "\t"); } out.println(); for (int row = 0; row < getRowCount(); row++) { out.print(getValueAt(row, 0) + ": "); for (int col = 1; col < getColumnCount(); col++) { out.print(getValueAt(row, col) + "\t"); } out.println(); } } public void saveToFile(String filename, boolean append) { try { PrintStream out = new PrintStream(new FileOutputStream(filename, append)); out.println(DateFormat.getDateTimeInstance().format(new Date())); out.println(getTitle()); for (int col = 0; col < getColumnCount(); col++) { if (col > 0) { out.print(','); } out.print(getColumnName(col)); } out.println(); for (int row = 0; row < getRowCount(); row++) { for (int col = 0; col < getColumnCount(); col++) { if (col > 0) { out.print(','); } out.print(getValueAt(row, col)); } out.println(); } out.println("$"); out.close(); } catch (IOException e) { Logger.logError(e); } } public static String getPlacementString(int i) { String result = "" + i; if (i > 3 && i < 20) { result += "th"; } else if (i % 10 == 1) { result += "st"; } else if (i % 10 == 2) { result += "nd"; } else if (i % 10 == 3) { result += "rd"; } else { result += "th"; } return result; } }