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 +++++++++++++++++++++++++++++++++++-- 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 { @@ -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; } } 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); } } -- cgit v1.2.3