Update statement to stabilize rule changes
[troll.git] / src / main / java / com / codingame / game / Player.java
index ac96489..79d5aeb 100644 (file)
@@ -1,6 +1,7 @@
 package com.codingame.game;
 
 import java.util.List;
+import java.util.Random;
 
 import java.util.regex.Pattern;
 import java.util.Scanner;
@@ -16,27 +17,55 @@ public class Player extends AbstractMultiplayerPlayer {
     Model.Player model;
     View.Player view;
 
-    private String messageString = "";
-    public String getMessageString() { return messageString; }
-
     @Override
     public int getExpectedOutputLines() {
         return 1;
     }
 
-    static final Pattern rest = Pattern.compile(".*");
-    static final Pattern eol = Pattern.compile("\n");
-    public int getAction() throws TimeoutException, NumberFormatException {
-        Scanner s = new Scanner(getOutputs().get(0));
+    // same-typed positional parameters… a disaster waiting to happen
+    void gameInit(int roadLength, int initialStones, long seed, long salt) {
+        sendInputLine(String.format("%d %d %d %d %d",
+                                    roadLength, initialStones, seed,
+                                    model.getMultiplier(), salt));
+    }
+
+    void sendGameTurn() {
+        type = null;             //
+        stoneThrow = null;       // correctness over stability!
+        messageString = null;    //
+
+        sendInputLine(String.format("%d %d %d",
+                                    model.getTrollDistance(),
+                                    model.getStones(),
+                                    model.getOppStones()));
+        execute();
+    }
+
+    static enum Action { Throw, Timeout, Invalid }
+    Action type;
+    Integer stoneThrow;
+    String messageString;
+
+    private void reportMsg(String tag) {
+        System.err.println("Message @" + tag + ": " + messageString);
+    }
+
+    void receiveGameTurn() {
         messageString = "";
-        try {
-            int st = s.nextInt();
-            s.useDelimiter(eol);
-            if (s.hasNext(rest))
-                messageString = s.next(rest);
-            return st;
-        }
-        catch (InputMismatchException e) { throw new NumberFormatException(); }
-        catch (NoSuchElementException e) { throw new NumberFormatException(); }
+        try { messageString = getOutputs().get(0); }
+        catch (TimeoutException e) { type = Action.Timeout; return; }
+
+        Scanner s = new Scanner(messageString);
+        try { stoneThrow = s.nextInt(); }
+        catch (InputMismatchException e) { type = Action.Invalid; return; }
+        catch (NoSuchElementException e) { type = Action.Invalid; return; }
+
+        s.useDelimiter(eol);
+        if (s.hasNext(rest)) messageString = s.next(rest).trim();
+        else messageString = "";
+        type = Action.Throw;
     }
+
+    private static final Pattern rest = Pattern.compile(".*");
+    private static final Pattern eol = Pattern.compile("\n");
 }