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:若需求确实要求庄家首张牌面朝下,说明测试用例的断言有误,应修改为
dealer_hand[0].is_face_up() is False;若测试期望正确,则将代码中dealer_card.face_down()改为dealer_card.face_up()即可 - 测试2:改用顺序取牌后,玩家首张牌即为牌堆的第一张卡片,完全匹配测试预期
内容的提问来源于stack exchange,提问作者Learning_How_To_Code
相关产品推荐
相关产品推荐

