aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorCamil Staps2015-05-20 15:49:38 +0200
committerCamil Staps2015-05-20 15:49:38 +0200
commitb57170e633276a2f2d77048b0a9618e41a7f1da6 (patch)
tree244426ede700cc03819f0c981e0a593d75546635 /src
parentInitial commit (diff)
parenttimeoutexception, improved contestants (diff)
Merge branch 'java-engine-only' of ../../Botleagues_old
Diffstat (limited to 'src')
-rw-r--r--src/nl/camilstaps/botleagues/Contestant.java134
-rw-r--r--src/nl/camilstaps/botleagues/GameController.java106
-rw-r--r--src/nl/camilstaps/botleagues/roundbasedgame/Move.java5
-rw-r--r--src/nl/camilstaps/botleagues/roundbasedgame/RoundBasedGameController.java21
4 files changed, 266 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..570f884
--- /dev/null
+++ b/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/src/nl/camilstaps/botleagues/GameController.java b/src/nl/camilstaps/botleagues/GameController.java
new file mode 100644
index 0000000..85ee88f
--- /dev/null
+++ b/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/src/nl/camilstaps/botleagues/roundbasedgame/Move.java b/src/nl/camilstaps/botleagues/roundbasedgame/Move.java
new file mode 100644
index 0000000..5e03707
--- /dev/null
+++ b/src/nl/camilstaps/botleagues/roundbasedgame/Move.java
@@ -0,0 +1,5 @@
+package nl.camilstaps.botleagues.roundbasedgame;
+
+public class Move {
+
+}
diff --git a/src/nl/camilstaps/botleagues/roundbasedgame/RoundBasedGameController.java b/src/nl/camilstaps/botleagues/roundbasedgame/RoundBasedGameController.java
new file mode 100644
index 0000000..3f61565
--- /dev/null
+++ b/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();
+
+}