From 157bd4f60635dc27d2c9baebea5589455b05f17b Mon Sep 17 00:00:00 2001 From: Jannis Harder Date: Wed, 25 May 2011 15:51:34 +0200 Subject: Tested and implemented scoring git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@272 72836036-5685-4462-b002-a69064685172 --- src/jrummikub/control/GameControl.java | 6 ++- src/jrummikub/control/RoundControl.java | 71 +++++++++++++++++++++++++++++---- 2 files changed, 67 insertions(+), 10 deletions(-) (limited to 'src/jrummikub/control') diff --git a/src/jrummikub/control/GameControl.java b/src/jrummikub/control/GameControl.java index 9690bb4..781af31 100644 --- a/src/jrummikub/control/GameControl.java +++ b/src/jrummikub/control/GameControl.java @@ -7,8 +7,10 @@ import jrummikub.model.GameSettings; import jrummikub.model.GameState; import jrummikub.model.IRoundState; import jrummikub.model.RoundState; +import jrummikub.model.Score; import jrummikub.util.Connection; import jrummikub.util.IListener; +import jrummikub.util.IListener1; import jrummikub.view.IView; /** @@ -68,10 +70,10 @@ public class GameControl { roundState.setActivePlayerNumber(gameState.getFirstRoundFirstPlayer()); roundControl = new RoundControl(roundState, view); - roundControl.getEndOfRoundEvent().add(new IListener() { + roundControl.getEndOfRoundEvent().add(new IListener1() { @Override - public void handle() { + public void handle(Score roundScore) { endOfRound(); } }); 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 endOfRoundEvent = new Event1(); private List connections = new ArrayList(); private boolean roundFinished; @@ -48,7 +50,7 @@ public class RoundControl { * * @return endOfRoundEvent */ - public IEvent getEndOfRoundEvent() { + public IEvent1 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 winners = new ArrayList(); + List points = new ArrayList(); + + boolean foundRegularWinner = false; + int winnerPlayerNumber = 0; + Pair bestScore = new Pair(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(points.get(i), roundState.getNthPlayer(i).getHand().getSize()))) { + winners.set(i, true); + } + } + } + return new Score(winners, points); + } + + private static Pair updateBestScore( + Pair bestScore, int stonePoints, int size) { + if (bestScore.getFirst() == stonePoints) { + return new Pair(stonePoints, Math.min(bestScore.getSecond(), size)); + } else if (bestScore.getFirst() < stonePoints) { + return new Pair(stonePoints, size); + } + return bestScore; + } } -- cgit v1.2.3