package jrummikub.control; import java.util.HashSet; import java.util.Set; import jrummikub.model.IGameState; import jrummikub.model.IHand; import jrummikub.model.ITable; import jrummikub.model.Position; import jrummikub.model.Stone; import jrummikub.model.StoneSet; import jrummikub.util.IListener; import jrummikub.util.Pair; import jrummikub.view.IView; public class RoundControl { // TODO move to game control once existent final static int HAND_HEIGHT = 2; final static int HAND_WIDTH = 14; private IGameState gameState; private IView view; private ITable clonedTable; public RoundControl(IGameState gameState, IView view) { this.gameState = gameState; this.view = view; view.getPlayerPanel().getHandPanel().setHandHeight(HAND_HEIGHT); view.getPlayerPanel().getHandPanel().setHandWidth(HAND_WIDTH); } public void startRound() { deal(); view.getStartTurnEvent().add(new IListener() { @Override public void handle() { startTurn(); } }); prepareTurn(); } private void prepareTurn() { clonedTable = (ITable) gameState.getTable().clone(); view.enableStartTurnPanel(true); view.getTablePanel().setStoneSets(clonedTable); view.setCurrentPlayerName(gameState.getActivePlayer().getName()); view.getTablePanel().setRightPlayerName( gameState.getNthNextPlayer(1).getName()); view.getTablePanel().setTopPlayerName( gameState.getNthNextPlayer(2).getName()); view.getTablePanel().setLeftPlayerName( gameState.getNthNextPlayer(3).getName()); } private void startTurn() { TurnControl turnControl = new TurnControl(gameState.getActivePlayer() .getHand(), clonedTable, view); turnControl.getEndOfTurnEvent().add(new IListener() { @Override public void handle() { endOfTurn(); } }); turnControl.startTurn(); } void deal() { for (int i = 0; i < gameState.getPlayerCount(); i++) { IHand hand = gameState.getNthNextPlayer(i).getHand(); for (int j = 0; j < 7; j++) { hand.drop(gameState.getGameHeap().drawStone(), new Position(j, 0)); hand.drop(gameState.getGameHeap().drawStone(), new Position(j, 1)); } } } private void endOfTurn() { Set tableDiff = tableDifference(gameState.getTable(), clonedTable); if (!tableDiff.isEmpty()) { // Player has made a move if (clonedTable.isValid()) { gameState.setTable(clonedTable); if (gameState.getActivePlayer().getHand().getSize() == 0) { win(); return; } } else { gameState.getGameHeap().putBack(tableDiff); dealPenalty(tableDiff.size()); } } else { // Player hasn't made a move if (clonedTable.isValid()) { gameState.setTable(clonedTable); } dealStone(); } gameState.nextPlayer(); prepareTurn(); } static Set tableDifference(ITable oldTable, ITable newTable) { Set ret = new HashSet(); for (Pair entry : newTable) { for (Stone stone : entry.getFirst()) { ret.add(stone); } } for (Pair entry : oldTable) { for (Stone stone : entry.getFirst()) { ret.remove(stone); } } return ret; } void dealStone() { gameState .getActivePlayer() .getHand() .drop(gameState.getGameHeap().drawStone(), new Position(7 + (int) (Math.random() * 6), 0.5f)); } private void dealPenalty(int count) { for (int i = 0; i < count + 3; ++i) dealStone(); } private void win() { view.enableWinPanel(true); } }