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 +++++++++++---------------- test/jrummikub/control/RoundControlTest.java | 72 +++++++++++++++++- 2 files changed, 113 insertions(+), 64 deletions(-) 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) { diff --git a/test/jrummikub/control/RoundControlTest.java b/test/jrummikub/control/RoundControlTest.java index 86847e0..550c2cb 100644 --- a/test/jrummikub/control/RoundControlTest.java +++ b/test/jrummikub/control/RoundControlTest.java @@ -131,6 +131,7 @@ public class RoundControlTest { assertFalse(roundState .getNthNextPlayer(roundState.getPlayerCount() - 1).getLaidOut()); assertEquals(0, roundState.getTable().getSize()); + assertEquals(14 + 6, hand.getSize()); } /** Threshold=30 */ @@ -177,6 +178,7 @@ public class RoundControlTest { assertFalse(roundState .getNthNextPlayer(roundState.getPlayerCount() - 1).getLaidOut()); assertEquals(0, roundState.getTable().getSize()); + assertEquals(14 + 9, hand.getSize()); } /** Threshold=30 */ @@ -246,6 +248,7 @@ public class RoundControlTest { assertFalse(roundState .getNthNextPlayer(roundState.getPlayerCount() - 1).getLaidOut()); assertEquals(2, roundState.getTable().getSize()); + assertEquals(14 + 6, hand.getSize()); } /** Threshold=30 */ @@ -318,6 +321,69 @@ public class RoundControlTest { assertFalse(roundState .getNthNextPlayer(roundState.getPlayerCount() - 1).getLaidOut()); assertEquals(2, roundState.getTable().getSize()); + assertEquals(14 + 7, hand.getSize()); + } + + @Test + public void laidOutJustChangedTable() { + MockGameSettings gameSettings = new MockGameSettings(); + RoundState roundState = new RoundState(gameSettings); + RoundControl roundControl = new RoundControl(roundState, view); + roundControl.startRound(); + view.startTurnEvent.emit(); + // Fake Turn to put stones on the table + Stone blueFour = new Stone(4, BLUE); + Stone blackFour = new Stone(4, BLACK); + Stone redFour = new Stone(4, RED); + Stone orangeFour = new Stone(4, ORANGE); + + Stone blueFive = new Stone(5, BLUE); + Stone blueSix = new Stone(6, BLUE); + Stone blueSeven = new Stone(7, BLUE); + + IHand hand = roundState.getActivePlayer().getHand(); + hand.drop(blueFive, new Position(0, 0)); + hand.drop(blueSix, new Position(0, 0)); + hand.drop(blueSeven, new Position(0, 0)); + + hand.drop(redFour, new Position(0, 0)); + hand.drop(blueFour, new Position(0, 0)); + hand.drop(blackFour, new Position(0, 0)); + hand.drop(orangeFour, new Position(0, 0)); + + view.handPanel.stoneClickEvent.emit(redFour, false); + view.handPanel.stoneClickEvent.emit(blueFour, true); + view.handPanel.stoneClickEvent.emit(blackFour, true); + view.handPanel.stoneClickEvent.emit(orangeFour, true); + + view.tablePanel.clickEvent.emit(new Position(0, 0)); + + view.handPanel.stoneClickEvent.emit(blueFive, false); + view.handPanel.stoneClickEvent.emit(blueSix, true); + view.handPanel.stoneClickEvent.emit(blueSeven, true); + + view.tablePanel.clickEvent.emit(new Position(0, 0)); + + view.playerPanel.endTurnEvent.emit(); + assertEquals(2, roundState.getTable().getSize()); + view.startTurnEvent.emit(); + + hand = roundState.getActivePlayer().getHand(); + + view.tablePanel.stoneClickEvent.emit(blueFour, false); + view.tablePanel.stoneClickEvent.emit(blueFive, true); + view.tablePanel.stoneClickEvent.emit(blueSix, true); + view.tablePanel.stoneClickEvent.emit(blueSeven, true); + + assertFalse(roundState.getActivePlayer().getLaidOut()); + + view.tablePanel.clickEvent.emit(new Position(0, 0)); + + view.playerPanel.endTurnEvent.emit(); + assertFalse(roundState + .getNthNextPlayer(roundState.getPlayerCount() - 1).getLaidOut()); + assertEquals(2, roundState.getTable().getSize()); + assertEquals(14 + 3, hand.getSize()); } /** Threshold=30 */ @@ -365,6 +431,7 @@ public class RoundControlTest { assertTrue(roundState.getNthNextPlayer(roundState.getPlayerCount() - 1) .getLaidOut()); assertEquals(2, roundState.getTable().getSize()); + assertEquals(14, hand.getSize()); } /** */ @@ -408,6 +475,7 @@ public class RoundControlTest { /** */ @Test public void testTableValidHandChanged() { + testRoundState.players.get(0).setLaidOut(true); testRound.startRound(); MockTable oldTable = testRoundState.table; testTable.valid = true; @@ -453,6 +521,7 @@ public class RoundControlTest { /** */ @Test public void testTableValidHandUnchanged() { + testRoundState.players.get(0).setLaidOut(true); testRound.startRound(); MockTable oldTable = testRoundState.table; testTable.valid = true; @@ -473,6 +542,7 @@ public class RoundControlTest { /** */ @Test public void testTableInvalidHandUnchanged() { + testRoundState.players.get(1).setLaidOut(true); testRound.startRound(); MockTable oldTable = testRoundState.table; testTable.valid = false; @@ -484,7 +554,7 @@ public class RoundControlTest { view.getPlayerPanel().endTurnEvent.emit(); assertNull(testRoundState.setTable); - assertEquals(14 + 1, testRoundState.players.get(0).hand.getSize()); + assertEquals(14 + 3, testRoundState.players.get(0).hand.getSize()); assertEquals(1, testRoundState.activePlayer); checkTurnStartSetUp(); -- cgit v1.2.3