⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 blackjackhand.java

📁 24点扑克牌游戏~为了运行这个程序
💻 JAVA
字号:
import java.util.*;
import java.awt.*;
import java.awt.image.*;
	class TurnResult
	{
		private final String name;
		//Ordinal of next suit to be created
		private static int nextOrdinal = 0;
		
		//Assign an ordinal to this TurnResult
		private final int ordinal = nextOrdinal++;
		
		private TurnResult(String name)
		{
			this.name = name;
		}
		public String toString()
		{
			return name;
		}
		public int compareTo(Object o)
		{
			return ordinal - ((TurnResult)o).ordinal;
		}
		//爆牌:手中牌的最小总分超过21分
		static final TurnResult BUST = new TurnResult("bust");
		//停牌:不再要牌		
		static final TurnResult STAND = new TurnResult("stand");
		//要牌:再要一张牌		
		static final TurnResult HIT = new TurnResult("hit");
		//加倍:获得2张牌后,选择仅要一张牌后停牌,回报加倍(如果前两张牌总分是9,10,11可以选择加倍)
		static final TurnResult DOUBLE_DOWN = new TurnResult("double_down");
		//分牌:每手所获得第1,2张牌面数值若相同,可以分成2手牌,新分的牌筹码与另一手相同
		static final TurnResult SPLIT = new TurnResult("split"); 			//买保险:如果庄家手中拿到明牌A,暗牌如果是10,J,Q,K就会构成Blackjack。玩家此时有机会买保险,保险金是玩家当初下注的一半	
		static final TurnResult INSURANCE = new TurnResult("insurance");		
	}

public interface  BlackJackHand
{
	// 统计手里的最低分
	public int lowCount();

	// 统计手里的最高分
	public int highCount();

	// 手里的牌是黑杰克吗?(如果手里有两张牌,总分是21,并且一张是老A,则此副牌是黑杰克)
	public boolean isBlackJack();

	// 手里牌的张数
	public int numCards() ;

	// 得到手里的某张牌(which>=1)
	public Card getCard(int which);

	//取一张牌到手中
	public void addCard(final Card card) ;

	// 扔掉手里的牌
	public void reset();


	//手里的最后一张牌是否是老A
	public  boolean isAceShowing();

	// Insurance or even money
	//保险
	public boolean tookInsurance();

	public void offerInsurance();

	public String getIdentity();
	
	public TurnResult takeTurn();

	public Vector getCards();
	public void draw(Graphics g,int x,int y,ImageObserver imgObr);


}


abstract class StandardBlackJackHand implements BlackJackHand
{

	
	abstract public TurnResult takeTurn();

	StandardBlackJackHand(String name)
	{
		id = new String(name);
	}

	public boolean tookInsurance()
	{
		return false;
	}

	public void offerInsurance()
	{
	}


	// 统计手里的最低分
	public int lowCount()
	{
		return totalCardCount(false);
	}
	// 统计手里的最高分
	public int highCount()
	{
		return totalCardCount(true);
	}
	// 如果手里有两张牌,总分是21,并且一张是老A,则此副牌是黑杰克
	public boolean isBlackJack()
	{
		return ( (hand.size() == 2) && (highCount() == 21 ) );
	}
	//手里的牌可以分牌吗?(如果前两张牌面价相同,可以分牌)
	public boolean isSplitable() 
	{
		Card firstCard = (Card)hand.firstElement();
		Card lastCard = (Card) hand.lastElement();
		return  ( hand.size() == 2 ) && (firstCard.cardType()==lastCard.cardType() );
	}	// 手里牌的张数
	public int numCards()
	{
		return hand.size();
	}	
	// 得到手里的某张牌(which>=1)
	public Card getCard( int which)
	{
		//assert( which <= hand.size() );
		return (Card)hand.elementAt(which);
	}
	public Vector getCards()
	{
		return hand;
	}
	//取一张牌到手中
	public void addCard(final Card card)
	{
		hand.addElement(card);
	}
	// 扔掉手里的牌
	public void reset()
	{
		hand.removeAllElements();
	}
	//手里的最后一张牌是否是老A
	public boolean isAceShowing()
	{
		Card lastCard = (Card)hand.lastElement();
		return lastCard.isAce();
	}

	// 手中纸牌的总分,参数指明是否统计最高分
	private int totalCardCount(boolean highCount)
	{

		int count = 0;
		int numAces = 0;
		
		for(Enumeration e = hand.elements();e.hasMoreElements();)
		{
			Card card = (Card)e.nextElement();
	
			//老A的个数
			if(card.isAce())
				numAces++;
	
			//统计最低分(把老A看作1分)
			count += singleCardCount(card, false);
		}

		// 如果统计最高分,如果手里有老A,如果最低分不大于11分,最低分累加10分
		if(highCount && count <= 11 && numAces > 0)
			count += 10;

		return count;
	}

	//统计某牌的分值(参数指明把老A当1分还是11分)
	int singleCardCount(final Card card,boolean highCount)
	{
		int count = 0;

		if( card.isAce() )
			count += highCount ? 11 : 1 ;
		else if ( card.isFaceCard() || card.cardType() == 'T')
			count += 10;
			else
			{
				//assert(card.IsValueCard() );
				count = count + card.cardType() - '0';
			}

		return count;
	}
	
	public String toString()
	{
		String s;
		s = "Cards in hand =" + hand.size() + " " +hand;

		return s;
	} 
	
	public String getIdentity()
	{
		return id;
	}

	private Vector hand = new Vector(); //手里牌的集合
	private String id;	TurnResult turnResult;	String upShot = "";}
//玩家牌手:除坐庄以外的玩牌者,对手为庄家。
class PlayerHand extends StandardBlackJackHand
{
	
	
	PlayerHand(String id)
	{
		super(id);
	}	boolean canDouble()	{		if(numCards() == 2)
		{
			int count = highCount();
			//如果手里的前两张牌最高总分是9,10,11 则可以分牌
			return (count == 9 || count == 10 || count == 11);		}		return false;	}	void setTurn(TurnResult turn)	{		turnResult = turn;	}
	//得到走法
	public TurnResult takeTurn()
	{
		TurnResult result = TurnResult.BUST;
						//如果手中牌的最高总分不大于21,告诉显示借口是否可以加倍和分牌,
		//并从显示接口得到玩家的走法
		if( highCount() <= 21)		{
			result = turnResult;			turnResult = null;		}
		return result;
	}

	// Insurance or even money
	public boolean tookInsurance() 
	{
		return tookInsurance;
	}	public void offerInsurance()	{		tookInsurance = true;	}
	public String toString()
	{
		return "name="+getIdentity() + " ; tookInsurance=" + tookInsurance + " ; " + super.toString();
	}
	public void draw(Graphics g,int x,int y,ImageObserver imgObr)
	{		int xx = x;
		Vector cards = getCards();
		for(Enumeration e = cards.elements();e.hasMoreElements();)		{			Card card = (Card)e.nextElement();			Image img = card.getIcon();					g.drawImage(img,x,y,imgObr);			x += Cfg.cardSize.height/3;		}		String score ;
		if(lowCount()==highCount())
			score = " ("+highCount()+")";
		else
			score = " ("+lowCount()+"/"+highCount()+")";
		x += Cfg.cardSize.width;			if(numCards()==0)
			score = "";					g.setColor(Color.black);			g.drawString(getIdentity()+score+upShot,xx,y-g.getFont().getSize()/8);	
	}
	
	boolean tookInsurance;
}
//电脑仿真的玩家牌手
class SimulatedPlayerHand extends StandardBlackJackHand
{

	SimulatedPlayerHand(String id)
	{
		super(id);
	}

	//得到手中牌的玩法
	public TurnResult takeTurn()
	{
		TurnResult result = TurnResult.STAND; //停牌

		//如果最高总分小于17,走法为要牌
		if( highCount() < 17)
			result = TurnResult.HIT;
		
		//如果最高总分大于21,走法为爆牌	
		else if( highCount() > 21)
			result = TurnResult.BUST;
			
		//如果>=17  <=21 ,走法为停牌

		//显示走法
//		getDisplayer().displayTurn(this,result);		turnResult = result;

		return result;
	}
	public void draw(Graphics g,int x,int y,ImageObserver imgObr)
	{
		int xx = x;		Vector cards = getCards();
		for(Enumeration e = cards.elements();e.hasMoreElements();)		{			Card card = (Card)e.nextElement();			Image img = card.getIcon();					g.drawImage(img,x,y,imgObr);			x += Cfg.cardSize.height/3;		}		String score ;
		if(lowCount()==highCount())
			score = " ("+highCount()+")";
		else
			score = " ("+lowCount()+"/"+highCount()+")";
		x += Cfg.cardSize.width;		if(numCards()==0)
			score = "";
		g.setColor(Color.black);			g.drawString(getIdentity()+score+upShot,xx,y-g.getFont().getSize()/8);		}

	public String toString()
	{
		return "name=" + getIdentity() + " ; " + super.toString();
	}
}
//庄家牌手:坐庄的玩家,对手为所有闲家。
class StandardDealerHand extends StandardBlackJackHand
{
	boolean cardDown =true;
	StandardDealerHand(String id)
	{
		super(id);
	}
	StandardDealerHand()
	{
		super(Cfg.isChina?"庄家":"Dealer");
	}	boolean canInsurance()	{		if(numCards() == 2)
		{			Card card = (Card)getCards().elementAt(0);			if (card.isAce())				return true;
		}		return false;	}
	//得到走法
	public TurnResult takeTurn()
	{
		TurnResult result = TurnResult.STAND; //停牌

		//如果最高分小于17,走法为要牌
		if( highCount() < 17 )
			result = TurnResult.HIT;

		//如果最高总分大于21,走法为爆牌	
		else if (highCount() > 21)
			return TurnResult.BUST;

		//如果>=17  <=21 ,走法为停牌

		//显示走法
//		getDisplayer().displayTurn(this,result);		turnResult = result;
		return result;
	}

	public String toString()
	{
		return "name="+ getIdentity() + " ; " + super.toString();
	}
	public void draw(Graphics g,int x,int y,ImageObserver imgObr)
	{
		int xx =x;		Vector cards = getCards();		for(int i=0;i<cards.size();i++)		{
			if(i==1 && cardDown)
			{
				g.drawImage(Cfg.cardIcons[0],x,y,imgObr);
				x += Cfg.cardSize.width/3;				break;
			}			Card card = (Card)cards.elementAt(i);			Image img = card.getIcon();			g.drawImage(img,x,y,imgObr);			x += Cfg.cardSize.width/3;		}		g.setColor(Color.black);			g.drawString(getIdentity(),xx,y-g.getFont().getSize()/8);		if(cards.size()==0)			return;			Card card = (Card)cards.elementAt(0);	
		String score ;
		if(singleCardCount(card,true)==singleCardCount(card,false))
			score = " ("+singleCardCount(card,true)+")";
		else
			score = " ("+singleCardCount(card,false)+"/"+singleCardCount(card,true)+")";
		if(cardDown==false)		if(lowCount()==highCount())
			score = " ("+highCount()+")";
		else
			score = " ("+lowCount()+"/"+highCount()+")";
		if(numCards()==0)
			score = "";
		g.drawString(getIdentity()+score+upShot,xx,y-g.getFont().getSize()/8);		}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -