Blackjack开发问题:PRNG重复值与player_total函数调用失败
Blackjack游戏问题解决方案
问题1:循环中random.choice始终返回相同值
原因
你仅在代码开头调用一次random.choice(cards)并将结果存入card_value,后续循环全程复用这个固定值,没有重新生成新的随机卡牌。
解决方法
每次需要新增卡牌时,重新调用random.choice(cards)生成新值,而非复用之前的变量。
问题2:player_total函数无法正确统计手牌总分
原因
sum是全局变量,函数内直接修改需声明global sum,否则会被视为局部变量引发错误;- 你仅将函数对象赋值给
adding_players_total,未实际调用函数; player_total函数没有返回计算后的总分,无法获取结果。
解决方法
直接用Python内置的sum()函数计算手牌总分即可,无需自定义循环。如果要保留自定义函数,需让函数返回计算结果,或正确声明全局变量。
修改后的完整代码
import random # 卡牌池 cards = [11, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10, 10] players_cards = [] # 初始化给玩家发两张牌 players_cards.append(random.choice(cards)) players_cards.append(random.choice(cards)) should_continue = True while should_continue: # 直接用sum计算玩家当前总分 player_score = sum(players_cards) # 电脑初始只生成一张牌 computer_cards = [random.choice(cards)] print(f"你的手牌: {players_cards}, 当前得分: {player_score}") print(f"电脑的第一张牌: {computer_cards[0]}") players_choice = input("输入'y'再拿一张牌,输入'n'停止拿牌: ").lower() if players_choice == 'y': # 新增一张随机牌 players_cards.append(random.choice(cards)) # 处理A牌(11转1)的爆牌逻辑 if player_score > 21 and 11 in players_cards: players_cards[players_cards.index(11)] = 1 player_score = sum(players_cards) if player_score > 21: print(f"你的手牌: {players_cards}, 当前得分: {player_score},你爆牌了!") should_continue = False else: should_continue = False
额外优化说明
- 加入Blackjack规则中的A牌转换逻辑,避免手牌含11时误判爆牌;
- 电脑手牌单独生成,避免与玩家手牌共用随机值;
- 移除冗余的
add和player_total函数,用内置sum()简化代码; - 修正循环中
should_continue == True的语法错误(原代码误用比较运算符,改为直接控制布尔值)。
内容的提问来源于stack exchange,提问作者Sonder332
相关产品推荐
相关产品推荐

