📄 dealer.java
字号:
import java.util.*;
//BLACKJACK become WIN or PUSH if dealer has bj
class Status
{
private final String name;
//Ordinal of next suit to be created
private static int nextOrdinal = 0;
//Assign an ordinal to this Status
private final int ordinal = nextOrdinal++;
private Status(String name)
{
this.name = name;
}
public String toString()
{
return name;
}
public int compareTo(Object o)
{
return ordinal - ((Status)o).ordinal;
}
//黑杰克:起手牌为A+(10 或 J 或 Q 或 K)
static final Status BLACKJACK = new Status(Cfg.isChina?"黑杰克":"blackjack");
//赢
static final Status WIN = new Status(Cfg.isChina?"赢":"win");
//输
static final Status LOSE = new Status(Cfg.isChina?"输":"lose");
//推:筹码退回,不收取任何费用
static final Status PUSH = new Status(Cfg.isChina?"平手":"push");
}
//玩者
class Dealer
{
Dealer(int numDecks,int cutCardPosition)
{
this.numDecks =numDecks;
this.cutCardPosition = cutCardPosition;
dealer = null;
}
//加入玩家(可以是PlayerHand玩家牌手或SimulatedPlayerHand电脑仿真的玩家牌手)
void assignPlayerHand(BlackJackHand hand)
{
players.addElement(hand);
}
//设置庄家(只能是StandardDealerHand庄家牌手)
void setDealerHand(BlackJackHand hand)
{
dealer = hand;
}
//重新来一幅已洗好的牌
void newShoe()
{
theDeck.burnIt();//仍掉此幅牌的所有牌
theDeck.addDeck(numDecks);//加一幅新牌
theDeck.shuffle();//洗牌
}
//发牌
void deal()
{
setMoney(getMoney()-getBet()); setTotal(getBet());
isDouble = false;
if (theDeck.remainingCards() <= cutCardPosition )
newShoe();
boolean somebodyPlaying = false;
// 把所有玩家手里的牌扔掉
for(Enumeration e = players.elements();e.hasMoreElements();)
{
BlackJackHand currentPlayer = (BlackJackHand)e.nextElement();
currentPlayer.reset();
}
dealer.reset(); //把庄家手里的牌扔掉
//给每个玩家和庄家发两张牌
for(int i=0; i<2; i++)
{
for(Enumeration e = players.elements(); e.hasMoreElements();)
{
BlackJackHand currentPlayer = (BlackJackHand) e.nextElement();
dealCard(currentPlayer);
}
dealCard(dealer);
}
/*
if(dealer.isBlackJack() )
{
}
else
{
//处理每个玩家牌手的走法
for(Enumeration e = players.elements();e.hasMoreElements();)
{
BlackJackHand currentPlayer = (BlackJackHand) e.nextElement();
somebodyPlaying = processTurn(currentPlayer) || somebodyPlaying;
}
if(somebodyPlaying)
processTurn(dealer);
}
*/
}
//处理走法,如果牌手的走法超过21分,返回为假,否则返回为真
boolean processTurn(BlackJackHand hand)
{
boolean doneturn = false;
boolean retval = true;
TurnResult turn;
while(!doneturn)
{
turn = hand.takeTurn();
//如果牌手的走法是要牌的话,那么发一张牌给要牌手,等待下一步走法
if(turn == TurnResult.HIT)
{
dealCard(hand);
continue;
}
//如果牌手是爆牌的话,结束走法处理,返回FALSE
if(turn == TurnResult.BUST)
{
//allow fall through
retval = false;
doneturn = true;
continue;
}
//如果牌手走发是停牌的话,结束本次走法处理,并返回真
if(turn == TurnResult.STAND)
{
doneturn = true;
continue;
}
//如果牌手走法是加倍的话,发一张牌给牌手,结束本次走法处理,
//如果发牌后最高总分大于21,返回假
if(turn == TurnResult.DOUBLE_DOWN)
{
dealCard(hand);
// did we bust
retval = hand.highCount() <= 21 ;
doneturn = true;
continue;
}
//如果牌手走法是分牌的话,抛出没实现异常,等待下一步走法
if(turn == TurnResult.SPLIT)
{
//throw "Not implemented";
continue;
}
//throw "Illegal result of move";
}
return retval;
}
//如果,还需要继续走返回真
boolean handleTurn(BlackJackHand hand)
{
TurnResult turn;
turn = hand.takeTurn();
//如果牌手的走法是要牌的话,那么发一张牌给要牌手,等待下一步走法
if(turn == TurnResult.HIT)
{
dealCard(hand);
if(hand.highCount() <= 21)
{
return true;
}
else
{
return false;
}
}
//如果牌手是爆牌的话,结束走法处理,返回FALSE
if(turn == TurnResult.BUST)
{
return false;
}
//如果牌手走发是停牌的话,结束本次走法处理,并返回真
if(turn == TurnResult.STAND)
{
return false;
}
//如果牌手走法是加倍的话,发一张牌给牌手,结束本次走法处理,
//如果发牌后最高总分大于21,返回假
if(turn == TurnResult.DOUBLE_DOWN)
{
dealCard(hand);
money = money-bet;
bet = bet*2;
total = total *2;
isDouble = true;
return false;
}
if(turn == TurnResult.INSURANCE)
{
hand.offerInsurance();
money = money+bet/2;
bet = bet/2;
return true;
}
//如果牌手走法是分牌的话,抛出没实现异常,等待下一步走法
if(turn == TurnResult.SPLIT)
{
//throw "Not implemented";
//isContinue.ok=true;
return true;
}
//throw "Illegal result of move";
return true;
}
// 得到某玩家手中牌的状态(判断此局牌,结局状态)
Status getPlayerStatus(final BlackJackHand hand)
{
int pCount = hand.highCount();
int dCount = dealer.highCount();
//玩家是黑杰克
if( hand.isBlackJack() )
{
//玩家上了保险,结局是玩家赢
if( hand.tookInsurance() )
return Status.WIN;
//玩家没上保险
//庄家也是黑杰克,结局是推
if ( dealer.isBlackJack() )
return Status.PUSH;
//庄家不是黑杰克,结局是玩家黑杰克
return Status.BLACKJACK;
}
//玩家不是黑杰克
//玩家爆牌,结局是玩家输
if( pCount > 21)
return Status.LOSE;
//玩家没有爆牌
//庄家爆牌,结局是玩家赢
if( dCount > 21 )
return Status.WIN;
//庄家没有爆牌
//玩家总分大于庄家,结局是玩家赢
if( pCount > dCount)
return Status.WIN;
// 玩家总分等于庄家,结局是推
if ( pCount == dCount )
return Status.PUSH;
//玩家总数小于庄家分数,结局是玩家输
return Status.LOSE;
}
//给某玩家发一张牌
private boolean dealCard(BlackJackHand hand)
{
Card card = theDeck.getCard();
if(card!=null)
hand.addCard(card);
return card!=null;
}
public String toString()
{
String s;
s = "numDecks="+numDecks + " ; cutCardPosition="+ cutCardPosition +"\n";
s += "Deck-> " +theDeck+"\n";
s += "dealer-> " + dealer+"\n";
s += "players -> nums:"+players.size();
for(int i=0; i<players.size(); i++)
s+="\n\t" + (BlackJackHand)players.elementAt(i);
return s;
}
Vector getPlayers()
{
return players;
}
//表明此幅牌有几套牌(1套52张)
private int numDecks =1;
//表示剩下的牌小于等于几张后开始重新洗牌(确省每玩一局都开始洗牌)
private int cutCardPosition=52;
//一幅牌
private Deck theDeck = new Deck();
//玩家牌手的集合,包括真实玩家PlayerHand和电脑仿真的玩家SimulatedPlayerHand
private Vector players = new Vector();
//庄家:玩家的对手
private BlackJackHand dealer;
int getBet()
{
return bet;
}
void setBet(int b)
{
bet = b;
}
int getMoney()
{
return money;
}
void setMoney(int m)
{
money = m;
}
int getTotal()
{
return total;
}
void setTotal(int t)
{
total =t ;
}
private int bet =10; private int money =200; private int total=0;
boolean isDouble = false;}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -