aboutsummaryrefslogtreecommitdiff
path: root/GuessANumber
diff options
context:
space:
mode:
Diffstat (limited to 'GuessANumber')
-rw-r--r--GuessANumber/Controller/src/nl/camilstaps/botleagues/MyGame.java105
-rw-r--r--GuessANumber/RandomBot/.gitignore73
-rw-r--r--GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/Bot.java15
-rw-r--r--GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/BotParser.java79
-rw-r--r--GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/BotStarter.java31
-rw-r--r--GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/BotState.java67
-rw-r--r--GuessANumber/RandomBot/src/nl/camilstaps/botleagues/game/Move.java38
7 files changed, 408 insertions, 0 deletions
diff --git a/GuessANumber/Controller/src/nl/camilstaps/botleagues/MyGame.java b/GuessANumber/Controller/src/nl/camilstaps/botleagues/MyGame.java
new file mode 100644
index 0000000..e7c222d
--- /dev/null
+++ b/GuessANumber/Controller/src/nl/camilstaps/botleagues/MyGame.java
@@ -0,0 +1,105 @@
+package nl.camilstaps.botleagues;
+
+import java.io.BufferedReader;
+import java.io.BufferedWriter;
+import java.io.File;
+import java.io.IOException;
+import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
+import java.util.Random;
+
+/**
+ * The idea is to let this be an example of a game controller.
+ * Initially, we can do all the work here. Ideally, later, we'll split that up in an abstract part (in GameController) and an extension.
+ *
+ * @author Camil Staps <info@camilstaps.nl>
+ */
+public class MyGame extends GameController {
+
+ /**
+ * Start the game. In the command line arguments should be descriptions of the bots, as described in @see MyGame()
+ *
+ * @param args command line arguments
+ */
+ public static void main(String[] args) {
+ @SuppressWarnings("unused")
+ MyGame game = new MyGame(args);
+ }
+
+ /**
+ * Start a new game, and do some rounds. Print the winner.
+ *
+ * @param bots descriptions of the bots (array of strings). For example:
+ *
+ * /home/user/my-bot/com.example.mybot.MyBot
+ *
+ * Internally, this will cd to /home/user/my-bot and then execute
+ *
+ * java com.example.mybot.MyBot
+ *
+ * Arbitrarily many bots can be added
+ */
+ public MyGame(String[] bots) {
+ try {
+ for (String bot : bots) {
+ int i = bot.lastIndexOf("/");
+ addContestant(new File(bot.substring(0, i + 1)), bot.substring(i + 1));
+ }
+
+ for (int i = 0; i < 10; i++) {
+ doRound();
+ }
+ System.out.println(getWinner());
+ } catch (IOException e) {
+ System.err.println(e.getMessage());
+ }
+ }
+
+ /**
+ * Do a round.
+ *
+ * Take a number n in mind and let all the contestants guess. The contestants that are the closest to n get a point.
+ */
+ public void doRound() {
+ Random rand = new Random();
+ int n = rand.nextInt(100) + 1;
+
+ System.err.println("Contestants have to guess " + n);
+
+ try {
+ // Let each contestant guess
+ // That means: send "Guess" over stdin to the contestant, and read a number from stdout
+ int[] guesses = new int[contestants.size()];
+ int i = 0;
+ for (Contestant contestant : contestants) {
+ Process process = contestant.getProcess();
+ System.err.print("Asking contestant " + i + "...");
+ BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
+ BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(process.getOutputStream()));
+ writer.write("Guess\n");
+ writer.flush();
+
+ int answer = Integer.parseInt(reader.readLine());
+ guesses[i++] = Math.abs(n - answer);
+ System.err.println("he says " + answer + ", that's " + guesses[i - 1] + " difference.");
+ }
+
+ // Give every contestant that was the closest a point
+ int lowest = guesses[0];
+ for (i = 0; i < guesses.length; i++) {
+ if (guesses[i] < lowest) {
+ lowest = guesses[i];
+ }
+ }
+ for (i = 0; i < guesses.length; i++) {
+ if (guesses[i] == lowest) {
+ System.err.println("Point for contestant " + i);
+ contestants.get(i).setScore(contestants.get(i).getScore() + 1);
+ }
+ }
+ } catch (IOException e) {
+ // This shouldn't happen.
+ }
+ }
+
+}
diff --git a/GuessANumber/RandomBot/.gitignore b/GuessANumber/RandomBot/.gitignore
new file mode 100644
index 0000000..b630aee
--- /dev/null
+++ b/GuessANumber/RandomBot/.gitignore
@@ -0,0 +1,73 @@
+# Source: http://www.bmchild.com/2012/06/git-ignore-for-java-eclipse-project.html
+
+# Directories #
+/build/
+/bin/
+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/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/Bot.java b/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/Bot.java
new file mode 100644
index 0000000..217ffb5
--- /dev/null
+++ b/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/Bot.java
@@ -0,0 +1,15 @@
+package nl.camilstaps.botleagues.bot;
+
+import nl.camilstaps.botleagues.game.*;
+
+public interface Bot {
+
+ /**
+ * Get the next move according to a state
+ *
+ * @param the current state
+ * @return the move to do
+ */
+ public Move getMove(BotState state);
+
+}
diff --git a/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/BotParser.java b/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/BotParser.java
new file mode 100644
index 0000000..0413837
--- /dev/null
+++ b/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/BotParser.java
@@ -0,0 +1,79 @@
+package nl.camilstaps.botleagues.bot;
+
+import java.util.Scanner;
+
+import nl.camilstaps.botleagues.game.Move;
+
+/**
+ * Example bot parser
+ *
+ * @author Camil Staps <info@camilstaps.nl>
+ */
+public class BotParser {
+
+ /**
+ * stdin scanner and bot object
+ */
+ final Scanner scan;
+ final Bot bot;
+
+ /**
+ * Constructor
+ *
+ * @param bot
+ */
+ public BotParser(Bot bot) {
+ this.bot = bot;
+ scan = new Scanner(System.in);
+ }
+
+ /**
+ * Run the bot
+ */
+ public void run() {
+ // Hold the state of the bot
+ BotState state = new BotState();
+
+ // Keep reading stdin
+ while (scan.hasNextLine()) {
+
+ String line = scan.nextLine().trim();
+ if (line.length() == 0) {
+ continue;
+ }
+
+ // Split the line up in parts by whitespace
+ String[] parts = line.split("\\s+");
+
+ // What to do?
+ if (parts[0].equals("Guess")) { // Do we have to make a guess?
+ state.setState(BotState.STATE_GUESS);
+ Move move = bot.getMove(state);
+ System.out.println(move.toString());
+ } else if (parts[0].equals("Finish")) { // Are we finished?
+ state.setState(BotState.STATE_FINISH);
+ if (parts[1].equals("win")) { // What is the result?
+ state.setResult(BotState.RESULT_WIN);
+ } else if (parts[1].equals("tie")) {
+ state.setResult(BotState.RESULT_TIE);
+ } else if (parts[1].equals("loss")) {
+ state.setResult(BotState.RESULT_LOSS);
+ } else {
+ state.setResult(BotState.RESULT_NONE);
+ }
+ return;
+ } else { // Unparseable input
+ unparseable(line);
+ }
+ }
+ }
+
+ /**
+ * Show error message on stderr for unparseable input
+ *
+ * @param line
+ */
+ public void unparseable(String line) {
+ System.err.println("Unable to parse line ``"+line+"''");
+ }
+}
diff --git a/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/BotStarter.java b/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/BotStarter.java
new file mode 100644
index 0000000..dd65f7e
--- /dev/null
+++ b/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/BotStarter.java
@@ -0,0 +1,31 @@
+package nl.camilstaps.botleagues.bot;
+
+import java.util.Random;
+
+import nl.camilstaps.botleagues.game.Move;
+
+/**
+ * Example bot
+ *
+ * @author Camil Staps <info@camilstaps.nl>
+ */
+public class BotStarter implements Bot {
+
+ /**
+ * Start up a parser
+ * Command-line parameters are ignored
+ *
+ * @param args
+ */
+ public static void main(String[] args) {
+ BotParser parser = new BotParser(new BotStarter());
+ parser.run();
+ }
+
+ @Override
+ public Move getMove(BotState state) {
+ Random rand = new Random();
+ return new Move(rand.nextInt(100) + 1);
+ }
+
+}
diff --git a/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/BotState.java b/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/BotState.java
new file mode 100644
index 0000000..440cef4
--- /dev/null
+++ b/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/bot/BotState.java
@@ -0,0 +1,67 @@
+package nl.camilstaps.botleagues.bot;
+
+/**
+ * Current state of the game
+ *
+ * @author camilstaps
+ */
+public class BotState {
+
+ /**
+ * Several constants for the state of the game (at the start; we have to guess; finished)
+ */
+ public static final int STATE_START = -1;
+ public static final int STATE_GUESS = 0;
+ public static final int STATE_FINISH = 1;
+
+ /**
+ * Several constants for the result of the game (none; win; tie; loss)
+ */
+ public static final int RESULT_NONE = -1;
+ public static final int RESULT_WIN = 0;
+ public static final int RESULT_TIE = 1;
+ public static final int RESULT_LOSS = 2;
+
+ /**
+ * Private properties to hold the state and the result
+ */
+ private int state = STATE_START;
+ private int result = RESULT_NONE;
+
+ /**
+ * Set the state
+ *
+ * @param new_state
+ */
+ public void setState(int new_state) {
+ state = new_state;
+ }
+
+ /**
+ * Get the state
+ *
+ * @return the state
+ */
+ public int getState() {
+ return state;
+ }
+
+ /**
+ * Set the result
+ *
+ * @param new_result
+ */
+ public void setResult(int new_result) {
+ result = new_result;
+ }
+
+ /**
+ * Get the result
+ *
+ * @return the result
+ */
+ public int getResult() {
+ return result;
+ }
+
+}
diff --git a/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/game/Move.java b/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/game/Move.java
new file mode 100644
index 0000000..b2e1db5
--- /dev/null
+++ b/GuessANumber/RandomBot/src/nl/camilstaps/botleagues/game/Move.java
@@ -0,0 +1,38 @@
+package nl.camilstaps.botleagues.game;
+
+/**
+ * Move in the guess-a-number game
+ *
+ * @author Camil Staps <info@camilstaps.nl>
+ */
+public class Move {
+
+ /**
+ * The number we guess
+ */
+ private int number;
+
+ /**
+ * Constructor
+ *
+ * @param nr
+ */
+ public Move(int nr) {
+ number = nr;
+ }
+
+ /**
+ * Get the number we guessed
+ *
+ * @return
+ */
+ public int getNumber() {
+ return number;
+ }
+
+ @Override
+ public String toString() {
+ return Integer.toString(number);
+ }
+
+}