Blackjack游戏compare函数触发异常:仅在用户选择不抽卡时生效
二十一点游戏compare函数触发异常问题
我在做二十一点游戏的编码练习时,编写了用于判定胜负的compare()函数,但目前存在问题:只有当用户选择“不抽卡(n)”时,这个函数才会按预期触发结算。即便用户爆牌(总分>21)、拿到二十一点(总分=0,假设此处0代表Blackjack),或者庄家拿到二十一点,函数也不会立即触发,必须等用户选择不再抽卡才行。
原代码
def compare(user, computer): if user == computer: return "Draw" elif computer == 0: return "You lose" elif user == 0: return "Your win" elif user > 21: return "You lose" elif computer > 21: return "You win" elif computer > user: return "You lose" else: if user > computer: return "You win" game_over = False while not game_over: user_sum = calculate_score(user_cards) computer_sum = calculate_score(computer_cards) print(f"User cards: {user_cards}. Total: {user_sum}") print(f"Computer card: {computer_cards[0]}.") if user_sum == 0 or computer_sum == 0 or user_sum > 21 : game_over = True draw = input("Do you want to draw another card? y or n: ").lower() if draw == 'y': game_over = False user_cards.append(deal_card()) else: game_over = True while computer_sum < 17: computer_cards.append(deal_card()) computer_sum = calculate_score(computer_cards) print(f"User final cards: {user_cards}. Total: {user_sum}") print(f"Computer final cards: {computer_cards}. Total: {computer_sum}") print(compare(user = user_sum, computer = computer_sum))
问题原因
核心逻辑漏洞在于主循环的执行顺序:
- 当检测到用户爆牌、拿到Blackjack或庄家拿到Blackjack时,虽然设置了
game_over=True,但代码依然会继续执行到input()语句,要求用户选择是否抽卡,没有直接进入结算流程。 - 只有当用户选择
n或者循环自然退出后,才会执行庄家补卡和compare()函数调用,导致满足结束条件时无法立即结算。
修复方案
调整主循环逻辑,一旦触发游戏结束条件,直接跳出循环,跳过用户输入步骤:
def compare(user, computer): if user == computer: return "Draw" elif computer == 0: return "You lose" elif user == 0: return "You win" # 修正拼写错误 elif user > 21: return "You lose" elif computer > 21: return "You win" elif computer > user: return "You lose" else: return "You win" # 简化多余的判断分支 game_over = False while not game_over: user_sum = calculate_score(user_cards) computer_sum = calculate_score(computer_cards) print(f"用户手牌: {user_cards}. 总分: {user_sum}") print(f"庄家手牌: {computer_cards[0]}.") # 触发结束条件时直接跳出循环 if user_sum == 0 or computer_sum == 0 or user_sum > 21 : game_over = True break draw = input("是否要再抽一张牌?y或n: ").lower() if draw == 'y': user_cards.append(deal_card()) else: game_over = True # 庄家自动补卡逻辑 while computer_sum < 17: computer_cards.append(deal_card()) computer_sum = calculate_score(computer_cards) print(f"用户最终手牌: {user_cards}. 总分: {user_sum}") print(f"庄家最终手牌: {computer_cards}. 总分: {computer_sum}") print(compare(user=user_sum, computer=computer_sum))
关键修改点
- 在检测到游戏结束条件后添加
break语句,直接终止主循环,跳过后续的用户输入步骤,立即进入结算流程。 - 简化
compare()函数的最后分支:原代码else块内的if user > computer判断多余,直接返回结果即可。 - 修正
compare()函数中的拼写错误("Your win"改为"You win")。 - 将英文提示文本改为中文,提升可读性。
内容的提问来源于stack exchange,提问作者Wally Tan
相关产品推荐
相关产品推荐

