diff options
Diffstat (limited to 'src/jrummikub/control')
-rw-r--r-- | src/jrummikub/control/GameControl.java | 6 | ||||
-rw-r--r-- | src/jrummikub/control/RoundControl.java | 116 |
2 files changed, 88 insertions, 34 deletions
diff --git a/src/jrummikub/control/GameControl.java b/src/jrummikub/control/GameControl.java index b5d763a..efc0c57 100644 --- a/src/jrummikub/control/GameControl.java +++ b/src/jrummikub/control/GameControl.java @@ -1,6 +1,6 @@ package jrummikub.control; -import jrummikub.model.GameSettings; +import jrummikub.model.IGameSettings; import jrummikub.model.RoundState; import jrummikub.util.IListener; import jrummikub.view.IView; @@ -9,7 +9,7 @@ import jrummikub.view.IView; * Controls a Game, at some point including all Rounds, starts new Rounds */ public class GameControl { - private GameSettings gameSettings; + private IGameSettings gameSettings; private IView view; private RoundControl roundControl; @@ -21,7 +21,7 @@ public class GameControl { * @param view * the view */ - public GameControl(GameSettings gameSettings, IView view) { + public GameControl(IGameSettings gameSettings, IView view) { this.gameSettings = gameSettings; this.view = view; diff --git a/src/jrummikub/control/RoundControl.java b/src/jrummikub/control/RoundControl.java index 9b746d1..a69b890 100644 --- a/src/jrummikub/control/RoundControl.java +++ b/src/jrummikub/control/RoundControl.java @@ -23,7 +23,7 @@ import jrummikub.view.IView; * Controller that manages a single round of rummikub */ public class RoundControl { - private IRoundState gameState; + private IRoundState roundState; private IView view; private ITable clonedTable; private Event endRoundEvent = new Event(); @@ -37,8 +37,8 @@ public class RoundControl { * @param view * view used for user interaction */ - public RoundControl(IRoundState gameState, IView view) { - this.gameState = gameState; + public RoundControl(IRoundState roundState, IView view) { + this.roundState = roundState; this.view = view; } @@ -69,20 +69,21 @@ public class RoundControl { } private void prepareTurn() { - clonedTable = (ITable) gameState.getTable().clone(); + clonedTable = (ITable) roundState.getTable().clone(); view.enableStartTurnPanel(true); view.getTablePanel().setStoneSets(clonedTable); - view.setCurrentPlayerName(gameState.getActivePlayer().getPlayerSettings().getName()); + view.setCurrentPlayerName(roundState.getActivePlayer() + .getPlayerSettings().getName()); view.getTablePanel().setLeftPlayerName( - gameState.getNthNextPlayer(1).getPlayerSettings().getName()); + roundState.getNthNextPlayer(1).getPlayerSettings().getName()); view.getTablePanel().setTopPlayerName( - gameState.getNthNextPlayer(2).getPlayerSettings().getName()); + roundState.getNthNextPlayer(2).getPlayerSettings().getName()); view.getTablePanel().setRightPlayerName( - gameState.getNthNextPlayer(3).getPlayerSettings().getName()); + roundState.getNthNextPlayer(3).getPlayerSettings().getName()); } private void startTurn() { - TurnControl turnControl = new TurnControl(gameState.getActivePlayer() + TurnControl turnControl = new TurnControl(roundState.getActivePlayer() .getHand(), clonedTable, view); connections.add(turnControl.getEndOfTurnEvent().add(new IListener() { @@ -96,42 +97,95 @@ public class RoundControl { } void deal() { - for (int i = 0; i < gameState.getPlayerCount(); i++) { - IHand hand = gameState.getNthNextPlayer(i).getHand(); + for (int i = 0; i < roundState.getPlayerCount(); i++) { + IHand hand = roundState.getNthNextPlayer(i).getHand(); for (int j = 0; j < 7; j++) { - hand.drop(gameState.getGameHeap().drawStone(), new Position(j, + hand.drop(roundState.getGameHeap().drawStone(), new Position(j, 0)); - hand.drop(gameState.getGameHeap().drawStone(), new Position(j, + hand.drop(roundState.getGameHeap().drawStone(), new Position(j, 1)); } } } - private void endOfTurn() { - Set<Stone> tableDiff = tableDifference(gameState.getTable(), - clonedTable); + /** + * after a legal move + * + * @return win or no win + */ + private boolean postLegalMove() { + roundState.setTable(clonedTable); - if (!tableDiff.isEmpty()) { // Player has made a move - if (clonedTable.isValid()) { - gameState.setTable(clonedTable); + if (roundState.getActivePlayer().getHand().getSize() == 0) { + win(); + return true; + } + return false; + } - if (gameState.getActivePlayer().getHand().getSize() == 0) { - win(); - return; - } + private boolean notLaidOutYet(Set<Stone> tableDiff) { + boolean win = false; + if (tableSetDifference(clonedTable, roundState.getTable()).isEmpty()) { + // laid sthg out and didn't change table + List<StoneSet> newSets = tableSetDifference(roundState.getTable(), + clonedTable); + + int totalValue = 0; + for (StoneSet set : newSets) { + totalValue += set.classify().getSecond(); + } + + if (totalValue >= roundState.getGameSettings() + .getInitialMeldThreshold()) { + + roundState.getActivePlayer().setLaidOut(true); + win = postLegalMove(); + return win; } else { - gameState.getGameHeap().putBack(tableDiff); + // deal penalty, reset + roundState.getGameHeap().putBack(tableDiff); dealPenalty(tableDiff.size()); + return win; } - } else { // Player hasn't made a move + } else { + // deal penalty, reset + roundState.getGameHeap().putBack(tableDiff); + dealPenalty(tableDiff.size()); + return win; + } + } + + private void endOfTurn() { + Set<Stone> tableDiff = tableDifference(roundState.getTable(), + clonedTable); + + if (tableDiff.isEmpty()) { + // Player hasn't made a move if (clonedTable.isValid()) { - gameState.setTable(clonedTable); + roundState.setTable(clonedTable); } - dealStone(); + } else { + // Player has made a move + if (!clonedTable.isValid()) { + // deal penalty, reset + roundState.getGameHeap().putBack(tableDiff); + dealPenalty(tableDiff.size()); + } else { + if (roundState.getActivePlayer().getLaidOut()) { + // Player has laid out + if (postLegalMove()) { + return; + } + } else { + // Player hasn't laid out + if (notLaidOutYet(tableDiff)) { + return; + } + } + } } - - gameState.nextPlayer(); + roundState.nextPlayer(); prepareTurn(); } @@ -164,7 +218,7 @@ public class RoundControl { } void dealStones(int count) { - IHand hand = gameState.getActivePlayer().getHand(); + IHand hand = roundState.getActivePlayer().getHand(); int rowCount = hand.getRowCount(); for (int i = 0; i < count; ++i) { @@ -172,7 +226,7 @@ public class RoundControl { rowCount++; } - hand.drop(gameState.getGameHeap().drawStone(), new Position( + hand.drop(roundState.getGameHeap().drawStone(), new Position( Hand.WIDTH - 1, rowCount - 1)); } } |