diff options
author | Camil Staps | 2015-05-20 17:10:09 +0200 |
---|---|---|
committer | Camil Staps | 2015-05-20 17:10:09 +0200 |
commit | 79423b71699235c643eafeeeee29c96c4dbfcb7d (patch) | |
tree | d570d1a7f9382d011e1daa4869d17082878f5c90 | |
parent | Fixed exception package (diff) | |
parent | timeoutexception, improved contestants (diff) |
Merge branch 'only-java-engine' of ../../Botleagues_old
6 files changed, 378 insertions, 0 deletions
diff --git a/GameController/.gitignore b/GameController/.gitignore new file mode 100644 index 0000000..5bda502 --- /dev/null +++ b/GameController/.gitignore @@ -0,0 +1,74 @@ +# Source: http://www.bmchild.com/2012/06/git-ignore-for-java-eclipse-project.html + +# Directories # +/build/ +/bin/ +/dist/ +target/ + +# OS Files # +.DS_Store + +*.class + +# Package Files # +*.jar +*.war +*.ear +*.db + +###################### +# Windows +###################### + +# Windows image file caches +Thumbs.db + +# Folder config file +Desktop.ini + +###################### +# OSX +###################### + +.DS_Store +.svn + +# Thumbnails +._* + +# Files that might appear on external disk +.Spotlight-V100 +.Trashes + + +###################### +# Eclipse +###################### + +*.pydevproject +.project +.metadata +bin/** +tmp/** +tmp/**/* +*.tmp +*.bak +*.swp +*~.nib +local.properties +.classpath +.settings/ +.loadpath +/src/main/resources/rebel.xml +# External tool builders +.externalToolBuilders/ + +# Locally stored "Eclipse launch configurations" +*.launch + +# CDT-specific +.cproject + +# PDT-specific +.buildpath diff --git a/GameController/build.xml b/GameController/build.xml new file mode 100644 index 0000000..31b3d59 --- /dev/null +++ b/GameController/build.xml @@ -0,0 +1,38 @@ +<project name="GameController" default="dist" basedir="."> + <description> + Controls a Botleagues game + </description> + <!-- set global properties for this build --> + <property name="src" location="src"/> + <property name="build" location="bin"/> + <property name="dist" location="dist"/> + + <target name="init"> + <!-- Create the time stamp --> + <tstamp/> + <!-- Create the build directory structure used by compile --> + <mkdir dir="${build}"/> + </target> + + <target name="compile" depends="init" + description="compile the source " > + <!-- Compile the java code from ${src} into ${build} --> + <javac srcdir="${src}" destdir="${build}"/> + </target> + + <target name="dist" depends="compile" + description="generate the distribution" > + <!-- Create the distribution directory --> + <mkdir dir="${dist}/lib"/> + + <!-- Put everything in ${build} into the MyProject-${DSTAMP}.jar file --> + <jar jarfile="${dist}/lib/MyProject-${DSTAMP}.jar" basedir="${build}"/> + </target> + + <target name="clean" + description="clean up" > + <!-- Delete the ${build} and ${dist} directory trees --> + <delete dir="${build}"/> + <delete dir="${dist}"/> + </target> +</project> diff --git a/GameController/src/nl/camilstaps/botleagues/Contestant.java b/GameController/src/nl/camilstaps/botleagues/Contestant.java new file mode 100644 index 0000000..570f884 --- /dev/null +++ b/GameController/src/nl/camilstaps/botleagues/Contestant.java @@ -0,0 +1,134 @@ +package nl.camilstaps.botleagues; + +import java.io.BufferedReader; +import java.io.BufferedWriter; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.OutputStreamWriter; + +import nl.camilstaps.botleagues.exceptions.TimeOutException; + +/** + * A contestant is a process, a unique identifier and has a score. + * + * @author Camil Staps <info@camilstaps.nl> + */ +public class Contestant implements Comparable<Contestant> { + + /** The process we're running this on */ + private final Process process; + /** A unique identifier (can be set in the constructor */ + private final int uid; + /** The score */ + private int score = 0; + + private int index; + + /** + * Create a new contestant with default uid -1 + * + * @param p + * the process to link this contestant to + */ + public Contestant(Process p) { + process = p; + this.uid = -1; + } + + /** + * Create a new contestant with a custom uid + * + * @param p + * the process to link this contestant to + * @param uid + * the uid + */ + public Contestant(Process p, int uid) { + process = p; + this.uid = uid; + } + + /** + * Set a new score + * + * @param new_score + */ + public void setScore(int new_score) { + score = new_score; + } + + /** + * Get the current score + * + * @return + */ + public int getScore() { + return score; + } + + public int getUID() { + return uid; + } + + public int getIndex() { + return index; + } + + public void setIndex(int index) { + this.index = index; + } + public void write(String text) { + BufferedWriter writer = new BufferedWriter(new OutputStreamWriter( + process.getOutputStream())); + + try { + writer.write(text); + writer.flush(); + } catch (IOException e) { + + e.printStackTrace(); + } + + } + + /** + * + * @return line + * @throws TimeOutException + * @throws IOException + */ + public String getLine(int timeOut) throws TimeOutException { + float startTime = System.currentTimeMillis(); + BufferedReader reader = new BufferedReader(new InputStreamReader( + process.getInputStream())); + try { + while (System.currentTimeMillis() - startTime < timeOut + && !reader.ready()) { + } + if (reader.ready()) + return reader.readLine(); + else + throw new TimeOutException(); + } catch (IOException e) { + + e.printStackTrace(); + return ""; + } + + } + + @Override + /** + * We compare contestants based on their score. + * Like this, we can make a ranking. + */ + public int compareTo(Contestant arg0) { + return ((Integer) getScore()).compareTo(arg0.getScore()); + } + + @Override + public String toString() { + return "Contestant " + uid + " (" + score + "): " + process.toString(); + } + +} diff --git a/GameController/src/nl/camilstaps/botleagues/GameController.java b/GameController/src/nl/camilstaps/botleagues/GameController.java new file mode 100644 index 0000000..85ee88f --- /dev/null +++ b/GameController/src/nl/camilstaps/botleagues/GameController.java @@ -0,0 +1,106 @@ +package nl.camilstaps.botleagues; + +import java.io.File; +import java.io.IOException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * The idea is to let this be a generic class that can be used for any game. It + * should take care of functions like: + * + * * Starting up bots * Sending data to bots * Receiving data from bots + * + * @author Camil Staps <info@camilstaps.nl> + */ +public abstract class GameController { + + /** The contestants in this game */ + List<Contestant> contestants = new ArrayList<Contestant>(); + Contestant currentContestant; + + /** + * Add a new contestant + * + * Internally, this will create a system call from directory `directory`: + * java `contestant` + * + * So, an example call would be: `directory` = /home/user/my-bot + * `contestant` = com.example.mybot.MyBot + * + * @param directory + * The directory to work from + * @param contestant + * The Java path to start up + * @throws IOException + */ + protected void addContestant(File directory, String contestant) + throws IOException { + System.err.println("Adding " + contestant + " from " + + directory.getAbsolutePath()); + ProcessBuilder pb = new ProcessBuilder("java", contestant); + pb.directory(directory); + contestants.add(new Contestant(pb.start(), contestants.size())); + } + + public void addBots(String[] bots) { + int index = 0; + try { + for (String bot : bots) { + int i = bot.lastIndexOf("/"); + addContestant(new File(bot.substring(0, i + 1)), + bot.substring(i + 1)); + contestants.get(index).setIndex(index); + index++; + } + } catch (IOException e) { + System.err.println(e.getMessage()); + } + } + + /** + * Rank the contestants by ascending score + */ + protected void rank() { + Collections.sort(contestants); + } + + /** + * Get the current contestants + * + * @return contestants + */ + public List<Contestant> getContestants() { + return contestants; + } + + /** + * + * @return currentContestant + */ + + public Contestant getCurrentContestant() { + return currentContestant; + } + + public void setCurrentContestant(Contestant contestant) { + currentContestant = contestant; + } + + + /** + * Get the winner of the game (the one with the highest score) + * + * NB: the contestants will be sorted after this. + * + * @see rank + * + * @return the winner of the game + */ + public Contestant getWinner() { + rank(); + return contestants.get(contestants.size() - 1); + } + +} diff --git a/GameController/src/nl/camilstaps/botleagues/roundbasedgame/Move.java b/GameController/src/nl/camilstaps/botleagues/roundbasedgame/Move.java new file mode 100644 index 0000000..5e03707 --- /dev/null +++ b/GameController/src/nl/camilstaps/botleagues/roundbasedgame/Move.java @@ -0,0 +1,5 @@ +package nl.camilstaps.botleagues.roundbasedgame; + +public class Move { + +} diff --git a/GameController/src/nl/camilstaps/botleagues/roundbasedgame/RoundBasedGameController.java b/GameController/src/nl/camilstaps/botleagues/roundbasedgame/RoundBasedGameController.java new file mode 100644 index 0000000..3f61565 --- /dev/null +++ b/GameController/src/nl/camilstaps/botleagues/roundbasedgame/RoundBasedGameController.java @@ -0,0 +1,21 @@ +package nl.camilstaps.botleagues.roundbasedgame; + +import nl.camilstaps.botleagues.GameController; +import nl.camilstaps.botleagues.exceptions.TimeOutException; + +public abstract class RoundBasedGameController extends GameController { + + public void run() throws TimeOutException { + while (getCurrentContestant() != null) + + nextTurn(); + setNextContestant(); + System.out.println(getWinner()); + + } + + public abstract Move nextTurn() throws TimeOutException; + + public abstract void setNextContestant(); + +} |