鱼C论坛

 找回密码
 立即注册
查看: 8412|回复: 4

[技术交流] python小练习(020):python教你怎么玩转21点

[复制链接]
发表于 2016-11-23 15:55:44 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
python小练习(019)讨论了怎么让python自动计算24点,传送门

今天继续来讨论一个牌类游戏--21点。

21点又名黑杰克(英文:Blackjack) ,起源于法国,已流传到世界各地。21点,是一种使用扑克牌玩的赌*博游戏。亦是唯一一种在赌埸中可以在概率中战胜庄家的一种赌*博游戏。

一般规则:
21点一般用到1-8副牌。庄家给每个玩家发两张牌,一张牌面朝上(叫明牌),一张牌面朝下(叫暗牌);给自己发两张牌,一张暗牌,一张明牌。大家手中扑克点数的计算是:K、Q、J 和 10 牌都算作 10 点。A 牌既可算作1 点也可算作11 点,由玩家自己决定。其余所有2 至9 牌均按其原面值计算。首先玩家开始要牌,如果玩家拿到的前两张牌是一张 A 和一张10点牌,就拥有黑杰克(Blackjack);此时,如果庄家没有黑杰克,玩家就能赢得2倍的赌金(1赔2)。如果庄家的明牌有一张A,则玩家可以考虑买不买保险,金额是赌筹的一半。如果庄家是blackjack,那么玩家拿回保险金并且直接获胜;如果庄家没有blackjack则玩家输掉保险继续游戏。没有黑杰克的玩家可以继续拿牌,可以随意要多少张。目的是尽量往21点靠,靠得越近越好,最好就是21点了。在要牌的过程中,如果所有的牌加起来超过21点,玩家就输了--叫爆掉(Bust),游戏也就结束了。假如玩家没爆掉,又决定不再要牌了,这时庄家就把他的那张暗牌打开来。一般到17点或17点以上不再拿牌,但也有可能15到16点甚至12到13点就不再拿牌或者18到19点继续拿牌。假如庄家爆掉了,那他就输了。假如他没爆掉,那么你就与他比点数大小,大为赢。一样的点数为平手,你可以把你的赌注拿回来。

所以其实玩法还是蛮简单的,里面大部分还是凭运气的成分,唯一需要技巧的是要判断什么时候应该停手与庄家比大小,什么时候应该继续叫牌。
我们通过模拟大量随机数的方法来统计概率,可以排除运气成分。那么剩下的什么时候应该停手,什么时候应该叫牌,就是关键因素了。

今天的小练习就让python告诉你,21点应该怎么玩

各位聪明的鱼油,大家也可以动起手来,统计一下应该在大于等于几点的时候停手,小于几点的时候叫牌,胜率最高呢?

评分

参与人数 1鱼币 +5 收起 理由
SixPy + 5 热爱鱼C^_^

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-11-24 06:26:07 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-11-24 12:11 编辑

先贴个统计结果,晚点再贴源代码

捕获.PNG

在小于等于16的时候叫牌,在大于16点的时候停手,对阵各种策略胜率都是最高的,而且都大过50%。

统计的结果和赌场里庄家使用的策略基本是一致的,所以说结果还是有科学依据的。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-11-24 12:04:13 | 显示全部楼层
本帖最后由 jerryxjr1220 于 2016-11-24 14:03 编辑

源代码如下:
  1. from time import time
  2. import random

  3. class blackjack:
  4.     def __init__(self):
  5.         global cards
  6.         self.hands = [cards.pop()%13+1,cards.pop()%13+1]

  7.     def call(self):
  8.         global cards
  9.         self.hands.append(cards.pop()%13+1)

  10.     def calc(self):
  11.         flag = 0
  12.         total = 0
  13.         for each in self.hands:
  14.             if each == 1:
  15.                 flag = 1
  16.             if each >= 10:
  17.                 total += 10
  18.             else:
  19.                 total += each
  20.         if total <= 11 and flag:
  21.             total += 10
  22.         return total

  23. p1,p2 = 0,0
  24. for i in range(100000):
  25.     cards = list(range(1,53))
  26.     random.shuffle(cards)
  27.     player1 = blackjack()
  28.     player2 = blackjack()
  29.     while player1.calc() <= 14:
  30.         player1.call()
  31.     while player2.calc() <= 20:
  32.         player2.call()
  33.     if (player1.calc()<=21 and player1.calc()>player2.calc()) or (player1.calc()<=21 and player2.calc()>21):
  34.         p1 += 1
  35.     if (player2.calc()<=21 and player2.calc()>player1.calc()) or (player2.calc()<=21 and player1.calc()>21):
  36.         p2 += 1
  37. print (p1*100/(p1+p2),p2*100/(p1+p2))
复制代码


每次统计用10万次随机牌局,结果还是比较稳定的。
模拟过程中未考虑black jack直接获胜的情况,并且排除了平局的情况。

捕获.PNG
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-1-25 17:22:32 | 显示全部楼层
如果两边都爆掉了也算平局吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-1-27 17:44:55 From FishC Mobile | 显示全部楼层
JAY饭 发表于 2018-1-25 17:22
如果两边都爆掉了也算平局吗

两方都爆掉没有统计在内可以视作平局,当然在实际比赛中庄家是占优的,你爆掉就先输了,庄家可以不开牌。我这个只是模拟程序。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-26 06:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表