
jadex.bdi.examples.blackjack.player.PlayerPlayGameRoundPlan Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of jadex-applications-bdi Show documentation
Show all versions of jadex-applications-bdi Show documentation
The Jadex BDI applications package contain
several example applications, benchmarks and
testcases using BDI agents.
The newest version!
package jadex.bdi.examples.blackjack.player;
import jadex.bdi.examples.blackjack.Card;
import jadex.bdi.examples.blackjack.CardSet;
import jadex.bdi.examples.blackjack.GameResult;
import jadex.bdi.examples.blackjack.GameState;
import jadex.bdi.examples.blackjack.Player;
import jadex.bdi.examples.blackjack.RequestBet;
import jadex.bdi.examples.blackjack.RequestDraw;
import jadex.bdi.examples.blackjack.RequestFinished;
import jadex.bdi.examples.blackjack.player.HumanPlayerInterface.HumanPlayerControlPanel;
import jadex.bdi.runtime.IMessageEvent;
import jadex.bdi.runtime.Plan;
import jadex.bdi.runtime.TimeoutException;
import jadex.bridge.fipa.Done;
import jadex.bridge.fipa.SFipa;
import jadex.commons.gui.GuiCreator;
/**
* This plan is executed for every game round.
*/
public class PlayerPlayGameRoundPlan extends Plan
{
//-------- attributes --------
/** The human player interface. */
HumanPlayerInterface hpi = null;
//-------- constructors --------
/**
* Create a new plan.
*/
public PlayerPlayGameRoundPlan()
{
getLogger().info("created: " + this);
if(getBeliefbase().containsBelief("gui"))
{
Object gui = getBeliefbase().getBelief("gui").getFact();
if(gui instanceof GuiCreator)
{
gui = ((GuiCreator)gui).getGui();
getBeliefbase().getBelief("gui").setFact(gui); // Hack!!!
}
hpi = (HumanPlayerInterface)gui;
}
}
//-------- attributes --------
/**
* Execute a plan.
*/
public void body()
{
IMessageEvent querybet = (IMessageEvent)getReason();
RequestBet rb = (RequestBet)querybet.getParameter(SFipa.CONTENT).getValue();
Player me = (Player)getBeliefbase().getBelief("myself").getFact();
me.setState(Player.STATE_GAME_STARTED);
long timeout = ((Number)getBeliefbase().getBelief("timeout").getFact()).longValue();
int mybet = determineBet();
//me.setAccount(me.getAccount()-mybet);
me.makeBet(mybet);
getLogger().info("new account-status=" + me.getAccount() + ", myBet=" + mybet);
// Reply to dealer.
IMessageEvent msg = getEventbase().createReply(querybet, "inform_bet");
rb.setBet(mybet);
msg.getParameter(SFipa.CONTENT).setValue(new Done(rb));
getLogger().info("sending bet to the dealer ... waiting for cardSet");
sendMessage(msg);
me.setState(Player.STATE_PLAYING);
waitForCondition("start_playing");
getLogger().info("started playing");
Card dealercard = ((GameState)getBeliefbase().getBelief("gamestate").getFact()).getDealer().getCards()[0];
// Now draw as many cards as the strategy suggests.
while(CardSet.calculateDeckValue(me.getCards())<21 && shouldDrawCard(dealercard))
{
// draw one more card
getLogger().info("player decided to draw one more card");
RequestDraw rd = new RequestDraw();
IMessageEvent draw_request = getEventbase().createReply(querybet, "request_draw");
draw_request.getParameter(SFipa.CONTENT).setValue(rd);
// Hack!!! Use large timeout because other players might also draw cards.
IMessageEvent ans = sendMessageAndWait(draw_request, timeout*10);
Card[] cards = ((RequestDraw)((Done)ans.getParameter(SFipa.CONTENT).getValue()).getAction()).getCards();
me.setCards(cards);
}
// this player finished
getLogger().info("player decided not to draw more cards");
me.setState(Player.STATE_FINISHED);
RequestFinished rf = new RequestFinished();
IMessageEvent finished = getEventbase().createReply(querybet, "request_finished");
finished.getParameter(SFipa.CONTENT).setValue(rf);
// Hack!!! Use large timeout because other players might still draw cards.
// System.out.println("Sent: "+finished.getParameter(SFipa.CONTENT).getValue());
IMessageEvent resultmsg = sendMessageAndWait(finished, timeout*10);
// System.out.println("Rec: "+resultmsg.getParameter(SFipa.CONTENT).getValue());
// When player has won the game, increment account.
GameResult gr = ((RequestFinished)((Done)resultmsg.getParameter(SFipa.CONTENT).getValue()).getAction()).getGameresult();
if(gr.isWon())
{
// Update the account-status
me.setAccount(me.getAccount()+gr.getMoney());
getLogger().info("I won " + gr.getMoney());
}
else
{
// nothing more to do if the player lost
getLogger().info("I lost :-(");
}
// Reset state.
me.setState(Player.STATE_IDLE);
}
/**
*
*/
public int determineBet()
{
Player me = (Player)getBeliefbase().getBelief("myself").getFact();
int mybet = 10;
if(hpi!=null)
{
((HumanPlayerControlPanel)hpi.getControlPanel()).enableBid();
try
{
waitForFactChanged("gui", 5000);
//System.out.println("Player bets: "+hpi.getBet());
}
catch(TimeoutException e)
{
//System.out.println("No bet made, using strategy.");
//mybet = me.getStrategy().makeBet(me.getAccount());
}
mybet = hpi.getBet();
((HumanPlayerControlPanel)hpi.getControlPanel()).disableBid();
}
else
{
// apply betting-strategy
mybet = me.getStrategy().makeBet(me.getAccount());
}
return mybet;
}
/**
*
* @param dealercard
* @return True, if another card should be drawn.
*/
public boolean shouldDrawCard(Card dealercard)
{
boolean draw = false;
Player me = (Player)getBeliefbase().getBelief("myself").getFact();
if(hpi!=null)
{
((HumanPlayerControlPanel)hpi.getControlPanel()).enableDrawCard();
try
{
waitForFactChanged("gui", 5000);
//System.out.println("Player wants to: "+hpi.isDrawCard());
draw = hpi.isDrawCard();
}
catch(TimeoutException e)
{
//System.out.println("No draw card decision made, using strategy.");
//draw = me.getStrategy().drawCard(me.getCards(), dealercard);
}
((HumanPlayerControlPanel)hpi.getControlPanel()).disableDrawCard();
}
else
{
draw = me.getStrategy().drawCard(me.getCards(), dealercard);
}
return draw;
}
/**
* Called when something went wrong (e.g. timeout).
*/
public void failed()
{
getException().printStackTrace();
// Remove dealer fact.
getBeliefbase().getBelief("dealer").setFact(null);
// Reset state.
Player me = (Player)getBeliefbase().getBelief("myself").getFact();
me.setState(Player.STATE_IDLE);
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy