📄 blackjackhand.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 + -