Blackjack程序分数超21时无法将A(11)转为1的问题排查
问题分析与解决方案
你的代码问题出在遍历手牌的方式上:当你用for card in player_hand循环时,card只是列表元素的临时副本,修改card = 1并不会改变player_hand列表里的实际元素,所以重新计算sum(player_hand)时,分数还是原来的数值,手牌也没更新。
修正方案一:通过索引修改列表元素
这种方法会逐个检查手牌,找到第一个值为11的A就将其改为1,适合只需要调整一个A就能让分数回到21以内的场景:
else: player_hand.append(deal_card()) player_score = sum(player_hand) if player_score > 21: # 用索引遍历列表,直接修改对应位置的元素 for i in range(len(player_hand)): if player_hand[i] == 11: player_hand[i] = 1 player_score = sum(player_hand) # 改完一个A后可选择退出循环,避免多次修改(按需调整) break print(player_hand)
修正方案二:生成新列表替换原手牌
这种方法会将手牌中所有值为11的A都转为1,适合需要处理多个A的场景:
else: player_hand.append(deal_card()) player_score = sum(player_hand) if player_score > 21: # 生成新列表,替换所有11为1 player_hand = [1 if card == 11 else card for card in player_hand] player_score = sum(player_hand) print(player_hand)
内容的提问来源于stack exchange,提问作者Cydadel
相关产品推荐
相关产品推荐

