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

Blackjack开发问题:PRNG重复值与player_total函数调用失败

Blackjack游戏问题解决方案

问题1:循环中random.choice始终返回相同值

原因

你仅在代码开头调用一次random.choice(cards)并将结果存入card_value,后续循环全程复用这个固定值,没有重新生成新的随机卡牌。

解决方法

每次需要新增卡牌时,重新调用random.choice(cards)生成新值,而非复用之前的变量。


问题2:player_total函数无法正确统计手牌总分

原因

  1. sum是全局变量,函数内直接修改需声明global sum,否则会被视为局部变量引发错误;
  2. 你仅将函数对象赋值给adding_players_total,未实际调用函数;
  3. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 05:57:18