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

卡牌游戏代码问题:手牌仅显示最后一张牌的价值

解决卡牌游戏手牌总价值统计仅显示最后一张牌的问题

嘿,我看到你在开发卡牌游戏时遇到了手牌价值统计的麻烦——每次调用cardCount()都只输出最后一张抽到的牌的价值,对吧?这问题的核心出在你对全局变量cardValue的使用方式上,咱们一步步拆解并解决它。

问题根源分析

你的代码里存在两个关键问题:

  • 全局变量被重复覆盖:pickUp()函数每次抽卡时,都会把全局变量cardValue赋值为当前单张牌的价值。当你抽第二张牌时,第一次的cardValue就被完全覆盖了,导致cardCount()只能读取到最后一次赋值的数值。
  • 手牌未存储价值信息:你的yourCards列表只保存了卡牌的名称,没有对应存储每张牌的价值,这让统计总价值时没有可遍历的数据源。

解决方案

我们需要重构抽卡和统计逻辑,去掉容易引发问题的全局变量,同时让手牌列表保存每张牌的价值信息:

1. 提前定义卡牌与价值的映射

首先创建一个字典,把所有卡牌名称映射到对应的价值(Ace先默认按11计算,后续统计时再处理调整逻辑):

import random

# 定义所有卡牌及其对应价值
card_values = {
    "Ace of Hearts": 11,
    "Two of Hearts": 2,
    "Three of Hearts": 3,
    "Four of Hearts": 4,
    "Five of Hearts": 5,
    "Six of Hearts": 6,
    "Seven of Hearts": 7,
    "Eight of Hearts": 8,
    "Nine of Hearts": 9,
    "Ten of Hearts": 10,
    "Jack of Hearts": 10,
    "Queen of Hearts": 10,
    "King of Hearts": 10,
    "Ace of Diamonds": 11,
    "Two of Diamonds": 2,
    # ... 补充剩余方块、梅花、黑桃的卡牌与价值
    "King of Diamonds": 10,
    "Ace of Clubs": 11,
    # ... 补充剩余梅花卡牌与价值
    "King of Clubs": 10,
    "Ace of Spades": 11,
    # ... 补充剩余黑桃卡牌与价值
    "King of Spades": 10
}

# 手牌列表:每个元素是 (卡牌名称, 卡牌价值) 的元组
yourCards = []

2. 修改抽卡函数pickUp()

去掉全局变量cardValue,抽卡时直接把卡牌名称和对应价值存入yourCards:

def pickUp():
    random_num = random.randint(1, 4)
    # 随机选择花色并抽取卡牌
    if random_num == 1:
        selected_card = random.choice(heartsCards)
    elif random_num == 2:
        selected_card = random.choice(diamondsCards)
    elif random_num == 3:
        selected_card = random.choice(clubsCards)
    else:
        selected_card = random.choice(spadesCards)
    # 获取卡牌价值并存入手牌列表
    card_val = card_values[selected_card]
    yourCards.append((selected_card, card_val))
    print(f"抽到卡牌:{selected_card}")

3. 重构价值统计函数cardCount()

遍历yourCards里的所有手牌,累加总价值,同时处理Ace的特殊规则(总价值超过21时,将Ace从11调整为1):

def cardCount():
    total_value = 0
    ace_count = 0
    # 遍历所有手牌,累加价值并统计Ace数量
    for card, val in yourCards:
        total_value += val
        if "Ace" in card:
            ace_count += 1
    # 调整Ace的价值:如果总价值超过21,逐个将Ace的价值从11改为1
    while total_value > 21 and ace_count > 0:
        total_value -= 10
        ace_count -= 1
    print(f"手牌总价值:{total_value}")

测试示例

当你抽取红桃2和黑桃8后,调用cardCount(),就能正确输出总价值10了;如果抽到Ace和King,会先算21,如果再抽一张5,就会把Ace调整为1,总价值变为16。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 08:43:40