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:
parent
b20961b89d
commit
d9a0b0e37d
7 changed files with 82 additions and 10 deletions
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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() {
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
|
||||||
}
|
}
|
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
Reference in a new issue