21点规则,策略及算法参考 21点算法 。
21点规则
游戏由玩家和庄家(即赌场的发牌员)对玩,看谁的牌面点数更靠近21点。但如果超过了21点,则称为“爆掉”,算输。其中花牌(J,Q,K)都算10点,A可以算1点,也可以算11点,看哪种情况更有利。玩家之间不做比较。
游戏开始时,所有玩家和庄家各拿两张牌,一般来说,是玩家两张牌牌面朝上,庄家一张牌面朝上,一张牌面朝下。
两张牌的点数,肯定介于2到21点之间。21点只可能是一张10(包括J,Q,K,下同)和一张A,这叫“天成(BlackJack,以下简称BJ)”,除非庄家也拿到了BJ,不然赢一倍半的赌注。
玩家在游戏中有如下选择:
(1)要牌,直到他(或她,下同)认为自己的牌面离21点足够近了。比如手头的牌是4和5,加起来才9点,那么无论再加张什么牌,都不会爆掉,当然应该要牌。
(2)停牌,即不再要牌,比如手头是张10和9,已经很接近21点了,就不用再要牌了。
(3)加倍,即加一倍赌注,再要且仅要一张牌。比如手头是张4和7,这时要牌是肯定安全的,而且很可能拿到10或者其他点数较大的牌,一张就够了,值得加倍。这只能在刚拿到两张牌时使用,要过牌后就不能加倍。
(4)分牌,即拿到两张点数相同的牌时,可以加一份赌注,把牌分为两份,比如手头是两张8,加起来是16,非常糟糕的点数,这时就应该把牌分为两个8,再要两张牌来,很可能拿到10形成18点,就把坏牌变成好牌了。
(5) 保险,即在庄家亮着的牌是A时,由于他拿到BJ的几率很大,玩家可以下赌注一半的保险。如果庄家没有拿到BJ,保险金就输掉了,如果庄家拿到了BJ,付给 玩家两倍保险金。很多玩家在自己拿到BJ的情况下,会下赌注一半的保险,以保证自己能赢回一倍赌注,因为如果庄家没有BJ,那他能赢赌注的一倍半,去掉输 掉的半倍保险,还赢一倍赌注;如果庄家有BJ,那他们牌面打平,但保险能赚回一倍赌注。
(6)投降,这时只输一半赌注。如果自己的牌是10和6,庄家亮着的牌是A,那还是趁早投降好。庄家在手头的牌是A时,会问大家是否要保险,然后检查自己的牌是否BJ。如果手头的牌是10,也会检查是否BJ,但这时玩家就不能买保险了。
如果玩家要牌爆掉,算输,庄家当场收掉他的赌注。
当所有的玩家都做出选择后,庄家的玩法是固定的:亮出底牌,如果点数不到17点,则必须要牌,直到超过了16点或爆掉为止。
如果双方都还没有爆掉,则更接近21点的那个胜,如果双方点数相同,则算打平。
21点策略
规则为:庄家在软17点时停止、无限分牌加倍、允许投降。
为了方便分析,我们先假设52张牌出现的概率始终相同,也就是说每张牌都是从一个无穷多副牌组成的牌盒里抽出来的,或者说前面出过的牌不影响后面的牌,换句话说,每张牌相互之间都是独立的。
在上述规则下,基本策略为:
以下点数都是所谓“硬点数”,即不包括A或A算1点,以后如果不特别指明,各点都指“硬点数”。
庄家:2 3 4 5 6 7 8 9 10 A
玩家点数:
<=8 H H H H H H H H H H
9 H D D D D H H H H H
10 D D D D D D D D H H
11 D D D D D D D D D H
12 H H S S S H H H H H
13 S S S S S H H H H H
14 S S S S S H H H H H
15 S S S S S H H H R H
16 S S S S S H H R R R
>=17 S S S S S S S S S S
其中H表示“要牌(Hit)”,S表示“停牌(Stand)”,D表示“加倍(Double down)”,R表示“投降(suRrender)”。
手中有A,而且A算11也不会爆掉,就是所谓“软点数”,应该运用下面这个表格:
庄家:2 3 4 5 6 7 8 9 10 A
玩家
13 H H H D D H H H H H
14 H H H D D H H H H H
15 H H D D D H H H H H
16 H H D D D H H H H H
17 H D D D D H H H H H
18 S DS DS DS DS S S H H H
>=19 S S S S S S S S S S
“D”和“DS”都表示加倍,在不可以加倍的情况下,“D”表示要牌,“DS”表示停牌。
最后是分牌策略:
庄家:2 3 4 5 6 7 8 9 10 A
玩家
A,A P P P P P P P P P P
2,2 H H P P P P H H H H
3,3 H H P P P P H H H H
4,4 H H H P P H H H H H
5,5 D D D D D D D D H H
6,6 H P P P P H H H H H
7,7 P P P P P P H H H H
8,8 P P P P P P P P P P
9,9 P P P P P S P P S S
10,10 S S S S S S S S S S
其中P表示“分牌(sPlit)”。
二十一点算牌法
二十一点能够算牌,是因为我们在讨论“基本策略”时提出的一个假设不成立:
假设52张牌出现的概率始终相同,也就是说每张牌都是从一个无穷多副牌组成的牌盒里抽出来的,或者说前面出过的牌不影响后面的牌,换句话说,每张牌相互之间都是独立的。
显然,不可能有这样的由无穷多副牌组成的牌盒,前面出过的牌总会影响后面的牌。在算牌法刚出现的时代,赌场仍然使用 一副牌来玩二十一点,那么这个影响就更明显。比如,发牌员发出牌来,你拿到两个10(包括J、Q、K),庄家亮牌也是10,翻出底牌来还是10,那么下一 轮里10出现的概率已不再是4/13,而是12/48,即1/4,略低于4/13。同样的,其他点数出现的概率也已不再是1/13,而是1/12。
使用一种叫“高低法(High-Low)”的算牌法。在游戏过程中,我们把每一张出现的2,3,4,5,6都 算+1点,7,8,9算0点,10,J,Q,K,A算-1点,将各点相加,结果越大,就表示前面出现过的小牌越多,对玩家越有利。反过来,如果结果是个负 数,就表示前面出过的大牌比小牌多,对庄家有利。
比如前面出现的牌是:
4,9,10,5,J,A,8,10,Q,2,6,K,J,7
那么点数就是4张小牌减7张大牌,是-3。当然,在游戏过程中,你不可能叫庄家把牌局暂停,让你从容加减。你必须在每张牌出来时,就在心里默算点数。比如在上面的例子里,从第一张牌出现开始,你就应该在心里默算出:
1,1,0,1,0,-1,0,-2,-3,-2,-1,-2,-3,-3
算法实现
function cc(card) {
for(var i=0;i<card.length;i++){
if(card[i]>=2&&card[i]<=6){
count++;
//return count;
}else if(card[i]==10||card[i]=='J'||card[i]=='Q'||card[i]=='K'||card[i]=='A'){
count--;
//return count;
}
}
if(count>0){
return count+" Bet";
}else{
return count+" Hold";
}
}