Metric fixes

git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@358 72836036-5685-4462-b002-a69064685172
This commit is contained in:
Bennet Gerlach 2011-05-31 20:42:46 +02:00
parent 6319ec8ab6
commit 640a1e0fb6
13 changed files with 153 additions and 99 deletions

View file

@ -1,5 +1,6 @@
package jrummikub.view;
import jrummikub.control.turn.TurnMode;
import jrummikub.util.IEvent;
import jrummikub.util.MockEvent;
@ -16,9 +17,7 @@ public class MockPlayerPanel implements IPlayerPanel {
/** */
public MockEvent sortByRunsEvent = new MockEvent();
/** */
public boolean inspectOnly;
/** */
public boolean mayRedeal;
public TurnMode turnMode;
@Override
public void setTimeLeft(int time) {
@ -46,9 +45,9 @@ public class MockPlayerPanel implements IPlayerPanel {
return redealEvent;
}
public void setEndTurnMode(boolean inspectOnly, boolean mayRedeal) {
this.inspectOnly = inspectOnly;
this.mayRedeal = mayRedeal;
@Override
public void setEndTurnMode(TurnMode turnMode) {
this.turnMode = turnMode;
}
}

View file

@ -9,6 +9,7 @@ import java.util.Set;
import jrummikub.control.turn.ITurnControl;
import jrummikub.control.turn.TurnControlFactory;
import jrummikub.control.turn.TurnMode;
import jrummikub.model.Hand;
import jrummikub.model.IHand;
import jrummikub.model.IPlayer;
@ -103,19 +104,24 @@ public class RoundControl {
return;
boolean isHuman = roundState.getActivePlayer().getPlayerSettings()
.getTurnControlType() == HUMAN;
boolean inspectOnly = roundState.getTurnNumber() < 1;
boolean mayRedeal = inspectOnly
&& roundState.getActivePlayer().getHand().getIdenticalStoneCount() >= 3;
TurnMode turnMode = TurnMode.NORMAL_TURN;
if (roundState.getTurnNumber() < 1) {
turnMode = TurnMode.INSPECT_ONLY;
if (roundState.getActivePlayer().getHand().getIdenticalStoneCount() >= 3) {
turnMode = TurnMode.MAY_REDEAL;
}
}
if (isHuman) {
view.getPlayerPanel().setEndTurnMode(inspectOnly, mayRedeal);
view.getPlayerPanel().setEndTurnMode(turnMode);
}
turnControl = TurnControlFactory.getFactory(
roundState.getActivePlayer().getPlayerSettings().getTurnControlType())
.create();
turnControl
.setup(roundState.getGameSettings(), roundState.getActivePlayer(),
clonedTable, view, inspectOnly, mayRedeal);
turnControl.setup(roundState.getGameSettings(),
roundState.getActivePlayer(), clonedTable, view, turnMode);
turnControl.getEndOfTurnEvent().add(new IListener() {
@Override
public void handle() {

View file

@ -20,8 +20,7 @@ public abstract class AbstractTurnControl implements ITurnControl {
protected IHand hand;
protected ITable table;
protected IView view;
protected boolean inspectOnly;
protected boolean mayRedeal;
protected TurnMode turnMode;
@Override
public IEvent getEndOfTurnEvent() {
@ -35,14 +34,13 @@ public abstract class AbstractTurnControl implements ITurnControl {
@Override
public void setup(GameSettings settings, IPlayer player, ITable table,
IView view, boolean inspectOnly, boolean mayRedeal) {
IView view, TurnMode turnMode) {
this.settings = settings;
this.player = player;
this.hand = player.getHand();
this.table = table;
this.view = view;
this.inspectOnly = inspectOnly;
this.mayRedeal = mayRedeal;
this.turnMode = turnMode;
}
}

View file

@ -63,14 +63,16 @@ public class BaseAIControl extends AbstractTurnControl {
}
private void compute() {
if (inspectOnly) {
if (mayRedeal) {
switch (turnMode) {
case MAY_REDEAL:
emitRedeal();
} else {
break;
case INSPECT_ONLY:
emitEndOfTurn();
}
} else {
break;
case NORMAL_TURN:
turn();
break;
}
}
@ -124,7 +126,8 @@ public class BaseAIControl extends AbstractTurnControl {
for (Stone stone : set) {
handStones.add(pickUpMatchingStone(stone));
}
table.drop(new StoneSet(handStones), new Position((float)Math.random() * 30 - 15, (float)Math.random() * 6 - 3));
table.drop(new StoneSet(handStones), new Position(
(float) Math.random() * 30 - 15, (float) Math.random() * 6 - 3));
}
emitEndOfTurn();
@ -144,8 +147,8 @@ public class BaseAIControl extends AbstractTurnControl {
private void emitEndOfTurn() {
long timeElapsed = System.currentTimeMillis() - startTime;
long timeNeeded = Math.min(
(long) (1000 + Math.random() * hand.getSize() * 100), 50000);
long timeNeeded = Math.min((long) (1000 + Math.random() * hand.getSize()
* 100), 50000);
long waitTime = timeNeeded - timeElapsed;
if (waitTime > 0) {

View file

@ -60,31 +60,22 @@ public class HumanTurnControl extends AbstractTurnControl {
if (this.timer == null) {
this.timer = new TurnTimer(view);
}
IListener endOfTurnListener = new IListener() {
connections.add(timer.getTimeRunOutEvent().add(new IListener() {
@Override
public void handle() {
endOfTurn(false);
}
};
connections.add(timer.getTimeRunOutEvent().add(endOfTurnListener));
connections.add(view.getPlayerPanel().getEndTurnEvent()
.add(endOfTurnListener));
connections.add(view.getPlayerPanel().getRedealEvent()
.add(new IListener() {
@Override
public void handle() {
endOfTurn(true);
}
}));
addButtonHandlers();
addHandPanelHandlers();
addStoneCollectionHandlers();
if (!inspectOnly)
addTablePanelHandlers();
addListeners();
if (turnMode == TurnMode.NORMAL_TURN) {
addTablePanelHandlers();
}
view.getHandPanel().setStones(hand.clone());
view.getHandPanel().resetCurrentRow();
@ -93,7 +84,7 @@ public class HumanTurnControl extends AbstractTurnControl {
timer.startTimer();
}
private void addListeners() {
private void addButtonHandlers() {
connections.add(view.getPlayerPanel().getSortByGroupsEvent()
.add(new IListener() {
@Override
@ -109,6 +100,22 @@ public class HumanTurnControl extends AbstractTurnControl {
sortByRuns();
}
}));
connections.add(view.getPlayerPanel().getEndTurnEvent()
.add(new IListener() {
@Override
public void handle() {
endOfTurn(false);
}
}));
connections.add(view.getPlayerPanel().getRedealEvent().add(new IListener() {
@Override
public void handle() {
endOfTurn(true);
}
}));
}
private void addHandPanelHandlers() {
@ -425,12 +432,15 @@ public class HumanTurnControl extends AbstractTurnControl {
table.drop(joinedSet, newPos);
} else {
StoneSet joinedSet = new StoneSet(selectedStones).join(newSet);
table.drop(joinedSet, new Position(newPos.getX()
- selectedStones.size(), newPos.getY()));
table.drop(joinedSet,
new Position(newPos.getX() - selectedStones.size(), newPos.getY()));
}
} else {
table.drop(new StoneSet(selectedStones), new Position(pos.getX()
+ (set.size() - selectedStones.size()) * 0.5f, pos.getY()));
table.drop(
new StoneSet(selectedStones),
new Position(
pos.getX() + (set.size() - selectedStones.size()) * 0.5f, pos
.getY()));
}
selectedStones.clear();
@ -525,8 +535,7 @@ public class HumanTurnControl extends AbstractTurnControl {
static class HandStonePositionComparator implements
Comparator<Pair<Stone, Position>> {
@Override
public int compare(Pair<Stone, Position> pair1,
Pair<Stone, Position> pair2) {
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;

View file

@ -11,7 +11,6 @@ import jrummikub.view.IView;
* Interface containing shared methods of human and computer turn control
*
*/
// TODO zu viele parameter
public interface ITurnControl {
/**
* Start the turn
@ -24,13 +23,11 @@ public interface ITurnControl {
* current table
* @param view
* view for user interaction.
* @param inspectOnly
* the current turn doesn't allow any table manipulation
* @param mayRedeal
* true when the current player may decide to redeal
* @param turnMode
* whether it is turn zero and if one may redeal
*/
public void setup(GameSettings settings, IPlayer player, ITable table,
IView view, boolean inspectOnly, boolean mayRedeal);
IView view, TurnMode turnMode);
/**
* Get the event that is emitted when the turn is over

View file

@ -16,7 +16,11 @@ public abstract class TurnControlFactory {
COMPUTER
};
/**
* Creates a new turn control instance
*
* @return the turn control
*/
public abstract ITurnControl create();
/**

View file

@ -0,0 +1,13 @@
package jrummikub.control.turn;
/**
* Different kinds of turns
*/
public enum TurnMode {
/** Turn zero with possibility to redeal */
MAY_REDEAL,
/** Turn zero without possibility to redeal */
INSPECT_ONLY,
/** A normal turn */
NORMAL_TURN
}

View file

@ -1,5 +1,6 @@
package jrummikub.view;
import jrummikub.control.turn.TurnMode;
import jrummikub.util.IEvent;
/**
@ -23,8 +24,8 @@ public interface IPlayerPanel {
public IEvent getSortByGroupsEvent();
/**
* The sort by runs event is emitted when the player wants to sort his
* stones by runs
* The sort by runs event is emitted when the player wants to sort his stones
* by runs
*
* @return the event
*/
@ -47,11 +48,8 @@ public interface IPlayerPanel {
/**
* Sets the buttons available to end the turn
*
* @param inspectOnly
* true for each player's first turn
* @param mayRedeal
* true if the player is allowed to trigger a redealing of all
* stones
* @param turnMode
* the {@link TurnMode}
*/
public abstract void setEndTurnMode(boolean inspectOnly, boolean mayRedeal);
public abstract void setEndTurnMode(TurnMode turnMode);
}

View file

@ -121,9 +121,27 @@ public interface IView {
*/
public IEvent getNewGameEvent();
/**
* Sets the bottom panels type
*
* @param type
* the type of the bottom panel
*/
public void setBottomPanel(BottomPanelType type);
/**
* Different types of bottom panels
*/
public enum BottomPanelType {
START_GAME_PANEL, START_TURN_PANEL, HUMAN_HAND_PANEL, COMPUTER_HAND_PANEL, WIN_PANEL
/** */
START_GAME_PANEL,
/** */
START_TURN_PANEL,
/** */
HUMAN_HAND_PANEL,
/** */
COMPUTER_HAND_PANEL,
/** */
WIN_PANEL
}
}

View file

@ -17,6 +17,7 @@ import javax.swing.JProgressBar;
import javax.swing.UIManager;
import javax.swing.border.EmptyBorder;
import jrummikub.control.turn.TurnMode;
import jrummikub.model.Position;
import jrummikub.model.Stone;
import jrummikub.util.Event;
@ -268,8 +269,6 @@ class PlayerPanel extends JPanel implements IPlayerPanel {
addComponentListener(rescaleListener);
hand.addComponentListener(rescaleListener);
setEndTurnMode(true, true);
}
private class LeftPanelResizeListener extends ComponentAdapter {
@ -363,16 +362,27 @@ class PlayerPanel extends JPanel implements IPlayerPanel {
}
@Override
public void setEndTurnMode(boolean inspectOnly, boolean mayRedeal) {
if (!inspectOnly) {
endTurnButton.setText("Zug beenden");
} else if (!mayRedeal) {
public void setEndTurnMode(TurnMode turnMode) {
switch (turnMode) {
case MAY_REDEAL:
endTurnButton.setVisible(false);
keepStonesButton.setVisible(true);
redealButton.setVisible(true);
break;
case INSPECT_ONLY:
endTurnButton.setText("N\u00e4chster Spieler");
endTurnButton.setVisible(true);
keepStonesButton.setVisible(false);
redealButton.setVisible(false);
break;
case NORMAL_TURN:
endTurnButton.setText("Zug beenden");
endTurnButton.setVisible(true);
keepStonesButton.setVisible(false);
redealButton.setVisible(false);
break;
}
boolean smallButtons = mayRedeal && inspectOnly;
endTurnButton.setVisible(!smallButtons);
keepStonesButton.setVisible(smallButtons);
redealButton.setVisible(smallButtons);
}
void showButtons(boolean show) {
@ -397,7 +407,7 @@ class PlayerPanel extends JPanel implements IPlayerPanel {
sortByGroupsButton.setEnabled(enable);
sortByRunsButton.setEnabled(enable);
if (!enable) {
setEndTurnMode(false, false);
setEndTurnMode(TurnMode.NORMAL_TURN);
endTurnButton.setText("<html><center>Computer denkt nach");
hand.setStones(Collections.<Pair<Stone, Position>> emptyList());
handRowDownButton.setForeground(Color.GRAY);

View file

@ -10,6 +10,7 @@ import java.util.Iterator;
import java.util.List;
import java.util.Set;
import jrummikub.control.turn.TurnMode;
import jrummikub.model.GameSettings;
import jrummikub.model.Hand;
import jrummikub.model.IHand;
@ -934,13 +935,12 @@ public class RoundControlTest {
hand.drop(new Stone(1, BLUE), new Position(0, 0));
testRoundState.players.get(0).hand = hand;
view.startTurnEvent.emit();
assertTrue(view.playerPanel.inspectOnly);
assertFalse(view.playerPanel.mayRedeal);
assertEquals(view.playerPanel.turnMode, TurnMode.INSPECT_ONLY);
for (int i = 0; i < 4; i++) {
view.playerPanel.endTurnEvent.emit();
view.startTurnEvent.emit();
}
assertFalse(view.playerPanel.inspectOnly);
assertEquals(view.playerPanel.turnMode, TurnMode.NORMAL_TURN);
}
/** */
@ -953,12 +953,11 @@ public class RoundControlTest {
}
testRoundState.players.get(0).hand = hand;
view.startTurnEvent.emit();
assertTrue(view.playerPanel.inspectOnly);
assertTrue(view.playerPanel.mayRedeal);
assertEquals(view.playerPanel.turnMode, TurnMode.MAY_REDEAL);
for (int i = 0; i < 4; i++) {
view.playerPanel.endTurnEvent.emit();
view.startTurnEvent.emit();
}
assertFalse(view.playerPanel.inspectOnly);
assertEquals(view.playerPanel.turnMode, TurnMode.NORMAL_TURN);
}
}

View file

@ -111,7 +111,7 @@ public class TurnControlTest {
mockPlayer.hand = mockHand;
testControl = new HumanTurnControl(mockTimer);
testControl.setup(new GameSettings(), mockPlayer, mockTable, mockView,
false, false);
TurnMode.NORMAL_TURN);
}
/** */
@ -136,7 +136,7 @@ public class TurnControlTest {
testControl = new HumanTurnControl(mockTimer);
testControl.setup(new GameSettings(), mockPlayer, mockTable, mockView,
false, false);
TurnMode.NORMAL_TURN);
testControl.startTurn();
int i = 0;
@ -629,8 +629,8 @@ public class TurnControlTest {
public void testAddLeft() {
AccessibleTable table = new AccessibleTable();
HumanTurnControl turnControl = new HumanTurnControl(mockTimer);
turnControl.setup(new GameSettings(), mockPlayer, table, mockView, false,
false);
turnControl.setup(new GameSettings(), mockPlayer, table, mockView,
TurnMode.NORMAL_TURN);
turnControl.startTurn();
Stone blueOne = new Stone(1, BLUE);
Stone redOne = new Stone(1, RED);
@ -747,8 +747,8 @@ public class TurnControlTest {
public void testAddRight() {
AccessibleTable table = new AccessibleTable();
HumanTurnControl turnControl = new HumanTurnControl(mockTimer);
turnControl.setup(new GameSettings(), mockPlayer, table, mockView, false,
false);
turnControl.setup(new GameSettings(), mockPlayer, table, mockView,
TurnMode.NORMAL_TURN);
turnControl.startTurn();
Stone blueOne = new Stone(1, BLUE);
Stone redOne = new Stone(1, RED);
@ -865,8 +865,8 @@ public class TurnControlTest {
public void testAddNewSet() {
AccessibleTable table = new AccessibleTable();
HumanTurnControl turnControl = new HumanTurnControl(mockTimer);
turnControl.setup(new GameSettings(), mockPlayer, table, mockView, false,
false);
turnControl.setup(new GameSettings(), mockPlayer, table, mockView,
TurnMode.NORMAL_TURN);
turnControl.startTurn();
Stone blueOne = new Stone(1, BLUE);
Stone redOne = new Stone(1, RED);