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

jadex.bdi.examples.blackjack.Player Maven / Gradle / Ivy

Go to download

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

There is a newer version: 2.4
Show newest version
package jadex.bdi.examples.blackjack;

import jadex.bdi.examples.blackjack.player.strategies.AbstractStrategy;
import jadex.bdi.examples.blackjack.player.strategies.IStrategy;
import jadex.bridge.IComponentIdentifier;
import jadex.commons.SUtil;
import jadex.commons.SimplePropertyChangeSupport;

import java.awt.Color;
import java.beans.PropertyChangeListener;
import java.util.ArrayList;
import java.util.List;


/**
 *  Representation of a player.
 */
public class Player
{
	//-------- constants --------

	/** State of a player that is not involved in a game. */
	public static final String STATE_UNREGISTERED = "unregistered";

	/** State of a player that is not involved in a game. */
	public static final String STATE_IDLE = "idle";

	/** State of a player at game start. */
	public static final String STATE_GAME_STARTED = "game started";

	/** State of a player, after bet is made. */
	public static final String STATE_PLAYING = "playing";

	/** State of a player when all cards are drawn. */
	public static final String STATE_FINISHED = "finished";

	//-------- attributes --------

	/** The player's name. */
	protected String name;

	/** The player's account. */
	protected int account;

	/** The player's color. */
	protected Color color;

	/** Hack, necessary because in Java Color is not a bean. */
	protected Integer colorvalue;

	/** The strategyname. */
	protected String strategyname;

	/** The player's strategy. */
	protected IStrategy strategy;

	/** The player's agent id. */
	protected IComponentIdentifier aid;

	/** The player state. */
	protected String state;

	/** The player's current bet. */
	protected int bet;

	/** The player's decision if to draw another card. */
	protected boolean drawcard;

	/** The cards held by the player. */
	protected List cards;

	/** The game counter (incremented when a game is started). */
	protected int games;

	/** The helper object for bean events. */
	protected SimplePropertyChangeSupport pcs;

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

	/**
	 *  Empty bean constructor. 
	 */
	public Player()
	{
		this(null, 0, null, null);
	}

	/**
	 *  Create a new Player.
	 */
	public Player(String name, int account, Color color, String strategyname)
	{
		this(null, name, account, color, strategyname);
	}

	/**
	 *  Create a new Player.
	 */
	public Player(IComponentIdentifier aid, String name, int account, Color color, String strategyname)
	{
		this.aid = aid;
		this.name = name;
		this.account = account;
		this.color = color;
		this.strategyname = strategyname;
		//if(strategyname!=null)
		//	this.strategy	= AbstractStrategy.getStrategy(strategyname);
		this.state = STATE_UNREGISTERED;
		this.pcs = new SimplePropertyChangeSupport(this);
	}

	//-------- attributes --------

	/**
	 *  Get the name of the player.
	 */
	public String getName()
	{
		return name;
	}

	/**
	 *  Set the name of the player.
	 */
	public void setName(String name)
	{
		this.name = name;
	}

	/**
	 *  Get the account of the player.
	 */
	public int getAccount()
	{
		return account;
	}

	/**
	 *  Set the account of the player.
	 */
	public void setAccount(int account)
	{
		this.account = account;
	}

	/**
	 *  Get the color of the player.
	 */
	public Color getColor()
	{
		if(color == null)
			color = new Color(colorvalue.intValue());
		return color;
	}

	/**
	 *  Set the color of the player.
	 * /
	public void setColor(Color color)
	{
		this.color = color;
		if(color != null)
			colorvalue = color.getRGB();
	}*/

	/**
	 *  Get the color value.
	 *  @return The color value.
	 */
	public int getColorValue()
	{
		return colorvalue!=null? colorvalue.intValue(): color.getRGB();
	}

	/**
	 *  Set the color value.
	 *  @param colorvalue	The color value.
	 */
	public void setColorValue(int colorvalue)
	{
		this.colorvalue = new Integer(colorvalue);
	}

	/**
	 *  Get the strategy of the player.
	 */
	public IStrategy getStrategy()
	{
		if(strategy == null && strategyname != null)
			strategy = AbstractStrategy.getStrategy(strategyname);
		return strategy;
	}

	/**
	 *  Set the strategy of the player.
	 * /
	public void setStrategy(IStrategy strategy)
	{
		this.strategy = strategy;
	}*/

	/**
	 *  Get the strategy name.
	 *  @return The strategy name.
	 */
	public String getStrategyName()
	{
		return strategyname;
	}

	/**
	 *  Set the strategy name.
	 *  @param strategyname The strategy name.
	 */
	public void setStrategyName(String strategyname)
	{
		this.strategyname = strategyname;
	}

	/**
	 *  Get the aid of the player.
	 */
	public IComponentIdentifier getAgentID()
	{
		return aid;
	}

	/**
	 *  Set the aid of the player.
	 */
	public void setAgentID(IComponentIdentifier aid)
	{
		this.aid = aid;
	}

	/**
	 *  Add a card.
	 */
	public void addCard(Card card)
	{
		if(cards == null)
			this.cards = new ArrayList();
		cards.add(card);
		//		System.out.println("new_card");
		//pcs.firePropertyChange("new_card", null, card);
		pcs.firePropertyChange("cards", null, cards);
		pcs.firePropertyChange("cardCnt", new Integer(cards.size()-1), new Integer(cards.size()));
	}

	/**
	 *  Get the cards held by the player.
	 */
	public Card[] getCards()
	{
		return cards == null ? new Card[0] : (Card[])cards.toArray(new Card[cards.size()]);
	}

	/**
	 *  Get the cards held by the player.
	 */
	public void setCards(Card[] cards)
	{
		this.cards = SUtil.arrayToList(cards);
		//		System.out.println("new_cards");
		//pcs.firePropertyChange("new_cards", null, cards);
		pcs.firePropertyChange("cards", null, cards);
		pcs.firePropertyChange("cardCnt", new Integer(cards.length-1), new Integer(cards.length));
	}

	/**
	 *  Get a card.
	 */
	public Card getCard(int idx)
	{
		return (Card)cards.get(idx);
	}

	/**
	 *  Get a card.
	 */
	public void setCard(int idx, Card card)
	{
		cards.add(idx, card);
	}
	
	/**
	 *  Get the number of cards.
	 */
	public int getCardCnt()
	{
		return cards == null? 0: cards.size();
	}
	
	/**
	 *  Get the state.
	 */
	public String getState()
	{
		return state;
	}

	/**
	 *  Set the state.
	 */
	public void setState(String state)
	{
		this.state = state;
		if(state.equals(STATE_GAME_STARTED))
		{
			this.games++;
			setCards(new Card[0]);
			setBet(0);
		}
		if(state.equals(STATE_IDLE))
		{
			setCards(new Card[0]);
			setBet(0);
		}
		//		System.out.println("new_state");
		pcs.firePropertyChange("playingstate", null, state);
	}

	/**
	 *  Get the bet.
	 */
	public int getBet()
	{
		return bet;
	}

	/**
	 *  Set the bet.
	 */
	public void setBet(int bet)
	{
		this.bet = bet;
		//		System.out.println("new_bet");
		pcs.firePropertyChange("bet", null, new Integer(bet));
	}

	/**
	 *  Make a bet.
	 */
	public void makeBet(int bet)
	{
		if(bet > account)
			throw new RuntimeException("Insufficient cover for bet " + bet + ": " + this);
		this.account -= bet;
		this.bet = bet;
		//		System.out.println("new_bet");
		pcs.firePropertyChange("bet", null, new Integer(bet));
	}

	/**
	 *  Get the game counter.
	 */
	public int getGameCount()
	{
		return games;
	}

	/**
	 *  Get the money won in the current game.
	 */
	public int getMoneyWon(Card[] dealercards)
	{
		int moneywon;
		int dealerval = CardSet.calculateDeckValue(dealercards);
		int playerval = CardSet.calculateDeckValue(getCards());

		// there's missing something here ... :-(
		// check if the dealer has blackjack (== 21 points and only two cards)
		// sorry, will be implemented in the next release

		if((playerval <= 21) && ((playerval >= dealerval) || (dealerval > 21)))
		{
			if(playerval == dealerval)
				moneywon = this.bet; // draw
			else
				moneywon = this.bet * 2; // player wins
		}
		else
		{
			moneywon = 0; // player lost
		}

		return moneywon;
	}

	/**
	 *  Test if this player equals another object.
	 */
	public boolean equals(Object o)
	{
		//return o==this || o instanceof Player && (this.aid!=null && this.aid.equals(((Player)o).getAgentID())
		//	|| this.name.equals(((Player)o).getName()));
		return o == this || o instanceof Player && this.name.equals(((Player)o).getName());
	}

	/**
	 *  Get the hash code of this player.
	 */
	public int hashCode()
	{
		// Use hash code of aid, if available.
		//return aid!=null ? aid.hashCode() : name.hashCode();
		return name.hashCode();
	}

	public String toString()
	{
		return "Player(name=" + name + ", state=" + state + ", cards=" + cards + ", money=" + account + ")";
	}

	//-------- property methods --------

	/**
	 *  Add a PropertyChangeListener to the listener list.
	 *  The listener is registered for all properties.
	 *  @param listener  The PropertyChangeListener to be added.
	 */
	public void addPropertyChangeListener(PropertyChangeListener listener)
	{
		pcs.addPropertyChangeListener(listener);
	}

	/**
	 *  Remove a PropertyChangeListener from the listener list.
	 *  This removes a PropertyChangeListener that was registered
	 *  for all properties.
	 *  @param listener  The PropertyChangeListener to be removed.
	 */
	public void removePropertyChangeListener(PropertyChangeListener listener)
	{
		pcs.removePropertyChangeListener(listener);
	}

	//-------- static part --------

	/*public static String	color2Hex(Color color)
	{
		String	hex	= Integer.toHexString(0xFFFFFF & color.getRGB()).toUpperCase();
		return "#" + "000000".substring(hex.length()) + hex;
	}*/
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy