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";
}
}