de.torfu.kabayellow.common
Class BufferedGame

java.lang.Object
  |
  +--de.torfu.kabayellow.common.Game
        |
        +--de.torfu.kabayellow.common.BufferedGame
All Implemented Interfaces:
IControllingPlayer, IGameObserver

public class BufferedGame
extends Game
implements IGameObserver, IControllingPlayer

Wrapper um ein Game-Objekt, um Züge auf Netzwerk-Spielen rückgängig machen zu können. Das BufferedGame-Objekt meldet sich als Observer an einem anderen Game an, und synchronisiert sich automatisch mit diesem. Wenn Actions auf dem BufferedGame ausgeführt werden, dann werden sie erst einmal zwischengespeichert, und erst bei einer ActionEndTurn an das darunterliegende Game weitergeschickt. Dadurch kann man Actions erst einmal auf dem BufferedGame ausführen und rückgängig machen, ohne dass das darunterliegende Spiel etwas davon merkt.

Geplante Verwendung: als Wrapper um ein NetworkGame, damit man in Netzwerkspielen Aktionen rückgängig machen kann.

GameFactory.createUndoGame(Game) gibt ein BufferedGame zurück.


Field Summary
 
Fields inherited from class de.torfu.kabayellow.common.Game
CARD_TYPES, INITIAL_ACTION_POINTS, MAX_CARDS, MAX_KNIGHTS
 
Constructor Summary
BufferedGame(Game realGame)
           
 
Method Summary
 void actionPerformed(Action action)
          Wird aufgerufen, wenn ein beliebiger Spieler eine Action ausgeführt hat.
 void gameOver(Player winner)
          Wird aufgerufen, wenn das Spiel vorbei ist.
 void gameStarted()
          Wird einmalig aufgerufen, wenn alle Spieler sich angemeldet haben.
 void gameStatusChanged()
          Wird nach jeder Änderung des Spielstatus aufgerufen, z.B. wenn der nächste Spieler dran ist, oder wenn ein beliebiger Spieler eine Aktion ausgeführt hat.
 void newPlayer(java.lang.String name, int age)
          Wird aufgerufen, wenn sich ein weiterer Spieler anmeldet.
 void nextPhase()
          Wird aufgerufen, nachdem eine Phase zu Ende ist.
 void nextPlayer()
          Wird aufgerufen, nachdem ein Spieler seinen Zug beendet hat.
 void nextRound()
          Wird aufgerufen, nachdem eine Runde zu Ende ist.
 void receiveCard(ActionCard card)
          Wird aufgerufen, nachdem der AbstractPlayer eine ActionBuyCard ausgeführt hat.
 void receiveChatMessage(int playerID, java.lang.String message)
          Wird aufgerufen, wenn ein beliebiger Spieler eine Chat-Nachricht verschickt hat.
 void registerCountdownObserver(CountdownObserver obs)
           
 void sendChatMessage(java.lang.String message)
          Ermöglicht es, eine ChatMessage an das Spiel, also an alle teilnehmenden Spieler zu schicken.
 void setControllingPlayer(IControllingPlayer player, java.lang.String name)
          Setzt den IControllingPlayer, der dieses Spiel "spielt".
 void timeout()
          Wird aufgerufen, wenn der AbstractPlayer innerhalb der vorgeschriebenen Bedenkzeit seinen Zug nicht beendet hat.
 void yourTurnMoveKing()
          Wird aufgerufen, um dem AbstractPlayer mitzuteilen, dass er den König versetzen soll.
 void yourTurnNormal()
          Wird aufgerufen, um dem AbstractPlayer mitzuteilen, dass er mit einem normalen Zug an der Reihe ist.
 void yourTurnSetFirstKnight()
          Wird aufgerufen, um dem AbstractPlayer mitzuteilen, dass er einen Ritter einsetzen soll.
 
Methods inherited from class de.torfu.kabayellow.common.Game
addGameObserver, calculateScores, canUndoPreviousAction, createCopy, getAbstractPlayer, getAbstractPlayerID, getBoard, getCurrentPlayer, getGameIdentifier, getPhase, getPlayer, getPlayer, getPlayerCount, getPlayersName, getPreviousAction, getRemainingCards, getRemainingRounds, getRound, getRoundsOfPhase, getRoundsOfPhase, getStartingPlayer, getStonesForPhase, getStonesForPhase, getTimeout, hasStarted, isGameOver, isTurnMoveKing, isTurnNormal, isTurnSetFirstKnight, isWaitingForPlayers, printInfo, removeGameObserver, setAbstractPlayer, setGameIdentifier, undoPreviousAction, undoTurn
 
Methods inherited from class java.lang.Object
equals, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Constructor Detail

BufferedGame

public BufferedGame(Game realGame)
Method Detail

setControllingPlayer

public void setControllingPlayer(IControllingPlayer player,
                                 java.lang.String name)
Description copied from class: Game
Setzt den IControllingPlayer, der dieses Spiel "spielt". Er wird vom Game aufgerufen, Züge abzugeben.

Overrides:
setControllingPlayer in class Game
Parameters:
player - ein IControllingPlayer

actionPerformed

public void actionPerformed(Action action)
Description copied from interface: IGameObserver
Wird aufgerufen, wenn ein beliebiger Spieler eine Action ausgeführt hat. Das entsprechende Action-Objekt wird als Parameter übergeben. Auch von diesem AbstractPlayer selbst ausgeführte Aktionen werden ihm auf diese Weise noch einmal übermittelt.

Specified by:
actionPerformed in interface IGameObserver

receiveChatMessage

public void receiveChatMessage(int playerID,
                               java.lang.String message)
Description copied from interface: IGameObserver
Wird aufgerufen, wenn ein beliebiger Spieler eine Chat-Nachricht verschickt hat. Auch die eigenen Nachrichten werden einem auf diese Weise noch einmal übermittelt.

Specified by:
receiveChatMessage in interface IGameObserver
Parameters:
playerID - die ID des abschickenden Spielers, 0-3
message - der Text der Nachricht

timeout

public void timeout()
Description copied from interface: IControllingPlayer
Wird aufgerufen, wenn der AbstractPlayer innerhalb der vorgeschriebenen Bedenkzeit seinen Zug nicht beendet hat. Damit ist der nächste Spieler dran. Nach dem Aufruf von timeout() werden keine Action-Objekte mehr akzeptiert.

Specified by:
timeout in interface IControllingPlayer

gameStarted

public void gameStarted()
Description copied from interface: IGameObserver
Wird einmalig aufgerufen, wenn alle Spieler sich angemeldet haben.

Specified by:
gameStarted in interface IGameObserver

newPlayer

public void newPlayer(java.lang.String name,
                      int age)
Description copied from interface: IGameObserver
Wird aufgerufen, wenn sich ein weiterer Spieler anmeldet.

Specified by:
newPlayer in interface IGameObserver

gameStatusChanged

public void gameStatusChanged()
Description copied from interface: IGameObserver
Wird nach jeder Änderung des Spielstatus aufgerufen, z.B. wenn der nächste Spieler dran ist, oder wenn ein beliebiger Spieler eine Aktion ausgeführt hat. Der AbstractPlayer kann diese Methode überschreiben, um z.B. eine GUI-Darstellung des Spielstatus neu zu zeichnen.

Wenn der AbstractPlayer Informationen darüber haben will, was genau sich geändert hat, muss er statt dieser Methode z.B. nextPlayer() oder actionPerformed() überschreiben.

Specified by:
gameStatusChanged in interface IGameObserver

nextRound

public void nextRound()
Description copied from interface: IGameObserver
Wird aufgerufen, nachdem eine Runde zu Ende ist. Dies ist der Fall, immer nachdem

Specified by:
nextRound in interface IGameObserver

nextPlayer

public void nextPlayer()
Description copied from interface: IGameObserver
Wird aufgerufen, nachdem ein Spieler seinen Zug beendet hat. Dabei ist es egal, ob es dieser Spieler, oder ein anderer Spieler war, der seinen Zug beendet hat. Die Methode wird auch aufgerufen, wenn der gleiche Spieler danach noch einmal dran ist, z.B. wenn er eine reguläre Runde beendet hat und danach selbst den König versetzen darf.

Specified by:
nextPlayer in interface IGameObserver

nextPhase

public void nextPhase()
Description copied from interface: IGameObserver
Wird aufgerufen, nachdem eine Phase zu Ende ist. Jede Phase beginnt mit dem Versetzen des Königs, und endet mit dem Aufaddieren der Punkte. Die "nullte" Phase beginnt mit dem Spielanfang und endet, nachdem alle Spieler ihren Startritter gesetzt haben.

Specified by:
nextPhase in interface IGameObserver

yourTurnNormal

public void yourTurnNormal()
Description copied from interface: IControllingPlayer
Wird aufgerufen, um dem AbstractPlayer mitzuteilen, dass er mit einem normalen Zug an der Reihe ist. Nachdem die Methode aufgerufen wurde, kann der AbstractPlayer Action-Objekte erzeugen und diese mit execute() ausführen. Wenn er mit seinem Zug fertig ist, muss er ein ActionEndTurn-Objekt erzeugen und ausführen, um seinen Zug zu beenden.

Specified by:
yourTurnNormal in interface IControllingPlayer

yourTurnMoveKing

public void yourTurnMoveKing()
Description copied from interface: IControllingPlayer
Wird aufgerufen, um dem AbstractPlayer mitzuteilen, dass er den König versetzen soll. Nachdem die Methode aufgerufen wurde, muss er ein ActionMoveKing-Objekt erzeugen und dieses mit execute() ausführen. Damit ist sein Zug beendet.

Specified by:
yourTurnMoveKing in interface IControllingPlayer

yourTurnSetFirstKnight

public void yourTurnSetFirstKnight()
Description copied from interface: IControllingPlayer
Wird aufgerufen, um dem AbstractPlayer mitzuteilen, dass er einen Ritter einsetzen soll. Dies geschieht ein mal, vor der ersten Runde. Nachdem die Methode aufgerufen wurde, muss er ein ActionSetFirstKnight-Objekt erzeugen und dieses mit execute() ausführen. Damit ist sein Zug beendet.

Specified by:
yourTurnSetFirstKnight in interface IControllingPlayer

gameOver

public void gameOver(Player winner)
Description copied from interface: IGameObserver
Wird aufgerufen, wenn das Spiel vorbei ist.

Specified by:
gameOver in interface IGameObserver
Parameters:
winner - Der Player, welcher das Spiel gewonnen hat.

receiveCard

public void receiveCard(ActionCard card)
Description copied from interface: IControllingPlayer
Wird aufgerufen, nachdem der AbstractPlayer eine ActionBuyCard ausgeführt hat. Übergeben wird die Nummer der Karte, die er vom Stapel gezogen hat. Dies ist nur zur Information; die Karte wird auf jeden Fall auch automatisch im Array getGame().getCurrentPlayer().getActionCards() abgelegt.

Specified by:
receiveCard in interface IControllingPlayer
Parameters:
card - die gezogene Karte

sendChatMessage

public void sendChatMessage(java.lang.String message)
Description copied from class: Game
Ermöglicht es, eine ChatMessage an das Spiel, also an alle teilnehmenden Spieler zu schicken. Der Absender selbst bekommt die Nachricht auch zugestellt.

Overrides:
sendChatMessage in class Game
Parameters:
message - die abzuschickende Nachricht

registerCountdownObserver

public void registerCountdownObserver(CountdownObserver obs)
Overrides:
registerCountdownObserver in class Game