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

Blackjack发牌函数单元测试失败问题求助

21点发牌代码问题修复方案

问题背景

需实现以下发牌逻辑:

  • 玩家手牌(player_hand)和庄家手牌(dealer_hand)各发2张牌
  • 发牌顺序为取牌放入player_hand→取牌放入dealer_hand,重复一次
  • 庄家首张牌需面朝下

当前两段单元测试报错,具体信息如下:

测试1(test_deal_cards)报错

False != True
Expected :True
Actual :False
断言dealer_hand[0].is_face_up() is True不成立,实际返回False

测试2(test_deal_cards_alternates_between_player_and_dealer)报错

[7 of Hearts] != [6 of Spades]
预期player_hand[0]为card1([6 of Spades]),实际为[7 of Hearts]


原代码问题分析

while len(dealer_hand) != 2 and len(player_hand) != 2:
        player_card = random.choice(deck)
        player_hand.append(player_card)
        deck.remove(player_card)
        if len(player_hand) == 2:
            player_hand[0].face_up()
            player_hand[1].face_up()
        dealer_card = random.choice(deck)
        dealer_hand.append(dealer_card)
        deck.remove(dealer_card)
        if len(dealer_hand) == 2:
            dealer_hand[0].face_down()
            dealer_hand[1].face_up()

    return player_hand and dealer_hand

存在的问题:

  • 循环条件逻辑不严谨:and条件虽在当前场景下能执行两次循环,但逻辑表述不准确,易引发后续扩展问题
  • 随机取牌破坏测试预期:random.choice()会随机选牌,无法匹配测试用例中固定牌序的要求
  • 牌面状态设置时机滞后:等到手牌凑够2张才统一设置,逻辑冗余且易出现遗漏
  • 返回值错误:player_hand and dealer_hand在Python中仅返回最后一个非空对象,无法正确传递两个手牌

修复后的代码

# 执行两次发牌流程,严格遵循玩家→庄家的顺序
for _ in range(2):
    # 给玩家发牌,按牌堆顺序取牌
    player_card = deck.pop(0)
    player_hand.append(player_card)
    player_card.face_up()  # 玩家牌直接面朝上

    # 给庄家发牌
    dealer_card = deck.pop(0)
    dealer_hand.append(dealer_card)
    # 庄家首张面朝下,第二张面朝上
    if len(dealer_hand) == 1:
        dealer_card.face_down()
    else:
        dealer_card.face_up()

# 返回两个手牌组成的元组
return player_hand, dealer_hand

修复点说明

  • 明确循环次数:用for _ in range(2)替代while循环,确保严格执行两次发牌,完全符合「玩家→庄家」的顺序要求
  • 固定取牌顺序:使用deck.pop(0)按牌堆顺序取牌,完美匹配测试用例的固定牌序预期(若实际需要随机发牌,可在发牌前先执行random.shuffle(deck))
  • 实时设置牌面状态:每发一张牌就设置对应状态,逻辑清晰直观,避免批量设置的潜在问题
  • 修正返回值:返回元组(player_hand, dealer_hand),确保正确传递两个手牌对象

测试报错针对性说明

  1. 测试1:若需求确实要求庄家首张牌面朝下,说明测试用例的断言有误,应修改为dealer_hand[0].is_face_up() is False;若测试期望正确,则将代码中dealer_card.face_down()改为dealer_card.face_up()即可
  2. 测试2:改用顺序取牌后,玩家首张牌即为牌堆的第一张卡片,完全匹配测试预期

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 16:55:20