org.ggp.base.apps.kiosk.KioskGamer Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of alloy-ggp-base Show documentation
Show all versions of alloy-ggp-base Show documentation
A modified version of the GGP-Base library for Alloy.
The newest version!
package org.ggp.base.apps.kiosk;
import java.awt.BorderLayout;
import java.util.List;
import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import javax.swing.JPanel;
import org.ggp.base.player.gamer.exception.GamePreviewException;
import org.ggp.base.player.gamer.statemachine.StateMachineGamer;
import org.ggp.base.server.event.ServerCompletedMatchEvent;
import org.ggp.base.server.event.ServerNewGameStateEvent;
import org.ggp.base.util.game.Game;
import org.ggp.base.util.gdl.grammar.GdlPool;
import org.ggp.base.util.observer.Event;
import org.ggp.base.util.observer.Observer;
import org.ggp.base.util.statemachine.MachineState;
import org.ggp.base.util.statemachine.Move;
import org.ggp.base.util.statemachine.Role;
import org.ggp.base.util.statemachine.StateMachine;
import org.ggp.base.util.statemachine.exceptions.GoalDefinitionException;
import org.ggp.base.util.statemachine.exceptions.MoveDefinitionException;
import org.ggp.base.util.statemachine.exceptions.TransitionDefinitionException;
import org.ggp.base.util.statemachine.implementation.prover.ProverStateMachine;
public class KioskGamer extends StateMachineGamer implements Observer {
private BlockingQueue theQueue = new ArrayBlockingQueue(25);
private GameGUI theGUI;
private JPanel theGUIPanel;
public KioskGamer(JPanel theGUIPanel) {
this.theGUIPanel = theGUIPanel;
theGUIPanel.setLayout(new BorderLayout());
}
private GameCanvas theCanvas = null;
public void setCanvas(GameCanvas theCanvas) {
this.theCanvas = theCanvas;
}
@Override
public void stateMachineMetaGame(long timeout)
throws TransitionDefinitionException, MoveDefinitionException,
GoalDefinitionException {
if(theCanvas == null)
throw new IllegalStateException("KioskGamer did not receive a canvas.");
theCanvas.setStateMachine(getStateMachine());
theGUI = new GameGUI(theCanvas);
theGUI.setRole(getRole());
theGUI.setBackground(theGUIPanel.getBackground());
theGUI.updateGameState(getStateMachine().getInitialState());
theGUI.addObserver(this);
theGUIPanel.removeAll();
theGUIPanel.add("Center", theGUI);
theGUIPanel.repaint();
theGUIPanel.setVisible(false);
theGUIPanel.setVisible(true);
theGUIPanel.validate();
theGUIPanel.repaint();
}
@Override
public Move stateMachineSelectMove(long timeout)
throws TransitionDefinitionException, MoveDefinitionException,
GoalDefinitionException {
theGUI.beginPlay();
theQueue.clear();
theGUI.updateGameState(getCurrentState());
try {
return theQueue.take();
} catch(Exception e) {
e.printStackTrace();
return null;
}
}
@Override
public StateMachine getInitialStateMachine() {
return new ProverStateMachine();
}
@Override
public String getName() {
return "GraphicalHumanGamer";
}
private MachineState stateFromServer;
@Override
public void observe(Event event) {
if(event instanceof MoveSelectedEvent) {
Move theMove = ((MoveSelectedEvent)event).getMove();
if(theQueue.size() < 2) {
theQueue.add(theMove);
}
} else if(event instanceof ServerNewGameStateEvent) {
stateFromServer = ((ServerNewGameStateEvent)event).getState();
} else if(event instanceof ServerCompletedMatchEvent) {
theGUI.updateGameState(stateFromServer);
List theRoles = getStateMachine().getRoles();
List theGoals = ((ServerCompletedMatchEvent)event).getGoals();
StringBuilder finalMessage = new StringBuilder();
finalMessage.append("Goals: ");
for(int i = 0; i < theRoles.size(); i++) {
finalMessage.append(theRoles.get(i));
finalMessage.append(" = ");
finalMessage.append(theGoals.get(i));
if(i < theRoles.size()-1) {
finalMessage.append(", ");
}
}
theGUI.showFinalMessage(finalMessage.toString());
}
}
@Override
public void stateMachineStop() {
// Do nothing
}
@Override
public void stateMachineAbort() {
// Add an "ABORT" move to the queue so that we don't wait indefinitely
// for a human to submit a move for the aborted match; instead we should
// finish it up as quickly as possible so we can display the next match
// when it arrives.
theQueue.add(new Move(GdlPool.getConstant("ABORT")));
if (theGUI != null) {
theGUI.showFinalMessage("Aborted");
}
}
@Override
public boolean isComputerPlayer() {
return false;
}
@Override
public void preview(Game g, long timeout) throws GamePreviewException {
;
}
}