summaryrefslogtreecommitdiffstats
path: root/src/jrummikub/control
diff options
context:
space:
mode:
Diffstat (limited to 'src/jrummikub/control')
-rw-r--r--src/jrummikub/control/GameControl.java6
-rw-r--r--src/jrummikub/control/RoundControl.java116
2 files changed, 88 insertions, 34 deletions
diff --git a/src/jrummikub/control/GameControl.java b/src/jrummikub/control/GameControl.java
index b5d763a..efc0c57 100644
--- a/src/jrummikub/control/GameControl.java
+++ b/src/jrummikub/control/GameControl.java
@@ -1,6 +1,6 @@
package jrummikub.control;
-import jrummikub.model.GameSettings;
+import jrummikub.model.IGameSettings;
import jrummikub.model.RoundState;
import jrummikub.util.IListener;
import jrummikub.view.IView;
@@ -9,7 +9,7 @@ import jrummikub.view.IView;
* Controls a Game, at some point including all Rounds, starts new Rounds
*/
public class GameControl {
- private GameSettings gameSettings;
+ private IGameSettings gameSettings;
private IView view;
private RoundControl roundControl;
@@ -21,7 +21,7 @@ public class GameControl {
* @param view
* the view
*/
- public GameControl(GameSettings gameSettings, IView view) {
+ public GameControl(IGameSettings gameSettings, IView view) {
this.gameSettings = gameSettings;
this.view = view;
diff --git a/src/jrummikub/control/RoundControl.java b/src/jrummikub/control/RoundControl.java
index 9b746d1..a69b890 100644
--- a/src/jrummikub/control/RoundControl.java
+++ b/src/jrummikub/control/RoundControl.java
@@ -23,7 +23,7 @@ import jrummikub.view.IView;
* Controller that manages a single round of rummikub
*/
public class RoundControl {
- private IRoundState gameState;
+ private IRoundState roundState;
private IView view;
private ITable clonedTable;
private Event endRoundEvent = new Event();
@@ -37,8 +37,8 @@ public class RoundControl {
* @param view
* view used for user interaction
*/
- public RoundControl(IRoundState gameState, IView view) {
- this.gameState = gameState;
+ public RoundControl(IRoundState roundState, IView view) {
+ this.roundState = roundState;
this.view = view;
}
@@ -69,20 +69,21 @@ public class RoundControl {
}
private void prepareTurn() {
- clonedTable = (ITable) gameState.getTable().clone();
+ clonedTable = (ITable) roundState.getTable().clone();
view.enableStartTurnPanel(true);
view.getTablePanel().setStoneSets(clonedTable);
- view.setCurrentPlayerName(gameState.getActivePlayer().getPlayerSettings().getName());
+ view.setCurrentPlayerName(roundState.getActivePlayer()
+ .getPlayerSettings().getName());
view.getTablePanel().setLeftPlayerName(
- gameState.getNthNextPlayer(1).getPlayerSettings().getName());
+ roundState.getNthNextPlayer(1).getPlayerSettings().getName());
view.getTablePanel().setTopPlayerName(
- gameState.getNthNextPlayer(2).getPlayerSettings().getName());
+ roundState.getNthNextPlayer(2).getPlayerSettings().getName());
view.getTablePanel().setRightPlayerName(
- gameState.getNthNextPlayer(3).getPlayerSettings().getName());
+ roundState.getNthNextPlayer(3).getPlayerSettings().getName());
}
private void startTurn() {
- TurnControl turnControl = new TurnControl(gameState.getActivePlayer()
+ TurnControl turnControl = new TurnControl(roundState.getActivePlayer()
.getHand(), clonedTable, view);
connections.add(turnControl.getEndOfTurnEvent().add(new IListener() {
@@ -96,42 +97,95 @@ public class RoundControl {
}
void deal() {
- for (int i = 0; i < gameState.getPlayerCount(); i++) {
- IHand hand = gameState.getNthNextPlayer(i).getHand();
+ for (int i = 0; i < roundState.getPlayerCount(); i++) {
+ IHand hand = roundState.getNthNextPlayer(i).getHand();
for (int j = 0; j < 7; j++) {
- hand.drop(gameState.getGameHeap().drawStone(), new Position(j,
+ hand.drop(roundState.getGameHeap().drawStone(), new Position(j,
0));
- hand.drop(gameState.getGameHeap().drawStone(), new Position(j,
+ hand.drop(roundState.getGameHeap().drawStone(), new Position(j,
1));
}
}
}
- private void endOfTurn() {
- Set<Stone> tableDiff = tableDifference(gameState.getTable(),
- clonedTable);
+ /**
+ * after a legal move
+ *
+ * @return win or no win
+ */
+ private boolean postLegalMove() {
+ roundState.setTable(clonedTable);
- if (!tableDiff.isEmpty()) { // Player has made a move
- if (clonedTable.isValid()) {
- gameState.setTable(clonedTable);
+ if (roundState.getActivePlayer().getHand().getSize() == 0) {
+ win();
+ return true;
+ }
+ return false;
+ }
- if (gameState.getActivePlayer().getHand().getSize() == 0) {
- win();
- return;
- }
+ private boolean notLaidOutYet(Set<Stone> tableDiff) {
+ boolean win = false;
+ if (tableSetDifference(clonedTable, roundState.getTable()).isEmpty()) {
+ // laid sthg out and didn't change table
+ List<StoneSet> newSets = tableSetDifference(roundState.getTable(),
+ clonedTable);
+
+ int totalValue = 0;
+ for (StoneSet set : newSets) {
+ totalValue += set.classify().getSecond();
+ }
+
+ if (totalValue >= roundState.getGameSettings()
+ .getInitialMeldThreshold()) {
+
+ roundState.getActivePlayer().setLaidOut(true);
+ win = postLegalMove();
+ return win;
} else {
- gameState.getGameHeap().putBack(tableDiff);
+ // deal penalty, reset
+ roundState.getGameHeap().putBack(tableDiff);
dealPenalty(tableDiff.size());
+ return win;
}
- } else { // Player hasn't made a move
+ } else {
+ // deal penalty, reset
+ roundState.getGameHeap().putBack(tableDiff);
+ dealPenalty(tableDiff.size());
+ return win;
+ }
+ }
+
+ private void endOfTurn() {
+ Set<Stone> tableDiff = tableDifference(roundState.getTable(),
+ clonedTable);
+
+ if (tableDiff.isEmpty()) {
+ // Player hasn't made a move
if (clonedTable.isValid()) {
- gameState.setTable(clonedTable);
+ roundState.setTable(clonedTable);
}
-
dealStone();
+ } else {
+ // Player has made a move
+ if (!clonedTable.isValid()) {
+ // deal penalty, reset
+ roundState.getGameHeap().putBack(tableDiff);
+ dealPenalty(tableDiff.size());
+ } else {
+ if (roundState.getActivePlayer().getLaidOut()) {
+ // Player has laid out
+ if (postLegalMove()) {
+ return;
+ }
+ } else {
+ // Player hasn't laid out
+ if (notLaidOutYet(tableDiff)) {
+ return;
+ }
+ }
+ }
}
-
- gameState.nextPlayer();
+ roundState.nextPlayer();
prepareTurn();
}
@@ -164,7 +218,7 @@ public class RoundControl {
}
void dealStones(int count) {
- IHand hand = gameState.getActivePlayer().getHand();
+ IHand hand = roundState.getActivePlayer().getHand();
int rowCount = hand.getRowCount();
for (int i = 0; i < count; ++i) {
@@ -172,7 +226,7 @@ public class RoundControl {
rowCount++;
}
- hand.drop(gameState.getGameHeap().drawStone(), new Position(
+ hand.drop(roundState.getGameHeap().drawStone(), new Position(
Hand.WIDTH - 1, rowCount - 1));
}
}