1 package com.codingame.game;
3 import java.util.Random;
4 import java.util.Properties;
6 import com.codingame.gameengine.core.GameManager;
7 import com.codingame.gameengine.core.MultiplayerGameManager;
8 import com.google.inject.Inject;
11 @Inject private MultiplayerGameManager<com.codingame.game.Player> gameManager;
19 com.codingame.game.Player gp;
22 Player(int i) { index = i; }
24 private int castlePosition;
25 public int getCastlePosition() { return castlePosition; }
26 public void setCastlePosition(int pos) { castlePosition = pos; }
28 private int multiplier;
29 public int getMultiplier() { return multiplier; }
30 public void setMultiplier(int m) { multiplier = m; }
32 class FailedToThrowStonesAndShouldHave extends Exception {}
33 class ThrewMoreStonesThanHad extends Exception {}
36 public int getStones() { return stones; }
37 public void consumeStones(int n)
38 throws ThrewMoreStonesThanHad,
39 FailedToThrowStonesAndShouldHave
42 throw new ThrewMoreStonesThanHad();
44 if (n == 0 && stones > 0) {
45 throw new FailedToThrowStonesAndShouldHave();
47 setStones(stones - n);
49 public int consumeMaxStones() {
54 public int consumeMinStones() {
56 throw new Error("Internal error: tried to consume min stones on an empty heap.");
61 public void setStones(int n) {
64 public int getOppStones() {
65 return p0.stones + p1.stones - stones;
68 public void adjustScore(int trollPosition) {
70 gp.setScore(Math.abs(castlePosition - trollPosition));
74 public int getTrollDistance() {
75 return Math.abs(castlePosition - trollPosition);
79 void init(long seed) {
80 random = new Random(seed);
81 switch (random.nextInt(4)) {
100 Properties ps = gameManager.getGameParameters();
101 String buf = ps.getProperty("roadLength");
104 int i = Integer.parseInt(buf);
105 if (i < 0 || i > 20 || (i & 1) != 0) {
106 gameManager.addToGameSummary(GameManager.formatErrorMessage("Ignoring invalid road length: " + buf));
110 gameManager.addToGameSummary("Road length overridden to " + i);
113 catch(NumberFormatException e) {
114 gameManager.addToGameSummary(GameManager.formatErrorMessage("Ill-formed road length: " + buf));
117 ps.setProperty("roadLength", new Integer(roadLength).toString());
119 buf = ps.getProperty("initialStones");
122 int i = Integer.parseInt(buf);
124 gameManager.addToGameSummary(GameManager.formatErrorMessage("Ignoring invalid initial stone count: " + buf));
128 gameManager.addToGameSummary("Initial stone count overridden to " + buf);
131 catch (NumberFormatException e) {
132 gameManager.addToGameSummary(GameManager.formatErrorMessage("Ill-formed initial stone count: " + buf));
135 ps.setProperty("initialStones", new Integer(initialStones).toString());
137 trollPosition = roadLength / 2;
140 p0.gp = gameManager.getPlayer(0);
141 p0.setCastlePosition(0);
143 p0.adjustScore(trollPosition);
144 p0.setStones(initialStones);
147 p1.gp = gameManager.getPlayer(1);
148 p1.setCastlePosition(roadLength);
149 p1.setMultiplier(-1);
150 p1.adjustScore(trollPosition);
151 p1.setStones(initialStones);
154 void moveTroll(int delta) {
155 trollPosition += delta;
156 if (trollPosition <= 0) {
160 if (trollPosition >= roadLength) {
161 trollPosition = roadLength;
165 p0.adjustScore(trollPosition);
166 p1.adjustScore(trollPosition);
169 private Integer winner;
170 boolean haveWinner() {
171 return winner != null;
174 int getWinner() { return winner; }
175 int getLoser() { return 1 - winner; }
177 boolean exhausted() {
178 return p0.getStones() <= 0 || p1.getStones() <= 0;