BlackJack游戏开发疑问:user_score与computer_score为何未累加?
问题分析与修复方案
核心问题:代码缩进错误
你觉得append()没成功添加牌,最关键的原因是**deal_card()函数内部的代码没有正确缩进**。Python是靠缩进区分代码块的,函数定义后,里面的语句必须缩进(通常是4个空格),否则这些代码不属于函数体,调用deal_card()时根本不会执行里面的append逻辑,导致user_cards和computer_cards始终是空列表。
其他问题梳理
除了缩进,代码还有几个影响功能的小问题:
calculate_score()的参数card_list完全没用到,属于冗余代码;- 直接修改全局的
cards牌库(把11换成1),会导致后续发牌再也抽不到A(11); - 处理A(11)的逻辑不合理,应该是当总分超过21时才把11转成1,而不是只要有11就转;
- 函数内重新定义的
user_score和computer_score会覆盖全局变量,导致全局变量的值始终为0。
修正后的完整代码
import random # 全局变量存储玩家和电脑的牌 user_cards = [] computer_cards = [] # 牌库(不要随意修改这个列表) cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10] def deal_card(): # 给玩家和电脑各发2张牌,用for循环比while更直观 for _ in range(2): user_cards.append(random.choice(cards)) computer_cards.append(random.choice(cards)) # 打印牌列表,验证是否添加成功 print("玩家当前牌:", user_cards) print("电脑当前牌:", computer_cards) def calculate_score(card_list): score = sum(card_list) # 黑杰克判断:2张牌总分21,返回0代表黑杰克胜利 if score == 21 and len(card_list) == 2: return 0 # 当有A且总分超过21时,把11换成1(处理多张A的情况) while 11 in card_list and score > 21: card_list.remove(11) card_list.append(1) score = sum(card_list) return score # 调用函数执行游戏流程 deal_card() user_score = calculate_score(user_cards) computer_score = calculate_score(computer_cards) print("\n玩家最终得分:", user_score) print("电脑最终得分:", computer_score)
修正要点说明
- 修复缩进:
deal_card()内部的所有代码都缩进4个空格,确保函数调用时能执行发牌逻辑; - 简化循环:用
for _ in range(2)替代while循环,减少不必要的变量定义; - 独立计分逻辑:
calculate_score()只接收单个玩家的牌列表,返回对应的分数,避免混淆全局变量; - 正确处理A:只有当总分超过21时才将11转为1,且支持处理多张A的情况;
- 不修改原始牌库:只修改当前玩家的牌列表,不会影响后续发牌的牌库内容。
内容的提问来源于stack exchange,提问作者SmallCoder12
相关产品推荐
相关产品推荐

