From 7b8732714deb27cbb9295d0022231e00a71d28bb Mon Sep 17 00:00:00 2001 From: Jannis Harder Date: Tue, 3 May 2011 19:06:16 +0200 Subject: Implemented Table, passes tests git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@90 72836036-5685-4462-b002-a69064685172 --- src/jrummikub/model/Table.java | 61 +++++++++++++++++++++++++++++++++++++++--- 1 file changed, 58 insertions(+), 3 deletions(-) (limited to 'src/jrummikub/model') 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 { @@ -11,13 +13,66 @@ public class Table extends StoneTray { * 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 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 firstSplit = set.splitAt(stonePosition); + Pair 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 i : this) { + if (!i.getFirst().isValid()) { + return false; + } + } + return true; } } -- cgit v1.2.3