diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/jrummikub/model/GameState.java | 5 | ||||
-rw-r--r-- | src/jrummikub/model/Stone.java | 13 | ||||
-rw-r--r-- | src/jrummikub/model/StoneSet.java | 79 | ||||
-rw-r--r-- | src/jrummikub/model/StoneTray.java | 36 | ||||
-rw-r--r-- | src/jrummikub/model/Table.java | 9 |
5 files changed, 93 insertions, 49 deletions
diff --git a/src/jrummikub/model/GameState.java b/src/jrummikub/model/GameState.java index d5c12ba..83aeff6 100644 --- a/src/jrummikub/model/GameState.java +++ b/src/jrummikub/model/GameState.java @@ -1,5 +1,7 @@ package jrummikub.model; +import java.util.List; + /** Class managing the overall and momentary GameState */ public class GameState { private Table table; @@ -13,7 +15,8 @@ public class GameState { } public Player activePlayer() { - + // TODO implement this + return null; } } diff --git a/src/jrummikub/model/Stone.java b/src/jrummikub/model/Stone.java index 569d099..9721602 100644 --- a/src/jrummikub/model/Stone.java +++ b/src/jrummikub/model/Stone.java @@ -2,7 +2,7 @@ package jrummikub.model; /** Basic Rummikub Stone */ -public class Stone { +public class Stone implements Sizeable { private int value; private StoneColor color; private final boolean joker; @@ -37,4 +37,15 @@ public class Stone { return value; } + + @Override + public float getWidth() { + return 1; + } + + @Override + public float getHeight() { + return 1; + } + } diff --git a/src/jrummikub/model/StoneSet.java b/src/jrummikub/model/StoneSet.java index 98d952f..465692a 100644 --- a/src/jrummikub/model/StoneSet.java +++ b/src/jrummikub/model/StoneSet.java @@ -43,45 +43,62 @@ public class StoneSet implements Iterable<Stone>, Sizeable { // is run if (stones.get(nonJoker1).getColor() == stones.get(nonJoker2) .getColor()) { - StoneColor runColor = stones.get(nonJoker1).getColor(); - int startValue = stones.get(nonJoker1).getValue() - nonJoker1; - int endValue = startValue + stones.size() - 1; - if (startValue < 1 || endValue > 13) { - return false; - } - for (int i = 0; i < stones.size(); i++) { - if (stones.get(i).isJoker()) { - continue; - } - if (stones.get(i).getColor() != runColor) { - // warum macht er das nicht? - return false; - } - if (stones.get(i).getValue() != i + startValue) { - return false; - } - } - return true; + return isValidRun(nonJoker1); } // is group else { - if (stones.size() > 4) { + return isValidGroup(); + } + } + + /** + * Test for rule conflict within the StoneSet, assuming we have a run + * + * @param referencePosition + * position of stone used as reference (any non-joker stone) + */ + private boolean isValidRun(int referencePosition) { + StoneColor runColor = stones.get(referencePosition).getColor(); + int startValue = stones.get(referencePosition).getValue() + - referencePosition; + int endValue = startValue + stones.size() - 1; + if (startValue < 1 || endValue > 13) { + return false; + } + for (int i = 0; i < stones.size(); i++) { + if (stones.get(i).isJoker()) { + continue; + } + if (stones.get(i).getColor() != runColor) { + // warum macht er das nicht? return false; } - Set<StoneColor> seenColors = new HashSet<StoneColor>(); - for (Stone i : stones) { - if (i.isJoker()) { - continue; - } - if (seenColors.contains(i.getColor())) { - return false; - } else { - seenColors.add(i.getColor()); - } + if (stones.get(i).getValue() != i + startValue) { + return false; + } + } + return true; + } + /** + * Test for rule conflict within the StoneSet, assuming we have a group + */ + private boolean isValidGroup() { + if (stones.size() > 4) { + return false; + } + Set<StoneColor> seenColors = new HashSet<StoneColor>(); + for (Stone i : stones) { + if (i.isJoker()) { + continue; + } + if (seenColors.contains(i.getColor())) { + return false; + } else { + seenColors.add(i.getColor()); } - return true; } + return true; } /** diff --git a/src/jrummikub/model/StoneTray.java b/src/jrummikub/model/StoneTray.java index ff32153..0d48bf5 100644 --- a/src/jrummikub/model/StoneTray.java +++ b/src/jrummikub/model/StoneTray.java @@ -69,19 +69,8 @@ public class StoneTray<E extends Sizeable> implements for (Pair<E, Position> i : objects) { Position currentPosition = i.getSecond(); E currentObject = i.getFirst(); - // Tests if position is left of, above ... the current object - if (position.getX() + object.getWidth() <= currentPosition.getX()) { - continue; - } - if (position.getY() + object.getHeight() <= currentPosition.getY()) { - continue; - } - if (position.getX() >= currentPosition.getX() - + currentObject.getWidth()) { - continue; - } - if (position.getY() >= currentPosition.getY() - + currentObject.getHeight()) { + if (!objectsOverlap(object, position, + currentObject, currentPosition)) { continue; } // Object would be placed inside the current object @@ -114,6 +103,27 @@ public class StoneTray<E extends Sizeable> implements objects.add(new Pair<E, Position>(object, position)); } + /** Tests whether two objects overlap **/ + private boolean objectsOverlap(E object1, Position position1, E object2, + Position position2) { + // Tests if position is left of, above ... the current object + if (position1.getX() + object1.getWidth() <= position2.getX()) { + return false; + } + if (position1.getY() + object1.getHeight() <= position2.getY()) { + return false; + } + if (position1.getX() >= position2.getX() + + object2.getWidth()) { + return false; + } + if (position1.getY() >= position2.getY() + + object2.getHeight()) { + return false; + } + return true; + } + private Direction getMoveDirection(E object, Position position, Pair<E, Position> blocking) { boolean isVertical = getMoveOrientationn(object, position, blocking); diff --git a/src/jrummikub/model/Table.java b/src/jrummikub/model/Table.java index 8a1b40f..591b04e 100644 --- a/src/jrummikub/model/Table.java +++ b/src/jrummikub/model/Table.java @@ -14,7 +14,8 @@ public class Table extends StoneTray<StoneSet> { * {@link Position} of the selected {@link Stone} */ public Stone pickUpStone(Position position) { - + // TODO implement this method + return null; } /** @@ -26,11 +27,13 @@ public class Table extends StoneTray<StoneSet> { * End {@link Position} of the range */ public StoneSet pickUpRange(Position from, Position to) { - + // TODO implement this method + return null; } /** Tests the Table for rule conflicts by checking all the {@link StoneSets} */ public boolean isValid() { - + // TODO implement this method + return false; } } |