summaryrefslogtreecommitdiffstats
path: root/src/jrummikub
diff options
context:
space:
mode:
Diffstat (limited to 'src/jrummikub')
-rw-r--r--src/jrummikub/model/Table.java61
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;
}
}