aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCamil Staps2015-02-19 18:55:43 +0100
committerCamil Staps2015-02-19 18:55:43 +0100
commit8b64ef016d37da8853695c0a6dbd5a10ae6b4f54 (patch)
tree3d78aa22188b6e3a1aeee84593a01c1095801989 /src
directory structure
Diffstat (limited to 'src')
-rw-r--r--src/nl/camilstaps/botleagues/Contestant.java76
-rw-r--r--src/nl/camilstaps/botleagues/GameController.java65
2 files changed, 141 insertions, 0 deletions
diff --git a/src/nl/camilstaps/botleagues/Contestant.java b/src/nl/camilstaps/botleagues/Contestant.java
new file mode 100644
index 0000000..77fab8e
--- /dev/null
+++ b/src/nl/camilstaps/botleagues/Contestant.java
@@ -0,0 +1,76 @@
+package nl.camilstaps.botleagues;
+
+/**
+ * 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;
+
+ /**
+ * 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;
+ }
+
+ /**
+ * Get the process
+ * @return
+ */
+ public Process getProcess() {
+ return process;
+ }
+
+ @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/src/nl/camilstaps/botleagues/GameController.java b/src/nl/camilstaps/botleagues/GameController.java
new file mode 100644
index 0000000..77eea76
--- /dev/null
+++ b/src/nl/camilstaps/botleagues/GameController.java
@@ -0,0 +1,65 @@
+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<>();
+
+ /**
+ * 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()));
+ }
+
+ /**
+ * Rank the contestants by ascending score
+ */
+ protected void rank() {
+ Collections.sort(contestants);
+ }
+
+ /**
+ * 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);
+ }
+
+}