卡牌游戏代码问题:手牌仅显示最后一张牌的价值
解决卡牌游戏手牌总价值统计仅显示最后一张牌的问题
嘿,我看到你在开发卡牌游戏时遇到了手牌价值统计的麻烦——每次调用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
相关产品推荐
相关产品推荐

