在这个问题中,我们将使用简化版的二十一点(又名二十一点)。在这个版本中,有一个玩家(由您控制)和一个发牌人。玩法如下:
玩家发到两张正面朝上的牌。发给庄家一张面朝上的牌。
玩家可以根据需要多次要求发另一张牌(“打”)。如果他们的牌点数总和超过 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