package tests;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import org.jdom.Element;
import org.jdom.JDOMException;
import org.jdom.input.SAXBuilder;
import ai.AI;
import rts.Game;
/**
* \brief Runs a Round-Robin Tournament against bots
*/
public class Tournament {
private static FileWriter out = null;
/**
* Main entry point
* (note: currently only works for 1v1 games)
* @param args
* @throws IOException
* @throws JDOMException
* @throws IllegalAccessException
* @throws InstantiationException
*/
public static void main(String args[]) throws JDOMException, IOException, InstantiationException, IllegalAccessException {
out = null;
if (args.length == 0) {
System.out.println("Missing required arguments.\n\n");
System.out.println("\tmicrorts TOURNAMENT_XML [RESULT_OUT]\n\n");
System.out.println("TOURNAMENT_XML - xml definition of the tournament\n");
System.out.println("RESULT_OUT - (optional) file to store the results\n");
System.exit(-1);
} else if (args.length >= 2) {
out = new FileWriter(args[1]);
}
Element tournament = new SAXBuilder().build(args[0]).getRootElement();
Game game = new Game(tournament.getChild("map").getAttributeValue("xml"), tournament.getChild("game").getAttributeValue("xml"), Integer.parseInt(tournament.getAttributeValue("turn_length")), Integer.parseInt(tournament.getAttributeValue("max_game_length")));
if (game.pgs.numberOfPlayers() != 2) {
System.out.println("Tournament currently only works for 2 player maps\n");
System.exit(-1);
}
int games = Integer.parseInt(tournament.getAttributeValue("games"));
boolean fog = tournament.getAttributeValue("fog").equalsIgnoreCase("on");
ArrayList<AI> agents = new ArrayList<AI>();
ArrayList<Integer> lesions = new ArrayList<Integer>();
ArrayList<String> names = new ArrayList<String>();
ArrayList<Integer> wins = new ArrayList<Integer>();
ArrayList<Integer> loses = new ArrayList<Integer>();
ArrayList<Integer> draws = new ArrayList<Integer>();
for (int i = 0; i < tournament.getChild("players").getChildren().size(); i++) {
Element player = (Element)tournament.getChild("players").getChildren().get(i);
try {
agents.add((AI)Class.forName(player.getAttributeValue("agent")).newInstance());
try {
int lesion = Integer.parseInt(player.getAttributeValue("lesion"));
lesions.add(lesion);
} catch (NumberFormatException e) {
lesions.add(0);
}
agents.get(agents.size()-1).setLesion(lesions.get(lesions.size()-1));
names.add(agents.get(agents.size()-1).getLabel());
wins.add(0);
loses.add(0);
draws.add(0);
} catch (ClassNotFoundException e) {
e.printStackTrace();
System.out.println("\n\nError: "+player.getAttributeValue("agent")+" agent does not exist\n\n");
System.exit(-1);
}
}
for (int i = 0; i < agents.size(); i++) {
for (int j = 0; j < agents.size(); j++) {
if (i != j) {
AI agentI = agents.get(i).getClass().newInstance();
agentI.setLesion(lesions.get(i));
game.addAgent(agentI);
AI agentJ = agents.get(j).getClass().newInstance();
agentJ.setLesion(lesions.get(j));
game.addAgent(agentJ);
int players[] = {i, j};
for (int k = 0; k < games; k++) {
write("-------------------------------------------");
write("Starting match:");
write(names.get(players[0])+" vs "+names.get(players[1])+" (Game "+(k+1)+" of "+games+")");
ArrayList<Integer> winner = game.play(fog);
if (winner.size() == 0) {
System.out.println("Game was a draw!");
draws.set(i, draws.get(i)+1);
draws.set(j, draws.get(j)+1);
} else {
System.out.println(names.get(players[winner.get(0)])+" has won!");
wins.set(players[winner.get(0)], wins.get(players[winner.get(0)])+1);
loses.set(players[winner.get(0)==1?0:1], loses.get(players[winner.get(0)==1?0:1])+1);
}
write("Scores:");
write("\t"+names.get(players[0])+": "+game.pgs.scores.get(0));
write("\t"+names.get(players[1])+": "+game.pgs.scores.get(1));
game.resetGame();
}
game.resetPlayers();
}
}
}
write("\n\nResults (Wins/Losses/Draws)");
for (int i = 0; i < names.size(); i++) {
write(names.get(i)+": "+wins.get(i)+"/"+loses.get(i)+"/"+draws.get(i));
}
out.close();
}
/**
* Prints a line of text to the console and the out file, if the outfile exists
* @param text
*/
private static void write(String text) {
if (out != null) {
try {
out.write(text+"\n\r");
} catch (IOException e) {
e.printStackTrace();
}
}
System.out.println(text);
}
}