Extract more referee to the view
[troll.git] / src / main / java / com / codingame / game / Model.java
index b310fdd..405db66 100644 (file)
@@ -2,11 +2,75 @@ package com.codingame.game;
 
 import java.util.Random;
 
+import com.codingame.gameengine.core.MultiplayerGameManager;
+import com.google.inject.Inject;
+
 class Model {
+    @Inject private MultiplayerGameManager<com.codingame.game.Player> gameManager;
     Random random;
     int roadLength;
     int initialStones;
     int trollPosition;
+    Player p0, p1;
+
+    class Player {
+        com.codingame.game.Player gp;
+        int index;
+
+        Player(int i) { index = i; }
+
+        private int castlePosition;
+        public int getCastlePosition() { return castlePosition; }
+        public void setCastlePosition(int pos) { castlePosition = pos; }
+
+        private int multiplier;
+        public int getMultiplier() { return multiplier; }
+        public void setMultiplier(int m) { multiplier = m; }
+
+        class FailedToThrowStonesAndShouldHave extends Exception {}
+        class ThrewMoreStonesThanHad extends Exception {}
+
+        private int stones;
+        public int getStones() { return stones; }
+        public void consumeStones(int n)
+            throws ThrewMoreStonesThanHad,
+                   FailedToThrowStonesAndShouldHave
+        {
+            if (n > stones) {
+                throw new ThrewMoreStonesThanHad();
+            }
+            if (n == 0 && stones > 0) {
+                throw new FailedToThrowStonesAndShouldHave();
+            }
+            setStones(stones - n);
+        }
+        public int consumeMaxStones() {
+            int r = stones;
+            stones = 0;
+            return r;
+        }
+        public int consumeMinStones() {
+            if (stones < 1) {
+                throw new Error("Internal error: tried to consume min stones on an empty heap.");
+            }
+            stones--;
+            return 1;
+        }
+        public void setStones(int n) {
+            stones = n;
+        }
+        public int getOppStones() {
+            return p0.stones + p1.stones - stones;
+        }
+
+        public void adjustScore(int trollPosition) {
+            gp.setScore(Math.abs(castlePosition - trollPosition));
+        }
+
+        public int getTrollDistance() {
+            return Math.abs(castlePosition - trollPosition);
+        }
+    }
 
     void init(long seed) {
         random = new Random(seed);
@@ -30,5 +94,40 @@ class Model {
         }
 
         trollPosition = roadLength / 2;
+
+        p0 = new Player(0);
+        p0.gp = gameManager.getPlayer(0);
+        p0.setCastlePosition(0);
+        p0.setMultiplier(1);
+        p0.adjustScore(trollPosition);
+        p0.setStones(initialStones);
+
+        p1 = new Player(1);
+        p1.gp = gameManager.getPlayer(1);
+        p1.setCastlePosition(roadLength);
+        p1.setMultiplier(-1);
+        p1.adjustScore(trollPosition);
+        p1.setStones(initialStones);
+    }
+
+    private int winner;
+    boolean haveWinner() {
+        if (trollPosition == 0) {
+            winner = 1;
+            return true;
+        }
+        else if (trollPosition == roadLength) {
+            winner = 0;
+            return true;
+        }
+        else {
+            return false;
+        }
+    }
+    int getWinner() { return winner; }
+    int getLoser() { return 1 - winner; }
+
+    boolean exhausted() {
+        return p0.getStones() <= 0 && p1.getStones() <= 0;
     }
 }