diff options
author | Camil Staps | 2015-02-19 18:55:43 +0100 |
---|---|---|
committer | Camil Staps | 2015-02-19 18:55:43 +0100 |
commit | 12de5ca0388a5eb854fc465ee5e3f2775ff1e570 (patch) | |
tree | d298ce01fd7eeb9bf9c2c97db2041b840b55d2d8 /GuessANumber/Controller/src |
directory structure
Diffstat (limited to 'GuessANumber/Controller/src')
-rw-r--r-- | GuessANumber/Controller/src/nl/camilstaps/botleagues/MyGame.java | 105 |
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. + } + } + +} |