summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/jrummikub/model/Table.java61
-rw-r--r--test/jrummikub/model/TableTest.java6
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);
}
}