All Downloads are FREE. Search and download functionalities are using the official Maven repository.

jadex.bdi.examples.blackjack.dealer.DealerGameRoundPlayerPlan Maven / Gradle / Ivy

Go to download

The Jadex BDI applications package contain several example applications, benchmarks and testcases using BDI agents.

The newest version!
package jadex.bdi.examples.blackjack.dealer;

import jadex.bdi.examples.blackjack.Card;
import jadex.bdi.examples.blackjack.CardSet;
import jadex.bdi.examples.blackjack.Dealer;
import jadex.bdi.examples.blackjack.GameResult;
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.runtime.IMessageEvent;
import jadex.bdi.runtime.Plan;
import jadex.bridge.fipa.Done;
import jadex.bridge.fipa.SFipa;

/**
 *  Play a game round with the given player.
 */
public class DealerGameRoundPlayerPlan extends Plan
{
	//-------- attributes --------

	/** The timout for communication with the player. */
	protected long	timeout;

	/** The player object. */
	protected Player	player;

	//-------- constructors --------

	/**
	 *  Create a new DealerPlayGameRoundPlan.
	 */
	public DealerGameRoundPlayerPlan()
	{
		this.timeout = ((Number)getBeliefbase().getBelief("playerwaitmillis").getFact()).longValue();
		this.player = (Player)getParameter("player").getValue();
	}

	//-------- methods --------
	
	/**
	 *  Plan body.
	 */
	public void body()
	{
		// Ask player for her bet.
		getLogger().info("Asking for bet from player: "+player);
		RequestBet rb = new RequestBet();
		IMessageEvent msg = createMessageEvent("request_bet");
		msg.getParameter(SFipa.CONTENT).setValue(rb);
		msg.getParameterSet(SFipa.RECEIVERS).addValue(player.getAgentID());
		getWaitqueue().addReply(msg);
		IMessageEvent betmsg = sendMessageAndWait(msg, timeout);

		// When player does not provide a bet (e.g. declines to play), end plan.
		Object content = betmsg.getParameter(SFipa.CONTENT).getValue();
		getLogger().info("Received bet from player: "+player+", "+content);
		if(!(content instanceof Done))
			fail();

		// Extract bet and update player state.
		int bet	= ((RequestBet)((Done)content).getAction()).getBet();
		if(bet>player.getAccount())
		{
			startAtomic();
			player.setState(Player.STATE_UNREGISTERED);
			getBeliefbase().getBeliefSet("players").removeFact(player);
			endAtomic();
			//fail(); // Not necessary because context becomes invalid
		}
		player.makeBet(bet);
		player.setState(Player.STATE_PLAYING);

		// Give two cards to player.
		drawCard();
		drawCard();

//		MessageEventFilter fil = new MessageEventFilter(null);
//		fil.addValue(SFipa.CONVERSATION_ID, betmsg.getParameter(SFipa.CONVERSATION_ID).getValue());
//		getWaitqueue().addFilter(fil);

//		getWaitqueue().addReply(msg);
		
		// Wait for dealer to draw a card for itself.
		getLogger().info("Waiting for dealer card: "+player);
		waitForCondition("dealer_card");//, timeout*10);	// Hmmm... use timeout???

		// Inform player about dealer card and wait for answer.
		getLogger().info("Informing player about dealer card: "+player);
		Dealer	me	= (Dealer)getBeliefbase().getBelief("myself").getFact();

		IMessageEvent answer = (IMessageEvent)waitForReply(msg);//, timeout);
		getWaitqueue().removeReply(msg);
		
//		IMessageEvent answer = (IMessageEvent)waitFor(fil, timeout);
//		getWaitqueue().removeFilter(fil);

		// Give cards to player as long she wants one.
		content = answer.getParameter(SFipa.CONTENT).getValue();
		while(content instanceof RequestDraw)
		{
			drawCard();
			RequestDraw rd = (RequestDraw)content;
			rd.setCards(player.getCards());
			Done done = new Done(rd);
			IMessageEvent mdone = getEventbase().createReply(answer, "inform_action_done");
			mdone.getParameter(SFipa.CONTENT).setValue(done);
			
			answer = sendMessageAndWait(mdone, timeout);
			content = answer.getParameter(SFipa.CONTENT).getValue();
			//correctGameState();
			getLogger().info("Player wants to draw a card: "+player);
		}
		getLogger().info("Player is finished: "+player);
		player.setState(Player.STATE_FINISHED);

		// Wait for dealer to finish, too.
		getLogger().info("Waiting for dealer to finish: "+player);
		waitForCondition("dealer_finished", timeout*10);	// Hmmm... use timeout???

		// Check if the player won or lost and inform player about result.
		GameResult gr = new GameResult();
		int	moneywon	= player.getMoneyWon(me.getCards());
		if(moneywon > 0) // player won
		{
			gr.setWon(true);
			gr.setMoney(moneywon);
			player.setAccount(player.getAccount() + moneywon);
		}
		else
		{
			gr.setWon(false);
		}
		RequestFinished rf = (RequestFinished)answer.getParameter(SFipa.CONTENT).getValue();
		rf.setGameresult(gr);
		Done done = new Done(rf);
		IMessageEvent result = getEventbase().createReply(answer, "inform_action_done");
		result.getParameter(SFipa.CONTENT).setValue(done);

		sendMessage(result);
		getLogger().info("Player result" + player + "-" + result.getParameter(SFipa.CONTENT).getValue());

		// Wait until allowed to proceed (step-mode or delay).
		if(((Boolean)getBeliefbase().getBelief("singleStepMode").getFact()).booleanValue())
		{
			waitForInternalEvent("step");
		}
		else
		{
//			waitFor(1000*((Number)getBeliefbase().getBelief("stepdelay").getFact()).intValue());
			int restart = 1000*((Number)getBeliefbase().getBelief("restartdelay").getFact()).intValue();
			waitFor(restart);
		}
	}

	/**
	 *  Something went wrong. Remove player from beliefs.
	 */
	public void	failed()
	{
		//System.out.println("player failed :-( "+getName());
		getLogger().info("Player failure :"+player);
		player.setState(Player.STATE_UNREGISTERED);
		getBeliefbase().getBeliefSet("players").removeFact(player);
	}

	/**
	 *  Game complete, reset player.
	 */
	public void	passed()
	{
		getLogger().info("Game completed :"+player);
		player.setState(Player.STATE_IDLE);
	}
	
	/**
	 *  Aborted, reset player.
	 */
	public void	aborted()
	{
		getLogger().info("Game aborted :"+player);
		player.setState(Player.STATE_IDLE);
	}

	//-------- helper methods --------

	/**
	 *  Draw a card for the player.
	 */
	protected void	drawCard()
	{
		// Wait until it is the players turn.
//		getLogger().info("Waiting for players turn: "+player);
		
//		ICondition	turn	= getCondition("players_turn");
//		turn.setParameter("$player", player);
		
//		System.out.println("Waiting for players turn: "+player);
		waitForCondition("players_turn", timeout*10);	// Hmmm... use timeout???
//		System.out.println("Its players turn: "+player);

		// Wait until allowed to draw card (step-mode or delay).
		if(((Boolean)getBeliefbase().getBelief("singleStepMode").getFact()).booleanValue())
		{
			waitForInternalEvent("step");
		}
		else
		{
			waitFor(1000*((Number)getBeliefbase().getBelief("stepdelay").getFact()).intValue());
		}
		
		// Draw card for player.
		CardSet	cardset	= (CardSet)getBeliefbase().getBelief("cardset").getFact();
		Card	card	= cardset.drawCard();
		player.addCard(card);
	}
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy