Implement hand auto-sort
git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@205 72836036-5685-4462-b002-a69064685172
This commit is contained in:
parent
8a3439f736
commit
56b75e037a
3 changed files with 183 additions and 73 deletions
|
@ -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 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Reference in a new issue