Implemented special case round end (heap empty)

git-svn-id: svn://sunsvr01.isp.uni-luebeck.de/swproj13/trunk@262 72836036-5685-4462-b002-a69064685172
This commit is contained in:
Jannis Harder 2011-05-24 01:51:53 +02:00
parent b20961b89d
commit d9a0b0e37d
7 changed files with 82 additions and 10 deletions

View file

@ -20,6 +20,8 @@ public class MockRoundState implements IRoundState {
public StoneHeap gameHeap; public StoneHeap gameHeap;
/** */ /** */
public GameSettings gameSettings; public GameSettings gameSettings;
/** */
public IPlayer lastPlayer;
/** */ /** */
public MockRoundState() { public MockRoundState() {
@ -63,7 +65,11 @@ public class MockRoundState implements IRoundState {
@Override @Override
public IPlayer getNthNextPlayer(int i) { public IPlayer getNthNextPlayer(int i) {
return players.get((activePlayer + i) % players.size()); int j = (activePlayer + i) % players.size();
if (j < 0) {
j += players.size();
}
return players.get(j);
} }
@Override @Override
@ -75,4 +81,14 @@ public class MockRoundState implements IRoundState {
public GameSettings getGameSettings() { public GameSettings getGameSettings() {
return gameSettings; return gameSettings;
} }
@Override
public IPlayer getLastPlayer() {
return lastPlayer;
}
@Override
public void setLastPlayer(IPlayer lastPlayer) {
this.lastPlayer = lastPlayer;
}
} }

View file

@ -1,6 +1,7 @@
package jrummikub.control; package jrummikub.control;
import jrummikub.model.GameSettings; import jrummikub.model.GameSettings;
import jrummikub.model.IRoundState;
import jrummikub.model.RoundState; import jrummikub.model.RoundState;
import jrummikub.util.IListener; import jrummikub.util.IListener;
import jrummikub.view.IView; import jrummikub.view.IView;
@ -51,7 +52,7 @@ public class GameControl {
return; return;
} }
RoundState roundState = new RoundState(gameSettings); IRoundState roundState = new RoundState(gameSettings);
roundControl = new RoundControl(roundState, view); roundControl = new RoundControl(roundState, view);
roundControl.getEndRoundEvent().add(new IListener() { roundControl.getEndRoundEvent().add(new IListener() {

View file

@ -28,6 +28,7 @@ public class RoundControl {
private ITable clonedTable; private ITable clonedTable;
private Event endRoundEvent = new Event(); private Event endRoundEvent = new Event();
private List<Connection> connections = new ArrayList<Connection>(); private List<Connection> connections = new ArrayList<Connection>();
private boolean roundFinished;
/** /**
* Create a new RoundControl using the given gameState and view * Create a new RoundControl using the given gameState and view
@ -123,8 +124,24 @@ public class RoundControl {
private void endOfTurn() { private void endOfTurn() {
checkTurn(); checkTurn();
roundState.nextPlayer();
prepareTurn(); if (roundState.getLastPlayer() == null) {
if (roundState.getGameHeap().getSize() == 0) {
roundState.setLastPlayer(roundState.getNthNextPlayer(-1));
} else {
roundState.nextPlayer();
}
} else {
if (roundState.getActivePlayer() == roundState.getLastPlayer()) {
// TODO check who has won
win();
} else {
roundState.nextPlayer();
}
}
if (!roundFinished) {
prepareTurn();
}
} }
private void checkTurn() { private void checkTurn() {
@ -224,5 +241,6 @@ public class RoundControl {
} }
endRoundEvent.emit(); endRoundEvent.emit();
view.enableWinPanel(true); view.enableWinPanel(true);
roundFinished = true;
} }
} }

View file

@ -23,7 +23,7 @@ public interface IRoundState {
* Sets the current {@link Table} * Sets the current {@link Table}
* *
* @param table * @param table
* The new Table * The new Table
*/ */
public void setTable(ITable table); public void setTable(ITable table);
@ -55,9 +55,26 @@ public interface IRoundState {
* Returns the player that would be the active player after i turns * Returns the player that would be the active player after i turns
* *
* @param i * @param i
* number of turns * number of turns
* @return player active after i turns * @return player active after i turns
*/ */
public IPlayer getNthNextPlayer(int i); public IPlayer getNthNextPlayer(int i);
/**
* Sets the player that will make the last turn before the round ends when
* the heap is empty
*
* @param lastPlayer
* the last player
*/
public abstract IPlayer getLastPlayer();
/**
* Gets the player that will make the last turn before the round ends when
* the heap is empty
*
* @return lastPlayer the last player
*/
public abstract void setLastPlayer(IPlayer lastPlayer);
} }

View file

@ -11,12 +11,13 @@ public class RoundState implements IRoundState {
private List<Player> players; private List<Player> players;
private int activePlayer; private int activePlayer;
private StoneHeap gameHeap; private StoneHeap gameHeap;
private IPlayer lastPlayer;
/** /**
* Create a new RoundState with an empty table * Create a new RoundState with an empty table
* *
* @param gameSettings * @param gameSettings
* the game settings * the game settings
*/ */
public RoundState(GameSettings gameSettings) { public RoundState(GameSettings gameSettings) {
this.gameSettings = gameSettings; this.gameSettings = gameSettings;
@ -54,7 +55,11 @@ public class RoundState implements IRoundState {
@Override @Override
public IPlayer getNthNextPlayer(int i) { public IPlayer getNthNextPlayer(int i) {
return players.get((activePlayer + i) % players.size()); int j = (activePlayer + i) % players.size();
if (j < 0) {
j += players.size();
}
return players.get(j);
} }
@Override @Override
@ -71,4 +76,14 @@ public class RoundState implements IRoundState {
public GameSettings getGameSettings() { public GameSettings getGameSettings() {
return gameSettings; return gameSettings;
} }
@Override
public void setLastPlayer(IPlayer lastPlayer) {
this.lastPlayer = lastPlayer;
}
@Override
public IPlayer getLastPlayer() {
return lastPlayer;
}
} }

View file

@ -36,6 +36,9 @@ public class StoneHeap {
* @return the drawn stone * @return the drawn stone
*/ */
public Stone drawStone() { public Stone drawStone() {
if (heap.isEmpty()) {
return null;
}
return heap.remove(generator.nextInt(heap.size())); return heap.remove(generator.nextInt(heap.size()));
} }
@ -48,6 +51,7 @@ public class StoneHeap {
*/ */
public List<Stone> drawStones(int number) { public List<Stone> drawStones(int number) {
List<Stone> drawnStones = new ArrayList<Stone>(); List<Stone> drawnStones = new ArrayList<Stone>();
number = Math.min(number, heap.size());
for (int i = 0; i < number; i++) { for (int i = 0; i < number; i++) {
drawnStones.add(drawStone()); drawnStones.add(drawStone());
} }

View file

@ -22,6 +22,7 @@ import jrummikub.model.GameSettings;
import jrummikub.model.Hand; import jrummikub.model.Hand;
import jrummikub.model.IHand; import jrummikub.model.IHand;
import jrummikub.model.IPlayer; import jrummikub.model.IPlayer;
import jrummikub.model.IRoundState;
import jrummikub.model.ITable; import jrummikub.model.ITable;
import jrummikub.model.MockRoundState; import jrummikub.model.MockRoundState;
import jrummikub.model.MockTable; import jrummikub.model.MockTable;
@ -47,7 +48,7 @@ public class RoundControlTest {
private MockTable testTable; private MockTable testTable;
private GameSettings gameSettings; private GameSettings gameSettings;
private RoundState roundState; private IRoundState roundState;
private RoundControl roundControl; private RoundControl roundControl;
/** /**