【21点(BlackJack)python代码实现(一)】

21点(BlackJack)python代码实现(一)


在这里插入图片描述

程序背景:

该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。

21点一般用到1-8副牌。

点数计算

手中扑克点数的计算是:

  1. 2至9牌,按其原点数计算;
  2. K、Q、J和10牌都算作10点(一般记作T,即ten之意);
  3. A 牌(ace)既可算作1点也可算作11点,由玩家自己决定(当玩家停牌时,点数一律视为最大而尽量不爆,如A+9为20,A+4+8为13,A+3+A视为15)。

规则大概

以下规则(软17)和流程视赌场不同而略有区别,请务必了解清楚!

  1. 开局时,庄家(dealer)给每个玩家(又称闲家)牌面向上发两张牌(明牌),再给庄家自己发两张牌,一张明牌,一张暗牌(牌面朝下)。

  2. 当所有的初始牌分发完毕后,如果玩家拿到的是A和T(无论顺序),就拥有黑杰克(Black Jack);

  3. 若庄家的明牌为T,且暗牌为A,应直接翻开并拥有Black Jack;

  4. 如果庄家的明牌为A,则玩家可以考虑买不买保险(Insurance),保险金额是赌注的一半且不退。
    此时,如果庄家的暗牌为10点牌(构成Black Jack),那么翻开此牌,购买保险的玩家得到1倍赌注;
    如果庄家没有Black Jack则保持暗牌,玩家继续游戏。

  5. 若玩家为Black Jack且庄家为其他,玩家赢得1.5倍(或2倍,1赔2时)赌注;

  6. 若庄家为Black Jack且玩家为其他,庄家赢得赌注;

  7. 若庄家和玩家均为Black Jack,平局,玩家拿回自己的赌注。

  8. 接下来是正常的拿牌流程:首名非黑杰克玩家选择拿牌(Hit)、停牌(Stand)、加倍(Double)、分牌(Split,两牌相同时)或投降(Surrender,庄家赢得一半赌注);

  9. 若选择拿牌,则后续只能选择拿牌或停牌。

  10. 在发牌的过程中,如果玩家的牌点数的和超过21,玩家就输了——叫爆掉(Bust),庄家赢得赌注(无论庄家之后的点数是多少)。假如玩家没爆掉,又决定不再要牌了(停牌,或因加倍、投降而终止),则轮到下一名非黑杰克玩家选择。

  11. 当所有玩家停止拿牌后,庄家翻开暗牌,并持续拿牌直至点数不小于17(若有A,按最大而尽量不爆计算)。

  12. 假如庄家爆掉了,那他就输了,玩家赢得1倍赌注;

  13. 否则那么比点数大小,大为赢。

  14. 点数相同为平局,玩家拿回自己的赌注。

应用术语

  1. 黑杰克(BLACK JACK):一手牌内两张牌的点数相加合共达21点(如A牌和一张花牌或10点牌)。
  2. 拿牌(HIT) :再拿一张牌。闲家只要手上牌相加点数小于21点都可要牌。庄家视规则强制拿牌或选择拿牌。
  3. 停牌(STAND) :不再拿牌。在任何情况下,玩家可选择停止要牌。
  4. 分牌(SPLIT):玩家再下一注与原赌注相等的赌金,并将前两张牌分为两副单独的牌。这两张牌的点数必须相同(即一对8、一对K 或一对Q,某些玩法中两张10点的牌如一张10一张Q时也可分牌)。但一般分牌后的黑杰克,只能作普通21点计算,其赔率只是1赔1。分牌后,依次补齐2张,并分别依原规则计算
  5. 双倍下注(DOUBLE) :玩家在拿到前两张牌之后,可以再下一注与原赌注相等的赌金(如果觉得少可以加倍),然后只能再拿一张牌。如果拿到黑杰克,则不许双倍下注。(部分玩法中拿到3张或3张以上也可选择双倍下注,但同样只能再拿一张牌;部分玩法中分牌后仍可双倍下注)
  6. 保险(INSURANCE) :如果庄家牌面朝上的牌是A,玩家可以买保险,也就是相当于原赌注一半的额外赌金。如果玩家确信庄家下一张是10点牌,则可以买保险。如果庄家确实有黑杰克,玩家将赢得2倍的保险赌金;如果庄家没有黑杰克,玩家将输掉保险赌金,游戏照常继续。黑杰克要大于其它总点数为21点的牌。(部分玩法中不允许买保险)
  7. 投降(SURRENDER):如玩家手上只拥有两张牌,便有权选择投降,退回一半的投注金(庄家反开的牌不是A时才适用)(部分玩法中不允许投降)。
  8. 赢局(WIN):玩家将评定为赢如其牌面是黑杰克(庄家不是同时获得黑杰克)、玩家点数较庄家点数接近21点(但不超过21点)、或庄家点数超过21点(玩家点数不超过21点)。
  9. 平局(PUSH):即玩家手上牌的点数与庄家的点数相同,或同是黑杰克的时候,双方便没有输赢,投注金将退回给玩家。
  10. 庄家赢局(LOSE):庄家是黑杰克(但玩家不是同时获得黑杰克)、庄家点数较玩家点数接近21点(但不超过21点)、玩家点数已超过21点(无论庄家点数是否超过21点)。
  11. 赔率:黑杰克1赔2或1赔1.5,保险1赔2,其它为1赔1。

函数编写:

函数功能
Cardset()设置牌堆(生成n套牌,打乱)
Playerset()设置玩家
Hit(name=‘master’)拿牌
Split(name=‘master’)分牌
Double(name)双倍下注
Insurance(name)保险
Surrender(name)投降
Beginning()初始发牌(庄家(明牌,暗牌);玩家2张明牌)
score_master()统计庄家点数
score_player(name)统计玩家点数
Compare(name)玩家与庄家比较点数,并结算
Main()主程序
容器承载数据
DICT(本局记录牌和筹码){ 'master':[ [[明牌],[暗牌]] , [本局筹码得失] ], name1:[ [牌] , [本局筹码得失] ] }
MACRO(宏观记录牌和筹码){ 'master':总筹码 , name1:总筹码 }
ODDS(本局记录赔率){ 'master':赔率 , name1:赔率 }
  • 26
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值