From 102299d0ffc15a08167f6eab8b9813c2f7dcda3b Mon Sep 17 00:00:00 2001 From: Jannis Harder Date: Tue, 24 May 2011 01:51:47 +0200 Subject: Fixed invalid moves without laying out stones and cleaned up rule checks git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@259 72836036-5685-4462-b002-a69064685172 --- src/jrummikub/control/RoundControl.java | 105 +++++++++++++------------------- 1 file changed, 42 insertions(+), 63 deletions(-) (limited to 'src/jrummikub') diff --git a/src/jrummikub/control/RoundControl.java b/src/jrummikub/control/RoundControl.java index a69b890..072aa7f 100644 --- a/src/jrummikub/control/RoundControl.java +++ b/src/jrummikub/control/RoundControl.java @@ -108,85 +108,64 @@ public class RoundControl { } } - /** - * after a legal move - * - * @return win or no win - */ - private boolean postLegalMove() { - roundState.setTable(clonedTable); + private boolean laidOutEnough() { + List newSets = tableSetDifference(roundState.getTable(), + clonedTable); - if (roundState.getActivePlayer().getHand().getSize() == 0) { - win(); - return true; + int totalValue = 0; + for (StoneSet set : newSets) { + totalValue += set.classify().getSecond(); } - return false; - } - private boolean notLaidOutYet(Set tableDiff) { - boolean win = false; - if (tableSetDifference(clonedTable, roundState.getTable()).isEmpty()) { - // laid sthg out and didn't change table - List newSets = tableSetDifference(roundState.getTable(), - clonedTable); + return totalValue >= roundState.getGameSettings() + .getInitialMeldThreshold(); + } - int totalValue = 0; - for (StoneSet set : newSets) { - totalValue += set.classify().getSecond(); + private void endOfTurn() { + checkTurn(); + roundState.nextPlayer(); + prepareTurn(); + } + + private void checkTurn() { + if (!clonedTable.isValid()) { + rejectMove(); + return; + } + if (!roundState.getActivePlayer().getLaidOut()) { + // Player touched forbidden stones + if (!tableSetDifference(clonedTable, roundState.getTable()).isEmpty()) { + rejectMove(); + return; } - - if (totalValue >= roundState.getGameSettings() - .getInitialMeldThreshold()) { - - roundState.getActivePlayer().setLaidOut(true); - win = postLegalMove(); - return win; - } else { - // deal penalty, reset - roundState.getGameHeap().putBack(tableDiff); - dealPenalty(tableDiff.size()); - return win; + if (!laidOutEnough()) { + rejectMove(); + return; } - } else { - // deal penalty, reset - roundState.getGameHeap().putBack(tableDiff); - dealPenalty(tableDiff.size()); - return win; } - } - - private void endOfTurn() { Set tableDiff = tableDifference(roundState.getTable(), clonedTable); + + roundState.setTable(clonedTable); if (tableDiff.isEmpty()) { // Player hasn't made a move - if (clonedTable.isValid()) { - 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; - } - } + roundState.getActivePlayer().setLaidOut(true); + if (roundState.getActivePlayer().getHand().getSize() == 0) { + win(); } } - roundState.nextPlayer(); - prepareTurn(); + } + + private void rejectMove() { + Set tableDiff = tableDifference(roundState.getTable(), + clonedTable); + // deal penalty, reset + roundState.getGameHeap().putBack(tableDiff); + dealPenalty(tableDiff.size()); + } static Set tableDifference(ITable oldTable, ITable newTable) { -- cgit v1.2.3