diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jrummikub/model/Table.java | 61 |
1 files changed, 58 insertions, 3 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; } } |