aboutsummaryrefslogtreecommitdiff
path: root/GuessANumber/Controller/src
diff options
context:
space:
mode:
authorCamil Staps2015-02-19 18:55:43 +0100
committerCamil Staps2015-02-19 18:55:43 +0100
commit12de5ca0388a5eb854fc465ee5e3f2775ff1e570 (patch)
treed298ce01fd7eeb9bf9c2c97db2041b840b55d2d8 /GuessANumber/Controller/src
directory structure
Diffstat (limited to 'GuessANumber/Controller/src')
-rw-r--r--GuessANumber/Controller/src/nl/camilstaps/botleagues/MyGame.java105
1 files changed, 105 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.
+ }
+ }
+
+}