package net.sf.colossus.game;
import java.io.IOException;
import java.io.PrintStream;
import java.util.ArrayList;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import net.sf.colossus.util.Glob;
@SuppressWarnings("boxing")
public class DiceStatistics
{
private static final Logger LOGGER = Logger.getLogger(DiceStatistics.class
.getName());
private final List<DiceRollSet> rolls = new ArrayList<DiceRollSet>();
private PrintStream statisticsOutputStream;
public DiceStatistics(String statisticsFileName)
{
openStatisticsFile(statisticsFileName);
}
private void openStatisticsFile(String statisticsFileName)
{
this.statisticsOutputStream = null;
if (statisticsFileName != null)
{
try
{
statisticsOutputStream = new PrintStream(statisticsFileName);
}
catch (IOException e)
{
LOGGER.log(Level.SEVERE,
"Couldn't open statics file for writing?"
+ statisticsFileName, e);
}
}
}
private void writeToStatFile(String string)
{
if (statisticsOutputStream != null)
{
statisticsOutputStream.println(string);
}
}
public void addOneSet(int turn, int battleTurn, Creature striker,
Creature target, int strikeNumber, List<String> rollsString)
{
LOGGER.finer("Adding rollset for turn " + turn + " battleturn "
+ battleTurn + " Striker " + striker.getDescription());
DiceRollSet newSet = new DiceRollSet(striker.getPlayer(), turn,
battleTurn, striker, target, strikeNumber, rollsString);
newSet.printRollSet();
rolls.add(newSet);
}
public void printStatistics(Player p)
{
int dicePerNumber[] = new int[] { 0, 0, 0, 0, 0, 0, 0 };
int totalCount = 0;
int totalSum = 0;
if (rolls.size() == 0)
{
writeToStatFile("\nPlayer " + p.getName()
+ " has not done any battle rolls in this game.");
return;
}
for (DiceRollSet set : rolls)
{
if (set.player.equals(p))
{
for (String oneRoll : set.rolls)
{
int roll = Integer.parseInt(oneRoll);
dicePerNumber[roll - 1]++;
totalCount++;
totalSum += roll;
}
}
}
String average = String.format("%3.2f", (float)totalSum / totalCount);
writeToStatFile("\nBattle roll statistics for player " + p.getName()
+ ", in total " + totalCount
+ " battle dice rolled; average of all rolls: " + average);
for (int i = 0; i < 6; i++)
{
int count = dicePerNumber[i];
String percent = String.format("%3.1f", 100 * (float)count
/ totalCount);
int j = i + 1;
writeToStatFile("Dice roll " + j + ": " + count + " times (= "
+ percent + "%)");
}
}
private class DiceRollSet
{
private final Player player;
private final int turn;
private final int battleTurn;
private final Creature striker;
private final Creature target;
private final int strikeNumber;
private final List<String> rolls;
DiceRollSet(Player player, int turn, int battleTurn, Creature striker,
Creature target, int strikeNumber, List<String> rollsString)
{
this.player = player;
this.turn = turn;
this.battleTurn = battleTurn;
this.striker = striker;
this.target = target;
this.strikeNumber = strikeNumber;
this.rolls = new ArrayList<String>(rollsString);
}
public void printRollSet()
{
String rollsGlob = Glob.glob(", ", this.rolls);
String result = String.format(
"Turn %d, Player %s, BT %d - %s strikes %s with SN %d: %s",
turn, this.player.getName(), battleTurn, striker.getName(),
target.getName(), strikeNumber, rollsGlob);
writeToStatFile(result);
}
}
}