You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

BlackJack游戏开发疑问:user_score与computer_score为何未累加?

问题分析与修复方案

核心问题:代码缩进错误

你觉得append()没成功添加牌,最关键的原因是**deal_card()函数内部的代码没有正确缩进**。Python是靠缩进区分代码块的,函数定义后,里面的语句必须缩进(通常是4个空格),否则这些代码不属于函数体,调用deal_card()时根本不会执行里面的append逻辑,导致user_cards和computer_cards始终是空列表。

其他问题梳理

除了缩进,代码还有几个影响功能的小问题:

  1. calculate_score()的参数card_list完全没用到,属于冗余代码;
  2. 直接修改全局的cards牌库(把11换成1),会导致后续发牌再也抽不到A(11);
  3. 处理A(11)的逻辑不合理,应该是当总分超过21时才把11转成1,而不是只要有11就转;
  4. 函数内重新定义的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)

修正要点说明

  1. 修复缩进:deal_card()内部的所有代码都缩进4个空格,确保函数调用时能执行发牌逻辑;
  2. 简化循环:用for _ in range(2)替代while循环,减少不必要的变量定义;
  3. 独立计分逻辑:calculate_score()只接收单个玩家的牌列表,返回对应的分数,避免混淆全局变量;
  4. 正确处理A:只有当总分超过21时才将11转为1,且支持处理多张A的情况;
  5. 不修改原始牌库:只修改当前玩家的牌列表,不会影响后续发牌的牌库内容。

内容的提问来源于stack exchange,提问作者SmallCoder12

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 11:35:06