diff options
-rw-r--r-- | src/jrummikub/model/Table.java | 61 | ||||
-rw-r--r-- | test/jrummikub/model/TableTest.java | 6 |
2 files changed, 61 insertions, 6 deletions
diff --git a/src/jrummikub/model/Table.java b/src/jrummikub/model/Table.java index 59ef01d..e82ca03 100644 --- a/src/jrummikub/model/Table.java +++ b/src/jrummikub/model/Table.java @@ -1,5 +1,7 @@ package jrummikub.model; +import jrummikub.util.Pair; + /** Class administering the {@link Stone}s on the game-Table */ public class Table extends StoneTray<StoneSet> { @@ -11,13 +13,66 @@ public class Table extends StoneTray<StoneSet> { * stone to pick up */ public void pickUpStone(Stone stone) { - // TODO implement this method + // Find the set of the stone + StoneSet set = null; + Position setPosition = null; + int stonePosition = 0; + setLoop: for (Pair<StoneSet, Position> i : this) { + set = i.getFirst(); + setPosition = i.getSecond(); + stonePosition = 0; + for (Stone j : set) { + if (j == stone) { + break setLoop; + } + stonePosition++; + } + } + // Stone not found + if (set == null) { + return; + } + + splitSet(set, setPosition, stonePosition); + } + + private void splitSet(StoneSet set, Position setPosition, int stonePosition) { + pickUp(set); + + Pair<StoneSet, StoneSet> firstSplit = set.splitAt(stonePosition); + Pair<StoneSet, StoneSet> secondSplit = firstSplit.getSecond().splitAt(1); + + StoneSet leftSet = firstSplit.getFirst(); + StoneSet rightSet = secondSplit.getSecond(); + + if (set.classify() == StoneSet.Type.RUN) { + Position leftPosition, rightPosition; + leftPosition = setPosition; + rightPosition = new Position(setPosition.getX() + stonePosition, setPosition.getY()); + + drop(leftSet, leftPosition); + drop(rightSet, rightPosition); + } else { + Position newPosition = new Position(setPosition.getX() + 0.5f, setPosition.getY()); + + if (leftSet == null) { + drop(rightSet, newPosition); + } else if (rightSet == null) { + drop(leftSet, newPosition); + } else { + drop(leftSet.join(rightSet), newPosition); + } + } } /** Tests the Table for rule conflicts by checking all the {@link StoneSet} */ public boolean isValid() { - // TODO implement this method - return false; + for (Pair<StoneSet, Position> i : this) { + if (!i.getFirst().isValid()) { + return false; + } + } + return true; } } diff --git a/test/jrummikub/model/TableTest.java b/test/jrummikub/model/TableTest.java index 86f25ea..17ed8c8 100644 --- a/test/jrummikub/model/TableTest.java +++ b/test/jrummikub/model/TableTest.java @@ -50,7 +50,7 @@ public class TableTest { for (Object i : testTable) { counter++; } - assertEquals(counter, 1); + assertEquals(1, counter); } @Test @@ -58,7 +58,7 @@ public class TableTest { public void testPickUpStoneRun() { Stone targetStone = new Stone(BLACK); testTable.drop(new StoneSet(Arrays.asList(new Stone(1, RED), targetStone, - new Stone(3, BLACK))), new Position(0,0)); + new Stone(3, RED))), new Position(0,0)); assertTrue(testTable.isValid()); testTable.pickUpStone(targetStone); assertFalse(testTable.isValid()); @@ -67,6 +67,6 @@ public class TableTest { for (Object i : testTable) { counter++; } - assertEquals(counter, 2); + assertEquals(2, counter); } } |