summaryrefslogtreecommitdiffstats
path: root/src/jrummikub
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2011-05-10 01:22:56 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2011-05-10 01:22:56 +0200
commit56b75e037ab2061d1f7462d2f71a83ca5a9353b6 (patch)
treefb20a21e290c4c42d6c283ef9c19521d97d303cc /src/jrummikub
parent8a3439f7369e4059cb49f65413028b57f8fc7daa (diff)
downloadJRummikub-56b75e037ab2061d1f7462d2f71a83ca5a9353b6.tar
JRummikub-56b75e037ab2061d1f7462d2f71a83ca5a9353b6.zip
Implement hand auto-sort
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@205 72836036-5685-4462-b002-a69064685172
Diffstat (limited to 'src/jrummikub')
-rw-r--r--src/jrummikub/control/TurnControl.java146
-rw-r--r--src/jrummikub/view/impl/PlayerPanel.java4
2 files changed, 125 insertions, 25 deletions
diff --git a/src/jrummikub/control/TurnControl.java b/src/jrummikub/control/TurnControl.java
index 0f8f776..686d923 100644
--- a/src/jrummikub/control/TurnControl.java
+++ b/src/jrummikub/control/TurnControl.java
@@ -10,6 +10,7 @@ import jrummikub.model.IHand;
import jrummikub.model.ITable;
import jrummikub.model.Position;
import jrummikub.model.Stone;
+import jrummikub.model.StoneColor;
import jrummikub.model.StoneSet;
import jrummikub.util.Connection;
import jrummikub.util.Event;
@@ -21,27 +22,6 @@ import jrummikub.util.Pair;
import jrummikub.view.IView;
public class TurnControl {
- static class HandStonePositionComparator implements
- Comparator<Pair<Stone, Position>> {
- @Override
- public int compare(Pair<Stone, Position> pair1, Pair<Stone, Position> pair2) {
- Position pos1 = pair1.getSecond(), pos2 = pair2.getSecond();
- if (pos1.getY() < pos2.getY()) {
- return -1;
- } else if (pos1.getY() > pos2.getY()) {
- return 1;
- } else {
- if (pos1.getX() < pos2.getX()) {
- return -1;
- } else if (pos1.getX() > pos2.getX()) {
- return 1;
- } else {
- return 0;
- }
- }
- }
- }
-
private IHand hand;
private ITable table;
private ITurnTimer timer;
@@ -181,12 +161,41 @@ public class TurnControl {
timer.startTimer();
}
- private void sortByRuns() {
+ private void sortStones(Comparator<Stone> comparator) {
+ List<Stone> stones = new ArrayList<Stone>();
+ for (Pair<Stone, Position> entry : hand) {
+ stones.add(entry.getFirst());
+ }
+ for (Stone stone : stones) {
+ hand.pickUp(stone);
+ }
+
+ Collections.sort(stones, comparator);
+
+ int x = 0, y = 0;
+ for (Stone stone : stones) {
+ hand.drop(stone, new Position(x, y));
+ x++;
+ if (x >= RoundControl.HAND_WIDTH) {
+ x = 0;
+ y++;
+
+ if (y >= RoundControl.HAND_HEIGHT) {
+ throw new ArrayIndexOutOfBoundsException(); // TODO We can't handle
+ // this yet...
+ }
+ }
+ }
+ view.getPlayerPanel().getHandPanel().setStones(hand);
}
- private void sortByGroups() {
+ private void sortByRuns() {
+ sortStones(new RunComparator());
+ }
+ private void sortByGroups() {
+ sortStones(new GroupComparator());
}
private void stoneClick(Stone stone, boolean collect) {
@@ -377,4 +386,95 @@ public class TurnControl {
public IEvent getEndOfTurnEvent() {
return endOfTurnEvent;
}
+
+ static private int compareJokers(Stone s1, Stone s2) {
+ if (!s1.isJoker() && s2.isJoker()) {
+ return -1;
+ } else if (s1.isJoker() && !s2.isJoker()) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+
+ static private int compareColors(Stone s1, Stone s2) {
+ if (s1.getColor() == s2.getColor())
+ return 0;
+
+ for (StoneColor color : StoneColor.values()) {
+ if (s1.getColor() == color) {
+ return -1;
+ } else if (s2.getColor() == color) {
+ return 1;
+ }
+ }
+
+ return 0;
+ }
+
+ static private int compareValues(Stone s1, Stone s2) {
+ if (s1.getValue() < s2.getValue()) {
+ return -1;
+ } else if (s1.getValue() > s2.getValue()) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+
+ private static class RunComparator implements Comparator<Stone> {
+ @Override
+ public int compare(Stone s1, Stone s2) {
+ int jokerCompare = compareJokers(s1, s2);
+ if (jokerCompare != 0) {
+ return jokerCompare;
+ }
+
+ int colorCompare = compareColors(s1, s2);
+ if (colorCompare != 0) {
+ return colorCompare;
+ }
+
+ return compareValues(s1, s2);
+ }
+ }
+
+ private static class GroupComparator implements Comparator<Stone> {
+ @Override
+ public int compare(Stone s1, Stone s2) {
+ int jokerCompare = compareJokers(s1, s2);
+ if (jokerCompare != 0) {
+ return jokerCompare;
+ }
+
+ int valueCompare = compareValues(s1, s2);
+ if (valueCompare != 0) {
+ return valueCompare;
+ }
+
+ return compareColors(s1, s2);
+ }
+ }
+
+ static class HandStonePositionComparator implements
+ Comparator<Pair<Stone, Position>> {
+ @Override
+ public int compare(Pair<Stone, Position> pair1, Pair<Stone, Position> pair2) {
+ Position pos1 = pair1.getSecond(), pos2 = pair2.getSecond();
+ if (pos1.getY() < pos2.getY()) {
+ return -1;
+ } else if (pos1.getY() > pos2.getY()) {
+ return 1;
+ } else {
+ if (pos1.getX() < pos2.getX()) {
+ return -1;
+ } else if (pos1.getX() > pos2.getX()) {
+ return 1;
+ } else {
+ return 0;
+ }
+ }
+ }
+ }
+
}
diff --git a/src/jrummikub/view/impl/PlayerPanel.java b/src/jrummikub/view/impl/PlayerPanel.java
index 9c12a80..ce8b8ec 100644
--- a/src/jrummikub/view/impl/PlayerPanel.java
+++ b/src/jrummikub/view/impl/PlayerPanel.java
@@ -101,7 +101,7 @@ class PlayerPanel extends JPanel implements IPlayerPanel {
currentPlayerNameLabel.setVerticalTextPosition(JLabel.CENTER);
leftPanel.add(currentPlayerNameLabel);
- sortByGroupsButton = new JButton("<html><center>Nach Gruppen sortieren");
+ sortByGroupsButton = new JButton("<html><center>Nach Sammlungen sortieren");
sortByGroupsButton.setFont(sortByGroupsButton.getFont().deriveFont(0));
sortByGroupsButton.setMargin(new Insets(0, 0, 0, 0));
sortByGroupsButton.addActionListener(new ActionListener() {
@@ -208,7 +208,7 @@ class PlayerPanel extends JPanel implements IPlayerPanel {
int firstLineHeight = (int) ((height - SIDE_PANEL_SEPARATOR) * SIDE_PANEL_FIRST_LINE_HEIGHT);
int buttonWidth = (width - SIDE_PANEL_SEPARATOR) / 2;
int buttonHeight = height - SIDE_PANEL_SEPARATOR - firstLineHeight;
- float fontSize = (float) Math.sqrt(buttonWidth * buttonHeight) / 5;
+ float fontSize = (float) Math.sqrt(buttonWidth * buttonHeight) / 6;
if (fontSize > MAX_BUTTON_FONT_SIZE)
fontSize = MAX_BUTTON_FONT_SIZE;