summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/control/RoundControl.java
diff options
context:
space:
mode:
authorJannis Harder <harder@informatik.uni-luebeck.de>2011-05-25 15:51:34 +0200
committerJannis Harder <harder@informatik.uni-luebeck.de>2011-05-25 15:51:34 +0200
commit157bd4f60635dc27d2c9baebea5589455b05f17b (patch)
treeb85dda7fea57ca297c79f26c3764954683465eec /src/jrummikub/control/RoundControl.java
parente3b5a0790dbb5c9ffeb5c23db81528faef3a1a05 (diff)
downloadJRummikub-157bd4f60635dc27d2c9baebea5589455b05f17b.tar
JRummikub-157bd4f60635dc27d2c9baebea5589455b05f17b.zip
Tested and implemented scoring
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@272 72836036-5685-4462-b002-a69064685172
Diffstat (limited to 'src/jrummikub/control/RoundControl.java')
-rw-r--r--src/jrummikub/control/RoundControl.java71
1 files changed, 63 insertions, 8 deletions
diff --git a/src/jrummikub/control/RoundControl.java b/src/jrummikub/control/RoundControl.java
index 1829725..91bf59b 100644
--- a/src/jrummikub/control/RoundControl.java
+++ b/src/jrummikub/control/RoundControl.java
@@ -6,15 +6,17 @@ import java.util.List;
import java.util.Set;
import jrummikub.model.Hand;
-import jrummikub.model.IRoundState;
import jrummikub.model.IHand;
+import jrummikub.model.IPlayer;
+import jrummikub.model.IRoundState;
import jrummikub.model.ITable;
import jrummikub.model.Position;
+import jrummikub.model.Score;
import jrummikub.model.Stone;
import jrummikub.model.StoneSet;
import jrummikub.util.Connection;
-import jrummikub.util.Event;
-import jrummikub.util.IEvent;
+import jrummikub.util.Event1;
+import jrummikub.util.IEvent1;
import jrummikub.util.IListener;
import jrummikub.util.Pair;
import jrummikub.view.IView;
@@ -26,7 +28,7 @@ public class RoundControl {
private IRoundState roundState;
private IView view;
private ITable clonedTable;
- private Event endOfRoundEvent = new Event();
+ private Event1<Score> endOfRoundEvent = new Event1<Score>();
private List<Connection> connections = new ArrayList<Connection>();
private boolean roundFinished;
@@ -48,7 +50,7 @@ public class RoundControl {
*
* @return endOfRoundEvent
*/
- public IEvent getEndOfRoundEvent() {
+ public IEvent1<Score> getEndOfRoundEvent() {
return endOfRoundEvent;
}
@@ -134,7 +136,6 @@ public class RoundControl {
}
} else {
if (roundState.getActivePlayer() == roundState.getLastPlayer()) {
- // TODO check who has won
endOfRound();
} else {
roundState.nextPlayer();
@@ -237,11 +238,65 @@ public class RoundControl {
dealStones(count + 3);
}
- private void endOfRound() {
+ void endOfRound() {
for (Connection c : connections) {
c.remove();
}
- endOfRoundEvent.emit();
+ Score roundScore = score();
+ endOfRoundEvent.emit(roundScore);
roundFinished = true;
}
+
+ private Score score() {
+ List<Boolean> winners = new ArrayList<Boolean>();
+ List<Integer> points = new ArrayList<Integer>();
+
+ boolean foundRegularWinner = false;
+ int winnerPlayerNumber = 0;
+ Pair<Integer, Integer> bestScore = new Pair<Integer, Integer>(Integer.MIN_VALUE, Integer.MAX_VALUE);
+ int pointSum = 0;
+ for (int i = 0; i < roundState.getPlayerCount(); i++) {
+ IPlayer player = roundState.getNthPlayer(i);
+ IHand playerHand = player.getHand();
+ boolean isWinner = playerHand.getSize() == 0;
+ winners.add(isWinner);
+ if (isWinner) {
+ foundRegularWinner = true;
+ winnerPlayerNumber = i;
+ }
+ int stonePoints = 0;
+
+ if (!player.getLaidOut()) {
+ stonePoints = playerHand.isInitialMeldPossible() ? 200 : 100;
+ } else {
+ stonePoints = playerHand.getStonePoints();
+ }
+
+ bestScore = updateBestScore(bestScore, -stonePoints, playerHand.getSize());
+
+ points.add(-stonePoints);
+ pointSum += stonePoints;
+ }
+
+ if (foundRegularWinner) {
+ points.set(winnerPlayerNumber, pointSum);
+ } else {
+ for (int i = 0; i < roundState.getPlayerCount(); i++) {
+ if (bestScore.equals(new Pair<Integer, Integer>(points.get(i), roundState.getNthPlayer(i).getHand().getSize()))) {
+ winners.set(i, true);
+ }
+ }
+ }
+ return new Score(winners, points);
+ }
+
+ private static Pair<Integer, Integer> updateBestScore(
+ Pair<Integer, Integer> bestScore, int stonePoints, int size) {
+ if (bestScore.getFirst() == stonePoints) {
+ return new Pair<Integer, Integer>(stonePoints, Math.min(bestScore.getSecond(), size));
+ } else if (bestScore.getFirst() < stonePoints) {
+ return new Pair<Integer, Integer>(stonePoints, size);
+ }
+ return bestScore;
+ }
}