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

Python二十一点模拟器循环逻辑异常:手牌判断与遍历问题求助

二十一点模拟器代码问题排查

问题背景

我是Python新手,正在运行从网上找到的二十一点模拟器,但部分代码逻辑未达预期,尝试多种写法仍未解决。

相关代码

# deal player to 12 or higher
while sum(player_cards) <= 12:
    exit = False
    player_cards.append(deck.pop(0))
    # check for limit 
    if sum(player_cards) > 21:
        print("--players_cards >21")
        exit = True
        # check for an ace and convert to 1 if found
        for i, card in enumerate(player_cards):
            print("--card " + str(card))
            if card == 11:
                player_cards[i] = 1
                exit = False
            else:
                return -1   
    if exit:
        break   


# deal dealer on soft 17
while sum(dealer_cards) <= 16:
    exit = False
    dealer_cards.append(deck.pop(0))
    # check for limit 
    if sum(dealer_cards) > 21:
        exit = True
        # check for an ace and convert to 1 if found
        for i, card in enumerate(dealer_cards):
            if card == 11:
                dealer_cards[i] = 1
                exit = False
    if exit:
        break

p_sum = sum(player_cards)
d_sum = sum(dealer_cards)

print("player " + str(player_cards) )
print("dealer " + str(dealer_cards) )

异常输出

player [10, 10]
dealer [5, 6, 10]
--players_cards >21
--card 3
player [10, 10]
dealer [10, 9]
--players_cards >21
--card 3
player [7, 10]
dealer [5, 10, 5]

存在的问题

  • 仅当sum(player_cards) >21时才应打印"--players_cards >21",但实际在手牌和为20[10,10]、17[7,10]时触发该打印;
  • for循环应遍历打印玩家手牌的所有数值,却输出了3。尝试改用range(len())写法后结果类似。

问题分析与修复

核心问题根源

玩家手牌处理逻辑中的else: return -1是错误的:只要遍历到非11的牌就直接终止函数,导致后续流程被打断,手牌状态混乱,同时循环只执行一次就退出。

修复后的玩家发牌逻辑

# deal player to 12 or higher
while sum(player_cards) <= 12:
    exit = False
    player_cards.append(deck.pop(0))
    current_sum = sum(player_cards)
    if current_sum > 21:
        print("--players_cards >21")
        exit = True
        # 遍历手牌,将A(11)转换为1
        for i, card in enumerate(player_cards):
            print("--card " + str(card))
            if card == 11:
                player_cards[i] = 1
                exit = False
                # 转换后已无需继续遍历,跳出循环
                break
    if exit:
        break

修复后的庄家发牌逻辑(可选优化)

# deal dealer on soft 17
while sum(dealer_cards) <= 16:
    exit = False
    dealer_cards.append(deck.pop(0))
    current_sum = sum(dealer_cards)
    if current_sum > 21:
        exit = True
        # 遍历手牌,将A(11)转换为1
        for i, card in enumerate(dealer_cards):
            if card == 11:
                dealer_cards[i] = 1
                exit = False
                break
    if exit:
        break

修复说明

  1. 删除了错误的else: return -1,避免函数提前退出,保证循环能正常遍历所有手牌;
  2. 转换A后添加break,避免不必要的遍历,提升效率;
  3. 增加current_sum变量缓存手牌和,避免重复调用sum()函数,优化性能;
  4. 修复后,只有当玩家手牌和真正超过21时才会打印"--players_cards >21",且for循环会遍历打印所有手牌。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.19 23:35:35