Kaggle Python经典21点问题

在这个问题中,我们将使用简化版的二十一点(又名二十一点)。在这个版本中,有一个玩家(由您控制​​)和一个发牌人。玩法如下:

玩家发到两张正面朝上的牌。发给庄家一张面朝上的牌。
玩家可以根据需要多次要求发另一张牌(“打”)。如果他们的牌点数总和超过 21,他们将立即输掉这一轮。
庄家然后向自己发更多的牌,直到:
庄家手牌总点数超过21点,玩家获胜
庄家的牌点数总和大于或等于17。如果玩家的点数总和大于庄家的点数,则玩家获胜。否则,庄家获胜(即使是平局)。
在计算纸牌总和时,Jack、Queen 和 King (J,Q,K)算作 10。A 可以算作 1 或 11(上面提到玩家的“总数”时,我们指的是不超过 21 的最大总数。因此,例如A + 8 = 19, A + 8+ 8 = 17)

这个题目算是直接接手了每回合判断胜负的过程,根据hand1和hand2的牌值来输出胜负结果

如果hand_1击败hand_2则返回 True,否则返回 False。
    
为了使hand_1击败hand_2必须满足以下条件:
    - hand_1总数不得超过21
    - hand_1总数必须超过hand_2或hand_2总数必须超过21
    
手牌表示为牌列表。每张卡都由一个字符串表示。
    
当一手牌的总和相加时,带有数字的牌算出这么多点。脸
    卡片(“J”、“Q”和“K”)值 10 分。“A”可以算 1 或 11。
    
在确定一手牌的总数时,您应该尝试以以下方式计算 ace
    最大化手牌总数,而不会超过 21。例如,[“A”、“A”、“9”] 的总和为 21 (第一张牌算11,第二张算1), ['A', 'A', '9', '3'] 的总数为 14 (两张都算作1)。

 测试用例:
    >>> blackjack_hand_greater_than(['K'], ['3', '4'])
    True
    >>> blackjack_hand_greater_than(['K'], ['10'])
    False
    >>> blackjack_hand_greater_than(['K', 'K', '2'], ['3'])
    False

def hand_total(hand):
   
    total = 0
    # aces用来算为A的牌
    aces = 0
    for card in hand:
        if card in ['J', 'Q', 'K']:
            total += 10
        elif card == 'A':
            aces += 1
        else:
            # Convert number cards (e.g. '7') to ints
            total += int(card)
    # 这一阶段是通通把A当做1来计算的

    # 然后我们需要把这个值加到总数上,A=1
    total += aces
    # 将王牌A从 1 升到 11,只要它能帮助我们接近 21
    # 要保证不超过21
    while total + 10 <= 21 and aces > 0:
        # Upgrade an ace from 1 to 11
        total += 10
        aces -= 1
    return total

def blackjack_hand_greater_than(hand_1, hand_2):
    total_1 = hand_total(hand_1)
    total_2 = hand_total(hand_2)
    return total_1 <= 21 and (total_1 > total_2 or total_2 > 21)

一个逆向思维的过程,刚一开始做的时候想的比较简单了,我是想把王牌A直接当做11来然后再减去结果遇到不少问题,欢迎有更好算法的朋友可以在评论区留言!!

来源:kaggle python

Learn Python Tutorials

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值